数据库数据按指定格式导出到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);//设置一下第一列的高度,因为要加载图片,所以高度设置的大了写。// 将图片传入ExcleString path = this.getServletContext().getRealPath("/");FileInputStream fis = new FileInputStream(path + "common/images/pm_logo.png");byte[] imgBytes = new byte[fis.available()];// 添加图片字节数据到工作簿对象中,addPicture方法第一个参数是图片字节数组,第二个是图片类型,我的图片是.pngint 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 =