POI导出Excel的两种方法
目前我只会这两种,以后掌握其他的方法再更新。
(关于页面如何调用后台)
1 var url = '你的后台路径'; 2 $('<form method="post" action="' + url + '"></form>').appendTo('body').submit().remove();
第一种:用代码画出Excel,再导出。
优点:没啥优点;
缺点:
1、代码量大,难于维护。稍微改动一个地方就要更改很多代码,所谓牵一发而动全身。
2、样式难以控制,像哪里需要加粗、哪里需要背景色之类的,是比较难描述的。
操作步骤:
1、POM中添加POI的依赖,如图:
2、创建Workbook对象,为其开辟堆栈内存,代码:
Workbook workbook = new XSSFWorkbook();
3、创建表单,表单可以创建多个,这里只创建一个表单,代码:
Sheet sheet = workbook.createSheet();
4、给表单设置名字,以下代码中第一个参数是指第几个表单的意思,如果你创建了两个表单,现在要给第二个表单设置名字,那么第一个参数应该设置为1,因为索引都是从0开始计算的。我们现在给第一个表单设置名字,代码:
workbook.setSheetName(0, "给我一个名字吧");// 表单名
5、创建行,我们这里以表头示例,因为所有行的创建方法都是一样的。参数代表创建第几行,我们这里创建第一行,参数给0,同样是因为索引都是从0开始计算。代码:
Row headRow = sheet.createRow(0);//创建第一行
6、创建单元格,这里只创建一个单元格,因为所有单元格的创建方法都是一样的,只是给的参数不同而已。代码:
Cell headCell = headRow.createCell(0);//创建第一行的第一个单元格
7、给单元格设置样式,代码:
CellStyle headCellStyle = workbook.createCellStyle();//创建单元格样式对象 Font font = workbook.createFont(); font.setBold(true);// 是否加粗 font.setFontHeightInPoints((short)14);// 字体大小 cellStyle.setFont(font); cellStyle.setAlignment(HorizontalAlignment.CENTER);// 水平居中 cellStyle.setVerticalAlignment(VerticalAlignment.CENTER);// 垂直居中 headCell.setCellStyle(headCellStyle );//把设置好的样式对象给单元格
8、给单元格插入值,代码:
headCell.setCellValue("单元格的内容");
9、设置列宽,代码:
sheet.setColumnWidth(1, headCell.getStringCellValue().getBytes().length * 256);// 设置列宽
sheet.createFreezePane(3, 4); // 冻结第四行第三列
10、合并单元格,这里我要在第一行合并9个单元格,所以代码如下:
sheet.addMergedRegion(new CellRangeAddress(0, 0, 0, 8));// 合并表头 四个参数按顺序释义分别为:要合并的开始行索引、结束行索引、开始列索引、结束列索引
11、设置行高,代码:
headRow.setHeightInPoints((2 * sheet.getDefaultRowHeightInPoints()));// 设置行高度
12、以上11个步骤是最基本的excel表单创建、行创建、单元格创建、合并、插入值等方法,具体要画成什么模样,使用上面的方法随意发挥即可。接下来讲如何写入流并在浏览器中提示下载:
1 try { 2 Workbook workbook = new XSSFWorkbook(); 3 //省略Excel的绘制步骤 这些步骤就是以上11个步骤 4 File file = new File(System.getProperty("java.io.tmpdir") + File.separator + "文件名" + ".xlsx");// 提示下载文件 5 OutputStream out = new FileOutputStream(file); 6 workbook.write(out); 7 out.flush(); 8 out.close(); 9 HttpHeaders headers = new HttpHeaders(); 10 headers.setContentType(MediaType.APPLICATION_OCTET_STREAM); 11 headers.setContentDispositionFormData("attachment",StringUtils.newStringIso8859_1(StringUtils.getBytesUtf8(file.getName())))); 12 return new ResponseEntity<byte[]>(Files.toByteArray(file),headers, HttpStatus.CREATED); 13 } catch (FileNotFoundException e) { 14 e.printStackTrace(); 15 } catch (IOException e) { 16 e.printStackTrace(); 17 }
13、浏览器提示信息如下(这里用的谷歌浏览器导出):
14、至此方法一分享完毕。
第二种:使用模板导出Excel。
优点:
1、表单样式都是模板提供的,不需要自己去调整。就算要修改样式,使用微软工具或者WPS修改后再替换项目中的模板即可,不需要代码控制。
2、不用手动画表格之类的,代码精简,可以把更多的精力用于数据填充上。
缺点:目前没发现。
操作步骤:
1、POM中添加POI的依赖,如图:
2、把需要导出的Excel文件模板放在web项目下,如图:
3、获取模板文件,并根据业务需求重命名文件名,代码:
1 String path = ActionUtil.getRequest().getServletContext().getRealPath("/");// 拿到模板文件 2 String filePath = path + "excelTemplate\\模板文件名.xlsx"; 3 FileInputStream tps = new FileInputStream(new File(filePath)); 4 File file = new File(System.getProperty("java.io.tmpdir") + File.separator + "重新设置的文件名"+ ".xlsx");// 提示下载文件 5 OutputStream out = new FileOutputStream(file);
4、见代码:
XSSFWorkbook workbook = new XSSFWorkbook();// 新建一个Excel的工作空间 workbook = new XSSFWorkbook(tps);// 把模板复制到新建的Excel
5、给表单填充数据,这里我们给第一个表单填充数据,代码:
1 Sheet sheet = workbook.getSheetAt(0);//拿到第一个表单 2 Row row_01 = sheet.getRow(1);//拿到第一行 3 row_01.getCell(1).setCellValue("我是有内容的单元格了");//给第一行第二个单元格插入值
6、数据填充方法如同步骤5,根据需要给不同的行和单元格插入数据即可。接下来开始输出并生成Excel文件,代码:
1 workbook.write(out); 2 out.flush(); 3 out.close(); 4 HttpHeaders headers = new HttpHeaders(); 5 headers.setContentType(MediaType.APPLICATION_OCTET_STREAM); 6 headers.setContentDispositionFormData("attachment",StringUtils.newStringIso8859_1(StringUtils.getBytesUtf8(file.getName())))); 7 return new ResponseEntity<byte[]>(Files.toByteArray(file),headers, HttpStatus.CREATED);
7、步骤6的代码需要处理异常,这个大家应该都知道怎么处理吧!不知道的话看方法一的步骤12。浏览器的下载提示和方法一的步骤13所示是一样的。至此方法二分享完毕。
怎么样?整体看下来是不是方法二更加简单呢?反正我个人是偏向于方法二的!关于POI的相关API网址我在这里分享给大家,毕竟短短一篇博客不可能涵盖所有的API方法的。
关于POI的更多探索,请参阅官网API:http://poi.apache.org/components/spreadsheet/quick-guide.html