SpringBoot整合poi导出Execl表格

前因

温馨提醒:阅读本文需要6分钟

上个月在开发半藏商城的时候,给个人中心中增加了我的账单页面,展示出用户确认收货后的消费记录,后来看了支付宝的我的账单功能,发现他们支持导出我的账单表格功能,对标支付宝的Execl导出格式开发了专属半藏商城的导出Execl的功能。接下来分享一下我的整个导出Execl的代码流程。

Maven引包

首先进行在pom.xml中进行引包,还在为引哪个版本的包而困扰的同学推荐这个Maven在线查找依赖的网站,想用什么输入搜索,复制过来就可以了。本次需要导入poi,poi-ooxml-schemas以及poi-ooxml。

<!-- poi实现excel导入导出-->
<dependency>
   <groupId>org.apache.poi</groupId>
   <artifactId>poi</artifactId>
   <version>4.0.1</version>
</dependency>
<dependency>
   <groupId>org.apache.poi</groupId>
   <artifactId>poi-ooxml-schemas</artifactId>
   <version>4.0.1</version>
</dependency>
<dependency>
   <groupId>org.apache.poi</groupId>
   <artifactId>poi-ooxml</artifactId>
   <version>4.0.1</version>
</dependency>

导出Execl关键代码

商城中是使用 SXSSFWorkbook 来导出xsls后缀的execl文档。(不过在google浏览器中一直只能导出xsl,其他浏览器都正常导出xsls后缀文档,不过多讲解,主要是分享整个流程是怎么实现的,走过的坑都有哪些)

