spring mvc 读取excel模板填充数据下载

需求:

    将订单信息导出到excel中,存在excel模板,需要向其中添加数据。

技术选型:

    对于excel操作,使用apache poi包。到maven repository找poi最新的发行包。

154154_hqk2_3714931.png

搜索poi,可以看到有两个poi和poi-ooxml

154654_XsMp_3714931.png

百度搜索了一下对这两个包的解释:还有一点就是poi也有两个不同的jar包,分别是处理excel2003和excel2007+的,对应的是poi和poi-ooxml。毕竟poi-ooxml是poi的升级版本,处理的单页数据量也是百万级别的,所以我们选择的也是poi-ooxml。

154747_Y9jl_3714931.png

将依赖粘贴到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 但是也找到了相关的标签

155423_9dz4_3714931.png

进来之后找到了quick 手册

155507_1jb6_3714931.png

进来看了下目录找到读取文件的教程,其实一进来也没有很快看到,因为知道对于高版本excel的操作使用XSSFWorkbook,直接Ctrl+f搜索这个,

155606_IY5U_3714931.png

155925_yXt2_3714931.png

可以看到介绍,获取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);

 

转载于:https://my.oschina.net/u/3714931/blog/1603031

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值