您的位置:首页 > Web前端 > HTML

jxl从html中的table中导出数据到execl

2014-05-14 11:47 302 查看
第一步:js从table中拿到数据传回服务器处理
function createJson(tag){
var name = ["cardId","name","roomId","roomName","startTime","endTime"];
var array = new Array();
var tr = $(tag+" tr");
for(var i=0;i<tr.length-1;i++){
var td = $(tr.get(i)).find("td");
var json = {};
for(var j=0;j<td.length;j++){
json[name[j]] = $(td.get(j)).text();
}
array[i] = json;
}
return array;
}

$(function(){
var ctx = '${ctx}';
$("#daochu").click(function(){
var array = createJson("#infoTable");

for(var i=0;i<array.length;i++){
if(i==array.length-1){
array[i]["last"] = 1;
}
$.ajax({
type: "POST",
async:false,  // 设置同步方式
url: ctx+"/data/toExel.action",
data:array[i],
success:function(data){
if(data==1){
location.href=ctx+"/data/dowload.action";
}
}
});
}
});

});
页面内容:



第二步:将ajax传来的数据通过jxl转换成InputStream,见ToExelAction.java中的execute方法和ToExelUtil1.java

ToExelAction.java

package neu.qinfang.action.data.sxqin;

import java.io.InputStream;
import java.util.ArrayList;
import java.util.List;

import com.opensymphony.xwork2.Action;
import com.opensymphony.xwork2.ModelDriven;

import neu.qinfang.action.BaseAction;
import neu.qinfang.pojo.Demo;
import neu.qinfang.pojo.Manageteacher;
import neu.qinfang.util.ToExelUtil1;

public class ToExelAction extends BaseAction implements ModelDriven<Object>{

private static final long serialVersionUID = -8659819060990529242L;

private Demo demo = new Demo();
private int flag = 0;
private static List<Demo> demos = new ArrayList<Demo>();
private static InputStream inputStream;
public Demo getDemo() {
return demo;
}

public void setDemo(Demo demo) {
this.demo = demo;
}

public int getFlag() {
return flag;
}

public void setFlag(int flag) {
this.flag = flag;
}

public String execute() throws Exception{
demos.add(demo);
if(demo.getLast()==1){
String[] titleName = {"卡号","姓名","房间号","房间名","开始时间","结束时间"};
String[] proName = {"cardId","name","roomId","roomName","startTime","endTime"};
int[] size = {10,10,10,10,20,20};
inputStream = ToExelUtil1.writeExcel(demos,titleName,proName,size);
flag = 1;
demos.removeAll(demos);
}

return Action.SUCCESS;
}

private String filename;

public String () throws Exception {

return Action.SUCCESS;
}

public InputStream getInputStream() throws Exception {
Manageteacher mt = (Manageteacher) session1.getAttribute("manageteacher");
filename = mt.getManageTeaNo()+".xls";
return inputStream;
}

/**
* @return the filename
*/
public String getFilename() {
return filename;
}

/**
* @param filename
* the filename to set
*/
public void setFilename(String filename) {
this.filename = filename;
}

/**
* @param directory
* the directory to set
*/

public Object getModel() {
return demo;
}

}


ToExelUtil1.java

package neu.qinfang.util;
import java.beans.IntrospectionException;
import java.beans.PropertyDescriptor;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.lang.reflect.Field;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.util.List;

import jxl.Workbook;
import jxl.format.UnderlineStyle;
import jxl.write.Label;
import jxl.write.WritableCellFormat;
import jxl.write.WritableFont;
import jxl.write.WritableSheet;
import jxl.write.WritableWorkbook;
import jxl.write.WriteException;
import jxl.write.biff.RowsExceededException;

