本文主要讲的是怎么使用java将数据导出为excel文件,xls格式的。
例如:我从前台查询到的数据,要把数据进行导出为excl格式的文件。需要将前台的查询条件(数据)传递到后台,后台拿到数据,写sql,从数据库中进行查询;得到数据(跟前台查询到的数据一致,这里我演示的查询出来的数据为一个list对象集合),再生成excl文件(数据在文件里面,文件名称,位置,内容,都可更改)。
第一步:后台得到前台查询条件并查询出数据(这个步骤没啥要写的)
1.后台得到前台页面的数据。你可以使用json传递值,也可以用url传递。你想用哪个就用哪个。毕竟达者为先
json传递值例子:(写的例子,可能跟后面数据对不上,但是意思对就行了)
var data = $("#fromid").serializeobject();//表单变为json格式字符串 //没有form表单的可以自己认为创建一个json字符串 //var data = jquery.parsejson('{"fphm":null,"fdbh":null}'); data["fphm"]=fphms;//页面的查询条件,将data传递到后台 data["fdbh"]=_fdbh; $.ajax({ beforesend: function(xhr){ xhr.setrequestheader('authorization', 'bearer ' + $.session.get("token")); }, url: "",//你的url type: "post", contenttype: 'application/json;charset=utf-8', datatype: "json", data: json.stringify(data),//传递格式为json格式 success: function(data){ $.messager.alert("提示","成功"+data,"info"); }, async: true, error: function(er) {} });
url传递,(这个就简单了,就是平常的url,就是给后面组装上参数和对应的数据,本文主要不是讲传递,只是一个演示例子)
例子:
function clickdown(){//这里演示传递两个参数 var prntetest=document.getelementbyid("prnte").value; var prntename=document.getelementbyid("prntename").value; location.href='url?prntetest='+prntetest+'&prntename='+prntename; }
2.得到数据库中的查询数据(这个也不是太重要,也简单写了)
这个就是sql语句了,这个怎么演示呀,就是sql呗,你们想要生成什么数据,就sql查呗。
我主要不是为了怎么解析json格式数据,我使用的url传递数据使用
string name = request.getparameter("name");
这种格式得到数据,
如果为json格式传递到后台,数据形如
{ "name": 3,"post": 1 , "rows": [{"jlbh":30005,"hth":40200,"wldw":"0316","name":"深圳市控股公司", "dtid":585,"dt_name":"珠宝采购","fkje":234.0}]}
可以使用下面的进行解析
jsonobject jsonobj = jsonobject.fromobject(data);stringname =jsonobj.getparameter("name");
如果上面方法不能够解析json格式字符串,可自行百度。网上不少正解(毕竟本文主要讲的不是这个)。
得到数据之后,组装sql语句,在数据库中查询即可,这里不演示怎么查询的,结果为一个list集合里面存放着要导出的数据
第二步:生成excel文件
根据前台得到的条件,从数据库中得到数据,导出的表头
/** * 测试 导出xls文件的表头 */ public static final string[] testtoxls = { "编号","设计人员工号", "设计人员姓名","开发人员工号", "开发人员姓名", "测试人员工号", "测试人员姓名"};
其中list存放的是一个对象,类似javabean:
list<test> listtest = new arraylist<test>();
形如:
public class test{ private string idd;//编号 private string designid;//设计人员工号 private string designname;//设计人员姓名 private string developid;//开发人员工号 private string developname;//开发人员姓名 private string testid;//测试人员工号 private string testname;//测试人员姓名 //对应的set,get 省略}
我使用的是mybatis,其中有一个resulttype,为返回类型。
形如:
<select id="findalluser"parametertype="java.util.map"resulttype="com.test.test" > select pr.qid as idd,--这里的as 后跟的, pr.des_id as designid, pr.des_name as designname, pr.de_id as developid, pr.de_name as developname, ps.te_id as testid, ps.te_name as testname from ps_test_red pr left join ps_test_em ps on ps.id=pr.sys_id where pr.par_nme_te > #{prnte}--组装sql语句,查询出数据</select>
导出文件方法
public void toexcel() { //这里为导出文件存放的路径 string filepath ="c:\\users\\user" + uuid.randomuuid() + "\\"; //加入一个uuid随机数是因为 //每次导出的时候,如果文件存在了,会将其覆盖掉,这里是保存所有的文件 file file = new file(filepath); if (!file.exists()) { file.mkdirs(); } simpledateformat fmt = new simpledateformat("yyyy-mm-dd"); // 给要导出的文件起名为 "测试导出数据表_时间.xls" string filepath2 = filepath + "测试导出数据表" + "_" + fmt.format(new date()) + ".xls"; writableworkbook wb = null; try { file file2 = new file(filepath2); if (!file2.exists()) {//不存在,创建 file2.createnewfile(); } wb = workbook.createworkbook(file2);//创建xls表格文件 // 表头显示 writablecellformat wcf = new writablecellformat(); wcf.setalignment(alignment.centre);// 水平居中 wcf.setwrap(true); wcf.setverticalalignment(verticalalignment.centre);// 垂直居中 wcf.setfont(new writablefont(writablefont.times,13, writablefont.bold));// 表头字体 加粗 13号 wcf.setbackground(jxl.format.colour.periwinkle); // 内容显示 writablecellformat wcf2 = new writablecellformat(); wcf2.setwrap(true);//设置单元格可以换行 wcf2.setalignment(alignment.centre);//水平居中 wcf2.setverticalalignment(verticalalignment.centre);// 垂直居中 wcf2.setfont( new writablefont(writablefont.times,11));// 内容字体 11号 //导出的xls的第一页,第二页就是0换成1,“sheet1”,也可以修改为自己想要的显示的内容 writablesheet ws = wb.createsheet("sheet1", 0); //writablesheet ws2 = wb.createsheet("sheet2", 1);//第2个sheet页 ws.addcell(new label(0,0, "导出结果"));//代表着表格中第一列的第一行显示查询结果几个字 // 导出时生成表头 for (int i = 0; i < testtoxls.length; i++) { //i,代表的第几列,1,代表第2行,第三个参数为要显示的内容,第四个参数,为内容格式设置(按照wcf的格式显示) ws.addcell(new label(i, 1, testtoxls[i],wcf));//在sheet1中循环加入表头 } //查询出来的数据,这个方法是演示所用 string sql="com.test.service.findalluser";//sql为mybatis框架下的路径 map<string, object> map = new hashmap<string, object>();//map里为存放前台的条件 map.put("prnte", this.getparameter("prntetest")); list<test> listtest = testservice.findalllist(sql, map); int k =2 ;//从第三行开始写入数据 for (int i = 0; i < listtest.size(); i++) { ws.addcell(new label(0, k, listtest.get(i).getidd(), wcf2)); ws.addcell(new label(1, k, listtest.get(i).getdesignid(),wcf2)); ws.addcell(new label(2, k, listtest.get(i).getdesignname(),wcf2)); ws.addcell(new label(3, k, listtest.get(i).getdevelopid(),wcf2)); ws.addcell(new label(4, k, listtest.get(i).getdevelopname(),wcf2)); ws.addcell(new label(5, k, listtest.get(i).gettestid(),wcf2)); ws.addcell(new label(6, k, listtest.get(i).gettestname(),wcf2)); //ws.mergecells(4, 5, 5, 5);//合并两列,按参数顺序,意思是第4列的第五行,跟第五列的第五行合并为一个单元格 k++; } wb.write();//写入,到这里已经生成完成,可以在相应目录下找到刚才生成的文件 } catch (ioexception e) { e.printstacktrace(); } catch (jxlwriteexception e) { e.printstacktrace(); } catch (writeexception e) { e.printstacktrace(); } finally { try { if (wb != null) { wb.close(); } } catch (writeexception e) { e.printstacktrace(); } catch (ioexception e) { e.printstacktrace(); } } //这个是我们项目中,是把刚才生成的文件,响应到前台,进行下载、保存,可省略。 downloadfile(filepath2);}
响应到前台(就是读取文件,网上很多)
public void downloadfile(string filepath) { fileinputstream in = null; servletoutputstream out = null; bufferedoutputstream toout = null; try { in = new fileinputstream(new file(filepath)); byte[] buffer = new byte[in.available()]; while (in.read(buffer) != -1) { httpservletresponse response = this.getcontext().getresponse();//从application中得到response response.reset();// 清空 // 设置响应的文件的头文件格式 response.setcontenttype("application/octet-stream"); response.setheader("content-disposition", "attachment;filename="+ new string(filename.getbytes("gbk"),"iso8859-1")); response.addheader("content-type", "application-download"); // 获取响应的对象流 out = response.getoutputstream(); toout = new bufferedoutputstream(out); toout.write(buffer); toout.flush(); } } catch (exception e) { e.printstacktrace(); } finally { try { if(in!=null) { in.close(); } if(out != null) { out.close(); } if(toout != null) { toout.close(); } } catch (ioexception e) { e.printstacktrace(); } }}
导出文件大致为:
以上就是如何使用java将数据导出为excel文件的详细内容。
