Java项目中将记录导出到Excel表格的操作

  今天是第一次开始写自己的博客,学习之路漫长而遥远,我认为很有必要将自己所学所感记录下来。以前都是喜欢保存好资源和文件,后来发现保存的这些资源和文件时间一久,文件多而且杂,想知道自己当时那个问题的解决办法在哪里好难找的到。可能是印象不深,所以觉得真的应该记录下来。----------------------------------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; //结束
     导出报表功能并不复杂,上述代码部分省略的,我们只需要了解如何创建和获取数据就行了。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Symoons

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值