数据库数据按指定格式导出到Excel

数据库数据按指定格式导出到Excel


一.博客目的:
工作需要做一个关于列表打印的功能,不适用第三方,有图片,又表体,表格上下有额外的信息,表格行数不确定,多的时候可能上万行。第一次通过画jsp使用ie浏览器的window.print进行打印。
这样一次只能打印当前显示的页面,数据量过大,分页会出现断层,然后自己使用js做了一个分页,基本功能已经实现,但是还存在一个问题,如果数据量上万条,分页分了一百多页,一页一页的打印,是不是想想都比较恐怖。
所以经过综合考虑,决定将数据导出到Excel,通过excel进行打印,别说,效果出奇的好,而且不用考虑分页。讲此实现记录下来方便自己回顾。
二.使用技术:
通过poi组件操作Excel。
三.详细的做法:
首先要搭建poi环境,也就是下载jar包,我是在csdn上下别人分享的,poi 3.7 beta2,所以就不附链接了,地球人都能找到。
页面就加了一个按钮,将后台需要的传了过去,师太是使用servlet写的。

  • 倒入的类
    下面先列出项目用到的类,下次导的时候分不清可以做参考:
    import org.apache.poi.hssf.usermodel.HSSFCell;
    import org.apache.poi.hssf.usermodel.HSSFCellStyle;
    import org.apache.poi.hssf.usermodel.HSSFClientAnchor;
    import org.apache.poi.hssf.usermodel.HSSFFont;
    import org.apache.poi.hssf.usermodel.HSSFPatriarch;
    import org.apache.poi.hssf.usermodel.HSSFRow;
    import org.apache.poi.hssf.usermodel.HSSFSheet;
    import org.apache.poi.hssf.usermodel.HSSFWorkbook;
    import org.apache.poi.hssf.util.HSSFColor;
    import org.apache.poi.hssf.util.Region;
  • 设计思路
    思路很简单,短短几句话就能概括:创建sheet页,创建行,创建单元格向单元格set内容,设计样式。
    这样问题就很简单了,就那其中的行举例说明:行通过什么创建,方法是什么,创建的行要多高,边框怎么设置。其他的也都这样思考,挨着考虑完,基本写的过程就出来了。、
  • 使用到的方法
    创建Excel工作簿对象:createSheet();
    设置工作簿名字:setSheetName(int sheetIx, “名字”);
    创建行:.createRow(int n),创建第n行;
    设置行高:row.setHeightInPoints(int n);
    合并单元格:addMergedRegion(new Region(1, (short) 0, 1, (short) cellNum));1,3,参数是行,2,4,参数是列;
    加载图片
    workbook.addPicture(Byte[] imgBytes, workbook.PICTURE_TYPE_PNG);第一个参数是图片的字节数组,第二个是图片类型;
    创建绘制图片区域
    HSSFClientAnchor anchoranchor = new HSSFClientAnchor(int x1, int y1, int x2, int y2, (short) col1, row1, (short) col2, row 2)
    x1,y1是图片区域左上角的位置,x2,y2是右下角位置,row1和row2是区域上方和下方所在行,col1,col2是取悦左右所在列;
    创建用于绘画的对象:createDrawingPatriarch();
    将图片画到Excel指定区域:createPicture(anchor, pacIndex);
    创建单元格:createCell(int n);n为第几个单元格
    给单元格set值:setCellValue();方法里可以传不同的数据类型
    设置单元格样式:setCellStyle();

  • 代码实现(为了我以后看起来方便,所以代码全罗列,别人看的时候可以跳着看,代码考下来改一下可以直接使用)

//。。。。。。。查询数据省略。。。。。。
private void jxlBuildExcel(Map installMap, String policyNo, String riskCode,HttpServletResponse response) throws IOException {


    HSSFWorkbook workbook = new HSSFWorkbook();
    // 使用HSSFWorkbook对象创建Excel工作簿对象
    HSSFSheet sheet = workbook.createSheet();
    // 可以设置一个工作表名称,也就是excel打开后下方sheet页的名字
    workbook.setSheetName(0, policyNo);
    //因为我要做五个模板,所以我先定义一个变量cellNum 设置列数
    int cellNum = 16;
        if ("1113".equals(riskCode)) {
            cellNum = 16;
        } else if ("1152".equals(riskCode)) {
            cellNum = 17;
        } else if ("1177".equals(riskCode)) {
            if(maxCount == 0){
                cellNum = 15;
            }else{
                cellNum = 19;
            }
        } else if ("1164".equals(riskCode)) {
            cellNum = 16;
        } else {
            if(maxCount == 0){
                cellNum = 12;
            }else{
                cellNum = 17;
            }
        }
        // 在工作表里创建对象,第一行放图片,位置中心,每个模板列不同,每个列的宽度不一样,所以画图区域的自己慢慢调。
        HSSFRow row1 = sheet.createRow(0);
        row1.setHeightInPoints(60);//设置一下第一列的高度,因为要加载图片,所以高度设置的大了写。
        // 将图片传入Excle
        String path = this.getServletContext().getRealPath("/");
        FileInputStream fis = new FileInputStream(path + "common/images/pm_logo.png");
        byte[] imgBytes = new byte[fis.available()];
        // 添加图片字节数据到工作簿对象中,addPicture方法第一个参数是图片字节数组,第二个是图片类型,我的图片是.png
        int pacIndex = workbook.addPicture(imgBytes, workbook.PICTURE_TYPE_PNG);
        //此处创建画图区域
        HSSFClientAnchor anchor;
        //图片的区域根据实际列数来确定大小
        if ("1113".equals(riskCode)) {
            anchor = new HSSFClientAnchor(100, 30, 900, 200, (short) 7, 0, (short) 11, 0);
        } else if ("1152".equals(riskCode)) {
            anchor = 
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值