今天是第一次开始写自己的博客,学习之路漫长而遥远,我认为很有必要将自己所学所感记录下来。以前都是喜欢保存好资源和文件,后来发现保存的这些资源和文件时间一久,文件多而且杂,想知道自己当时那个问题的解决办法在哪里好难找的到。可能是印象不深,所以觉得真的应该记录下来。----------------------------------2016年12月19日09:41:02
导出Excel表
项目是采用的ssh框架搭建的,页面已经有一个查询的功能的表单,需要新增一个导出的功能,这就意味着一个表单需要进行重复提交,分两个按钮提交表单只能到一个方法里面去,查询功能是分页查询的,得到的记录也是分页的数据,导出就必须重新在后台获取全部的数据,而且页面获取查询条件的查询数据的session里的值,所以必然会导致二次查询的结果其实是上一次的查询结果,也就是说只能先查询后导出,先导出就会导出的上一次查询结果。解决这个问题也是想了很多办法来解决它。首先我想到就是使用ajax,让导出功能异步直接提交到另一个导出功能的action方法中,但是到获取数据都没问题,写表格的时候却出现了问题。ajax只能返回字符串到页面,而不能返回数据流到页面下载,所以只好放弃了。
换一个想法来解决,通过增加一项隐藏标签 给出flag值来标明是否从查询的action中转入导出功能的action,每次导出完成将标签初始化,完美解决。
重点记录一下导出Excel表的方法:
首先必须导入jxl.jar包到项目文件,这个包就是用来绘制表格的工具包。
request.setCharacterEncoding("gb2312");
response.setContentType("text/html; charset=gb2312");
response.setHeader("Content-disposition", "attachment; filename="+new SimpleDateFormat("yyyyMMdd").format(new Date())+new String("入库登记表".getBytes("gbk"), "iso8859-1")+".xls");//设置导出后的文件名称
response.setContentType("application/vnd.ms-excel");//设置导出后的文件格式
List<TwoTccForce> rkdjList = tccforceDAO.findMsgExport(hphm,koucode, facode, part,
begindate, enddate);//从后台数据库中获取记录数据
OutputStream output=response.getOutputStream();//创建文件输出流
WritableWorkbook book=Workbook.createWorkbook(output);//创建一个工作薄,就是一个表格工作区
WritableSheet sheet=book.createSheet(new SimpleDateFormat("yyyy-MM-dd").format(new Date()), 0);//创建一行
WritableFont bwfc= new WritableFont(WritableFont.ARIAL, 20,WritableFont.BOLD, false, UnderlineStyle.NO_UNDERLINE, Colour.BLACK);//设置字体大小,对齐放方式,是否加粗,下划线等
WritableCellFormat bwcfFC=new WritableCellFormat(bwfc);
bwcfFC.setAlignment(jxl.format.Alignment.CENTRE);
sheet.setColumnView(0, 30);//设置具体列的宽度
sheet.setColumnView(1, 25);
sheet.setColumnView(2, 15);
sheet.setColumnView(3, 15);
sheet.setColumnView(4, 25);
sheet.setColumnView(5, 10);
sheet.setColumnView(6, 15);
sheet.setColumnView(7, 20);
sheet.setColumnView(8, 15);
String s1[]=begindate.split("-");
String s2[]=enddate.split("-");
String titleStr=s1[0]+"年"+s1[1]+"月"+s1[2]+"日-"+s2[0]+"年"+s2[1]+"月"+s2[2]+"日车辆入库登记信息";
Label title=new Label(0,0,titleStr,bwcfFC);
sheet.addCell(title);//设置表中首行标题的名称
//
sheet.mergeCells(0, 0, 8, 0);//设置列名
Label lable1=new Label(0,1,"***");//给出单元格的具体坐标
Label lable2=new Label(1,1,"***");
Label lable3=new Label(2,1,"***");
Label lable4=new Label(3,1,"***");
Label lable5=new Label(4,1,"***");
Label lable6=new Label(5,1,"***");
Label lable7=new Label(6,1,"***");
Label lable8=new Label(7,1,"***");
Label lable9=new Label(8,1,"***");
sheet.addCell(lable1);//将单元格加入到具体位置
sheet.addCell(lable2);
sheet.addCell(lable3);
sheet.addCell(lable4);
sheet.addCell(lable5);
sheet.addCell(lable6);
sheet.addCell(lable7);
sheet.addCell(lable8);
sheet.addCell(lable9);
WritableFont wfc = new WritableFont(WritableFont.ARIAL, 10,WritableFont.NO_BOLD, false, UnderlineStyle.NO_UNDERLINE, Colour.BLACK);//设置表内容字体情况
WritableCellFormat wcfFC = new WritableCellFormat(wfc);
wcfFC.setAlignment(jxl.format.Alignment.LEFT);//�
wcfFC.setVerticalAlignment(jxl.format.VerticalAlignment.CENTRE);//
wcfFC.setWrap(true);//
for(int j=0;j<rkdjList.size();j++){
TwoTccForce diary=rkdjList.get(j);//将每条记录循环输出,取出每个字段放入相应的列下面
Label alabe0=new Label(0,j+2,diary.getLsh()+"",wcfFC);
Label alabe1=new Label(1,j+2,diary.getKcdh(),wcfFC);
Label alabe2=new Label(2,j+2,diary.getNr(),wcfFC);
Label alabe3=new Label(3,j+2,diary.getHphm(),wcfFC);
Label alabe4=new Label(4,j+2,diary.getFdjh(),wcfFC);
Label alabe5=new Label(5,j+2,diary.getKcsj().toString(),wcfFC);
Label alabe6=new Label(6,j+2,diary.getKcdd(),wcfFC);
Label alabe7=new Label(7,j+2,diary.getLrsj().toString(),wcfFC);
Label alabe8=new Label(8,j+2,diary.getLrrname(),wcfFC);
sheet.addCell(alabe0);
sheet.addCell(alabe1);
sheet.addCell(alabe2);
sheet.addCell(alabe3);
sheet.addCell(alabe4);
sheet.addCell(alabe5);
sheet.addCell(alabe6);
sheet.addCell(alabe7);
sheet.addCell(alabe8);
}
book.write();
book.close();
output.close();
this.actionForward = null; //结束
导出报表功能并不复杂,上述代码部分省略的,我们只需要了解如何创建和获取数据就行了。