public class ToExelUtil1 {
/**
参数说明
re:实体类组成的list数组
titleName:导出的exel的表头的名字组成的数组
proName:你需要导出到exel中的实体类的属性,主要要和titleName顺序一致
size:exel每一列的长度
*/
public static InputStream writeExcel(List re,
String[] titleName,String[] proName,int[] size){
Workbook wb = null;
WritableWorkbook wwb = null;
WritableSheet ws = null;
ByteArrayOutputStream os = new ByteArrayOutputStream();
try {

//首先要使用Workbook类的工厂方法创建一个可写入的工作薄(Workbook)对象

wwb = Workbook.createWorkbook(os);

//如果文件不存在则创建一个可写入的工作表
//Workbook的createSheet方法有两个参数,第一个是工作表的名称,第二个是工作表在工作薄中的位置
ws = wwb.createSheet("sheet1", 0);
WritableFont titleFont = new WritableFont(WritableFont.ARIAL, 15, WritableFont.BOLD, false, UnderlineStyle.NO_UNDERLINE, jxl.format.Colour.BLACK);
WritableCellFormat titleFormat = new WritableCellFormat (titleFont);
Label label = new Label(0,0,"序号",titleFormat);
ws.addCell(label);
for(int i=1;i<=titleName.length;i++){
label = new Label(i,0,titleName[i-1],titleFormat);
ws.addCell(label);
}
int column=0;
ws.setColumnView(column++, 10);
for(int i=1;i<size.length;i++){
ws.setColumnView(column++, size[i-1]);
}

}catch (RowsExceededException e) {
e.printStackTrace();
} catch (WriteException e) {
e.printStackTrace();
}catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
if(wwb!=null){
//下面开始添加单元格
for(int i=0;i<re.size();i++){
int row = wwb.getSheet(0).getRows();
addLabel(ws,re.get(i),row,proName);
}

try {
//从内存中写入文件中
wwb.write();
//关闭资源,释放内存
wwb.close();
} catch (IOException e) {
e.printStackTrace();
} catch (WriteException e) {
e.printStackTrace();
}
}
return new ByteArrayInputStream(os.toByteArray());
}
private static void addLabel(WritableSheet ws,Object obj,int row,String[] proName) {
Class type = obj.getClass();
Field[]fields = type.getDeclaredFields();
try{
Label label = new Label(0,row,row+"");
ws.addCell(label);
for(int i=1;i<=proName.length;i++){
String proType = "";
String str = "";
PropertyDescriptor descriptor = new PropertyDescriptor(proName[i-1],type);
Method getMethod = descriptor.getReadMethod();
for(int j=0;j<fields.length;j++){

String fname = fields[j].getName();
if(proName[i-1].equals(fname)){
proType = fields[j].getType().toString();
if("class java.sql.Timestamp".equals(proType)){
String s = getMethod.invoke(obj).toString();
str = s.substring(0,19);
}else{
str = getMethod.invoke(obj).toString();
}
}
}
label = new Label(i, row, str);
ws.addCell(label);

}
}catch (IllegalArgumentException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
} catch (InvocationTargetException e) {
e.printStackTrace();
} catch (RowsExceededException e) {
e.printStackTrace();
} catch (WriteException e) {
e.printStackTrace();
} catch (IntrospectionException e1) {
e1.printStackTrace();
}

}

}

第三步:下载上面生成的InputStream到本地代码见上面ToExelAction.java的dowload()和getInputStream()以及struts配置文件

<!-- 导出数据到exel -->
<action name="toExel" class="neu.qinfang.action.data.sxqin.ToExelAction">
<result type="json">
<param name="root">flag</param>
</result>
</action>

<action name="dowload" class="neu.qinfang.action.data.sxqin.ToExelAction" method="dowload">
<result name="success" type="stream">
<!-- 指定下载文件的内容类型,text/plain是默认类型 -->
<param name="contentType">application/excel</param>
<!-- inputName默认值是inputStream,如果action中用于读取下载文件内容的属性名是inputStream,那么可以省略这个参数 -->
<param name="inputName">inputStream</param>
<!--动态获取文件名,从Action中的取得filename-->
<param name="contentDisposition">
attachment;filename="${filename}"
</param>
<param name="bufferSize">2048</param>
</result>
</action>

最后导出的execl文件



搞定,这是花了好几天的成果!哎,技术还是不够成熟啊!希望多多交流!
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  js jxl