//导出订单为Excel表格
    @GetMapping("/bill/putExcel")
    public void ordersExcel(HttpServletResponse response, HttpSession httpSession){
        HanZoMallUserVO user = (HanZoMallUserVO) httpSession.getAttribute(Constants.MALL_USER_SESSION_KEY);
        List<HanZoMallOrder> orderListVOS = hanZoMallOrderService.getHanZoMallFinishOrderByUserId(user.getUserId().toString());
        //创建poi导出数据对象
        SXSSFWorkbook sxssfWorkbook = new SXSSFWorkbook();
        //创建sheet页
        SXSSFSheet sheet = sxssfWorkbook.createSheet("我的账单");
        //创建表头one
        SXSSFRow headRowOne = sheet.createRow(0);
        SXSSFRow headRowTwo = sheet.createRow(1);
        SXSSFRow headRowThree = sheet.createRow(2);
        //设置表头oneTwo信息
        headRowOne.createCell(0).setCellValue("半藏商城账单记录明细查询");
        headRowTwo.createCell(0).setCellValue("账号:["+user.getLoginName()+"]");
        headRowThree.createCell(0).setCellValue("---------------------------------账单交易记录明细列表------------------------------------");

        //创建表头
        SXSSFRow headRow = sheet.createRow(3);
        //设置表头信息
        headRow.createCell(0).setCellValue("订单号");
        headRow.createCell(1).setCellValue("交易号");
        headRow.createCell(2).setCellValue("交易创建时间");//可能有多个商品
        headRow.createCell(3).setCellValue("付款时间");
        headRow.createCell(4).setCellValue("最近修改时间");
        headRow.createCell(5).setCellValue("交易来源地");
        headRow.createCell(6).setCellValue("类型");
        headRow.createCell(7).setCellValue("商品名称");
        headRow.createCell(8).setCellValue("金额(元)");
        headRow.createCell(9).setCellValue("交易状态");
        headRow.createCell(10).setCellValue("服务费(元)");
        headRow.createCell(11).setCellValue("成功退款(元)");
        headRow.createCell(12).setCellValue("备注");

        int x= 0; //标识有交易有几行
        int j = 0;//从订单详情表中读取商品名称的标识
        int priceSum =0;//总共支出
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");//不转换Excel时间是数字
        // 遍历上面数据库查到的数据
        for (HanZoMallOrder order : orderListVOS) {
            //填充数据 从第二行开始
            String orderNo = order.getOrderNo();
            int TotalPrice = order.getTotalPrice();
            priceSum +=TotalPrice;
            String payStatus = PayStatusEnum.getPayStatusEnumByStatus(order.getPayStatus()).getName();
            String PayType = PayTypeEnum.getPayTypeEnumByType(order.getPayType()).getName();
            String orderStatus = HanZoMallOrderStatusEnum.getHanZoMallOrderStatusEnumByStatus(order.getOrderStatus()).getName();
            String extraInfo = order.getExtraInfo();
            String patTime = "";
            String createTime = "";
            String goodsNames = "";
            String updateTime = "";
            if (order.getPayTime()!=null && !"".equals(order.getPayTime())){
                patTime = sdf.format(order.getPayTime());
            }else {
                patTime = "无";
            }
            if (order.getCreateTime()!=null && !"".equals(order.getCreateTime())){
                createTime = sdf.format(order.getCreateTime());
            }else {
                createTime = "无";
            }
            if (order.getUpdateTime()!=null && !"".equals(order.getUpdateTime())){
                updateTime = sdf.format(order.getUpdateTime());
            }else {
                updateTime = "无";
            }
            //还需要查tb_xxx_mall_order_item表读取订单所包含的商品名称 可能有多个
            List<HanZoMallOrderItemVO> orderItems = hanZoMallOrderService.getOrderItems(orderListVOS.get(j).getOrderId());
            if (orderItems!=null){
                StringBuffer sb = new StringBuffer();
                for (int k=0;k<orderItems.size();k++){
                    sb.append(orderItems.get(k).getGoodsName() + " x " +orderItems.get(k).getGoodsCount()+" ");
                }
                goodsNames = sb.toString();

            }
            SXSSFRow dataRow = sheet.createRow(sheet.getLastRowNum() + 1);
            //开始填充
            dataRow.createCell(0).setCellValue(orderNo);
            dataRow.createCell(1).setCellValue(extraInfo);
            dataRow.createCell(2).setCellValue(createTime);
            dataRow.createCell(3).setCellValue(patTime);
            dataRow.createCell(4).setCellValue(updateTime);
            dataRow.createCell(5).setCellValue(PayType);
            dataRow.createCell(6).setCellValue(payStatus);
            dataRow.createCell(7).setCellValue(goodsNames);
            dataRow.createCell(8).setCellValue(TotalPrice);
            dataRow.createCell(9).setCellValue(orderStatus);
            dataRow.createCell(10).setCellValue(0);
            dataRow.createCell(11).setCellValue(0);
            dataRow.createCell(12).setCellValue("");
            x++;//序号自增
            j++;//查tb_xxx_mall_order_item 根据的orderId自增
        }

        //创建表头four five six
        SXSSFRow headRowFour = sheet.createRow(sheet.getLastRowNum() + 1);
        SXSSFRow headRowFive = sheet.createRow(sheet.getLastRowNum() + 1);
        SXSSFRow headRowSix = sheet.createRow(sheet.getLastRowNum() + 1);
        SXSSFRow headRowSeven = sheet.createRow(sheet.getLastRowNum() + 1);
        //设置表尾信息
        headRowFour.createCell(0).setCellValue("------------------------------------------------------------------------------------");
        headRowFive.createCell(0).setCellValue("共"+x+"笔交易");
        headRowSix.createCell(0).setCellValue("已支出"+priceSum+"元");
        headRowSeven.createCell(0).setCellValue("导出时间["+sdf.format(new Date().getTime())+"]   用户:"+user.getNickName());
        try {
            // 下载导出
            String filename = "半藏商城账单交易明细";
            //filename = URLEncoder.encode(filename, "UTF-8");
            try {
                //避免文件名中文乱码,将UTF8打散重组成ISO-8859-1编码方式
                filename = new String (filename.getBytes("UTF8"),"ISO-8859-1");
            } catch (UnsupportedEncodingException e) {
                e.printStackTrace();
            }
            // 设置头信息
            response.setCharacterEncoding("UTF-8");
            response.setContentType("application/vnd.ms-excel");
            //让浏览器下载文件,name是上述默认文件下载名
            response.setHeader("Content-Disposition", "attachment;filename=" + filename+ ".xlsx");
            //创建一个输出流
            ServletOutputStream outputStream = response.getOutputStream();
            //写入数据
            sxssfWorkbook.write(outputStream);
            // 关闭
            outputStream.close();
            sxssfWorkbook.close();
        }catch (IOException e){
            log.error("导出我的账单报表出错");
            e.printStackTrace();
        }
    }

