需求:
将订单信息导出到excel中,存在excel模板,需要向其中添加数据。
技术选型:
对于excel操作,使用apache poi包。到maven repository找poi最新的发行包。
搜索poi,可以看到有两个poi和poi-ooxml
百度搜索了一下对这两个包的解释:还有一点就是poi也有两个不同的jar包,分别是处理excel2003和excel2007+的,对应的是poi和poi-ooxml。毕竟poi-ooxml是poi的升级版本,处理的单页数据量也是百万级别的,所以我们选择的也是poi-ooxml。
将依赖粘贴到pom中
<!-- https://mvnrepository.com/artifact/org.apache.poi/poi-ooxml -->
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi-ooxml</artifactId>
<version>3.17</version>
</dependency>
实现:
好长时间不写excel处理了第一反应就是找找有没有现成的直接copy过来用,但是copy了好几个都有问题,读取不到excel中的数据,获取到的sheet中的row为null。百度不出来直接去官方看看教程,最简单有效的教程就是quick start。
打开官网没有找到document 和 quick start 但是也找到了相关的标签
进来之后找到了quick 手册
进来看了下目录找到读取文件的教程,其实一进来也没有很快看到,因为知道对于高版本excel的操作使用XSSFWorkbook,直接Ctrl+f搜索这个,
可以看到介绍,获取workbook对象可以通过文件,或者流的方式,通过文件可以减小内存的使用,因为使用流需要缓存所有内容,那就使用文件吧。
// XSSFWorkbook, File
OPCPackage pkg = OPCPackage.open(new File("file.xlsx"));
XSSFWorkbook wb = new XSSFWorkbook(pkg);
....
pkg.close();
使用这个写个demo
@RequestMapping("/download")
public void downloadFile(HttpServletRequest request, HttpServletResponse response) throws Exception {
OPCPackage pkg = OPCPackage.open(new File("F:\\Open Source Project\\zlxs\\2.xlsx"));
XSSFWorkbook wb = new XSSFWorkbook(pkg);
XSSFSheet xssfSheet = wb.getSheetAt(0);
XSSFRow xssfRow = xssfSheet.getRow(2);
XSSFCell xssfCell = xssfRow.getCell(2);
xssfCell.setCellValue("试一试导出模板数据");
String fileName = "中文.xlsx";
response.setContentType("application/octet-stream");
response.setHeader("name", fileName);
response.setHeader("Cache-Control", "must-revalidate, post-check=0, pre-check=0");
response.setHeader("Pragma", "public");
response.setDateHeader("Expires", 0);
response.setHeader("Content-disposition","attachment; filename=\""+ URLEncoder.encode(fileName, "UTF-8")+ "\"");
ServletOutputStream out = response.getOutputStream()
wb.write(out); // 输出流控制workbook
out.flush();
out.close();
pkg.close();
}
测试用过,可以正确读取文件并将相应位置赋值。
对于poi api具体使用以后再整理,现在已经够用了。
补充:
//如果这行没有了,整个公式都不会有自动计算的效果的
sheet.setForceFormulaRecalculation(true);