实现结果图片示例

QQ截图20200414003646.jpg
QQ截图20200414003839.jpg

小结

到此为止,整个导出Execl表格流程就介绍完毕了,知识只有分享出来才有价值。如果有问题的话,可以在关于我的页面,通过我的邮箱联系我进行探讨。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: Spring Boot整合POI可以实现Excel文件的导出。具体步骤如下: 1. 添加POI依赖 在pom.xml文件中添加POI的依赖: ``` <dependency> <groupId>org.apache.poi</groupId> <artifactId>poi</artifactId> <version>4.1.2</version> </dependency> ``` 2. 创建Excel文件 使用POI创建Excel文件,可以使用HSSFWorkbook或XSSFWorkbook类。HSSFWorkbook适用于xls格式的Excel文件,XSSFWorkbook适用于xlsx格式的Excel文件。 ``` // 创建HSSFWorkbook对象 HSSFWorkbook workbook = new HSSFWorkbook(); // 创建sheet HSSFSheet sheet = workbook.createSheet("Sheet1"); // 创建行 HSSFRow row = sheet.createRow(); // 创建单元格 HSSFCell cell = row.createCell(); // 设置单元格的值 cell.setCellValue("Hello World"); ``` 3. 导出Excel文件 使用HttpServletResponse将Excel文件输出到浏览器。 ``` // 设置响应头 response.setContentType("application/vnd.ms-excel"); response.setHeader("Content-Disposition", "attachment;filename=test.xls"); // 输出Excel文件 workbook.write(response.getOutputStream()); ``` 完整的代码示例: ``` @GetMapping("/export") public void export(HttpServletResponse response) throws IOException { // 创建HSSFWorkbook对象 HSSFWorkbook workbook = new HSSFWorkbook(); // 创建sheet HSSFSheet sheet = workbook.createSheet("Sheet1"); // 创建行 HSSFRow row = sheet.createRow(); // 创建单元格 HSSFCell cell = row.createCell(); // 设置单元格的值 cell.setCellValue("Hello World"); // 设置响应头 response.setContentType("application/vnd.ms-excel"); response.setHeader("Content-Disposition", "attachment;filename=test.xls"); // 输出Excel文件 workbook.write(response.getOutputStream()); } ``` ### 回答2: Spring BootSpring框架的一个轻量级解决方案。它的特点是简单易用、快速开发、集成度高。POI是Apache软件基金会的一个开源项目,用于支持在Java平台上处理Microsoft Office文件格式。Spring BootPOI的结合,使得在开发导出Excel文件的功能时,能够更加方便快捷,大幅降低开发难度。 整合POI导出Excel的过程中,在pom.xml文件中添加POI的依赖,然后创建一个ExcelUtil工具类。这个ExcelUtil工具类主要包含以下功能: 1. 创建工作簿(Workbook)对象 2. 创建工作表(Sheet)对象 3. 创建行(Row)对象 4. 创建单元格(Cell)对象 5. 对单元格进行赋值 6. 设置格式 其次,在需要导出Excel文件的Controller中,创建相应的方法。这个方法主要包含以下步骤: 1. 获得数据 2. 调用ExcelUtil工具类,创建工作簿对象 3. 调用ExcelUtil工具类,创建工作表对象 4. 循环遍历数据,创建行和单元格对象,并对单元格进行赋值 5. 调用ExcelUtil工具类,将工作簿写入输出流中 6. 设置响应头,告知浏览器当前响应的文件类型 7. 将响应输出流写到浏览器中 最后,访问这个Controller的对应地址即可下载导出Excel文件。 总体来说,springboot整合poi导出excel的过程比较简单,只需要按照上述步骤完成即可。这种方式不仅可以用于导出简单的Excel文件,还适用于更复杂的数据格式,提高了开发效率,方便了数据的导出和共享。 ### 回答3: 近年来,随着企业信息化建设的日益推进,导出Excel文件已经成为了不少企业常用的统计工具之一。而Spring Boot是一个非常流行的开发框架,它本身提供了很多优秀的功能和工具,如何在Spring Boot框架中集成Poi组件,实现Excel导出功能,是一个非常值得探讨的话题。 Poi是Apache软件基金会的开源项目,可以用于处理各种Office文档格式,包括Word、Excel和PowerPoint等。它提供了很多接口和实现类,可以方便地完成Excel文件的读写操作。下面我们就来看一下Spring Boot如何整合Poi实现Excel导出的功能。 1. 添加Poi依赖 首先,在项目的pom.xml文件中,添加Poi的依赖: ``` <dependency> <groupId>org.apache.poi</groupId> <artifactId>poi</artifactId> <version>3.17</version> </dependency> <dependency> <groupId>org.apache.poi</groupId> <artifactId>poi-ooxml</artifactId> <version>3.17</version> </dependency> ``` 这里使用的是Poi的3.17版本,也可以根据自己的需要选择其他版本。 2. 创建导出Excel的工具类 在Spring Boot项目中,可以创建一个导出Excel的工具类,用于完成Excel文件的生成和导出。下面给出一个简单的示例: ``` public class ExcelUtil { /** * 导出Excel文件 * @param dataList 导出数据列表 * @param headers Excel表头 * @param fileName 导出文件名 * @param response 响应对象 */ public static void export(List<Map<String, Object>> dataList, String[] headers, String fileName, HttpServletResponse response) throws Exception { // 创建Excel工作簿 Workbook workbook = new XSSFWorkbook(); // 创建Excel表格 Sheet sheet = workbook.createSheet(); // 创建表头行并写入数据 Row headerRow = sheet.createRow(0); for(int i = 0; i < headers.length; i++) { headerRow.createCell(i).setCellValue(headers[i]); } // 写入数据行 int currentRow = 1; for(Map<String, Object> data : dataList) { Row row = sheet.createRow(currentRow++); for(int i = 0; i < headers.length; i++) { Object value = data.get(headers[i]); if(value != null) { if(value instanceof Date) { row.createCell(i).setCellValue((Date)value); } else { row.createCell(i).setCellValue(value.toString()); } } else { row.createCell(i).setCellValue(""); } } } // 设置响应头信息 response.setContentType("application/octet-stream;charset=UTF-8"); response.setHeader("Content-Disposition", "attachment;filename=" + URLEncoder.encode(fileName, "UTF-8")); // 将Excel文件写入响应输出流中 OutputStream outputStream = response.getOutputStream(); workbook.write(outputStream); outputStream.flush(); outputStream.close(); } } ``` 这里使用了Poi中的XSSFWorkbook和Sheet等类,实现了Excel文件的创建和写入操作。同时,还通过HttpServletResponse对象向浏览器发送了响应头信息和Excel文件数据。 3. 调用导出Excel的方法 在Spring Boot项目中,只需要在Controller中调用ExcelUtil的export方法,即可实现Excel导出功能。下面给出一个简单的示例: ``` @RestController public class ExcelController { /** * 导出Excel文件 * @param response 响应对象 */ @GetMapping("/excel") public void exportExcel(HttpServletResponse response) throws Exception { List<Map<String, Object>> dataList = new ArrayList<>(); Map<String, Object> data1 = new HashMap<>(); data1.put("id", 1); data1.put("name", "张三"); data1.put("gender", "男"); data1.put("birthday", new Date()); dataList.add(data1); Map<String, Object> data2 = new HashMap<>(); data2.put("id", 2); data2.put("name", "李四"); data2.put("gender", "女"); data2.put("birthday", new Date()); dataList.add(data2); String[] headers = {"id", "name", "gender", "birthday"}; ExcelUtil.export(dataList, headers, "data.xlsx", response); } } ``` 这里在Controller中创建了一个Excel文件导出的请求处理方法,在方法中调用了ExcelUtil的export方法,传入数据列表、表头和文件名等参数。 总结 通过以上步骤的操作,我们就可以在Spring Boot项目中集成Poi组件,实现Excel文件的导出功能了。当然,在实际应用中,还可能需要对Excel样式、单元格格式等进行调整,使得导出Excel文件更符合自己的需求。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值