Apache POl的使用(导出报表)

打印 上一主题 下一主题

主题 972|帖子 972|积分 2916

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?立即注册

x
介绍

Apache POl是一个处理Miscrosoft Office各种文件格式的开源项目。简朴来说就是,我们可以使用 PO! 在 Java 程序中对Miscrosoft Office各种文件进行读写操纵。一般情况下,POI都是用于操纵 Excel 文件。
Apache POl的应用场景:


  • 银行网银系统导出生意业务明细
  • 各种业务系统导出Excel报表
  • 批量导入业务数据
 导入maven坐标
  1.    <!-- poi -->
  2.             <dependency>
  3.                 <groupId>org.apache.poi</groupId>
  4.                 <artifactId>poi</artifactId>
  5.                 <version>${poi}</version>
  6.             </dependency>
  7.             <dependency>
  8.                 <groupId>org.apache.poi</groupId>
  9.                 <artifactId>poi-ooxml</artifactId>
  10.                 <version>${poi}</version>
  11.             </dependency>
复制代码
写操纵 
  1.     /**
  2.      * 通过POI创建Excle文件
  3.      */
  4.     @Test
  5.     public void write() throws Exception{
  6.         //在内存中创建一个excle文件
  7.         XSSFWorkbook excel=new XSSFWorkbook();
  8.         //在excel文件中创建一个sheet页
  9.         XSSFSheet sheet = excel.createSheet("info");
  10.         //创建行对象,rownum编号从0开始
  11.         XSSFRow row = sheet.createRow(1);
  12.         //在行上创建单元格
  13.         row.createCell(1).setCellValue("姓名");
  14.         row.createCell(2).setCellValue("宁波");
  15.         //创建一个新行
  16.          row=  sheet.createRow(2);
  17.         //在行上创建单元格
  18.         row.createCell(1).setCellValue("张三");
  19.         row.createCell(2).setCellValue("上海");
  20.         //创建一个新行
  21.         row=  sheet.createRow(3);
  22.         //在行上创建单元格
  23.         row.createCell(1).setCellValue("李四");
  24.         row.createCell(2).setCellValue("杭州");
  25.        FileOutputStream out= new FileOutputStream(new File("D:\\BaiduNetdiskDownload\\cangqiong\\ziliao\\ziliao\\day12\\test.xlsx"));
  26.         excel.write(out);
  27.         //关闭资源
  28.         out.close();
  29.         excel.close();
  30.     }
复制代码
 

 读操纵
  1. @Test
  2.     public void read() throws Exception{
  3.         //输入流,读取磁盘上已经存在的excle文件
  4.         InputStream in=new FileInputStream(new File("D:\\BaiduNetdiskDownload\\cangqiong\\ziliao\\ziliao\\day12\\test.xlsx"));
  5.         XSSFWorkbook excle =new XSSFWorkbook(in);
  6.         //读取文件中第一个sheet页
  7.         XSSFSheet sheet = excle.getSheetAt(0);
  8.         //获得sheet中最后一行行号
  9.         int lastRowNum = sheet.getLastRowNum();
  10.         for(int i=1;i<lastRowNum;i++){
  11.             //获得某一行
  12.             XSSFRow row=sheet.getRow(i);
  13.             //获得单元格对象
  14.             String cellValue1 = row.getCell(1).getStringCellValue();
  15.             String cellValue2 = row.getCell(2).getStringCellValue();
  16.             out.println(cellValue1+""+cellValue2);
  17.         }
  18.         //关闭资源
  19.         in.close();
  20.         excle.close();
  21.     }
复制代码

代码开辟

实现步骤:

  • 设计Excel模板文件
  • 查询近30天的运营数据
  • 将查询到的运营数据写入模板文件
  • 通过输出流将Excel文件下载到客户端浏览器

 

 ReportController
  1.     /**
  2.      * 报表统计
  3.      *
  4.      */
  5.     @GetMapping("/export")
  6.     @ApiOperation("导出运营数据报表")
  7.     public void export(HttpServletResponse response){
  8.        reportService.exportBusinessData(response);
  9.     }
复制代码
ServiceImpl
  1.     /**
  2.      * 导出运营数据报表
  3.      *
  4.      * @param response
  5.      */
  6.     @Override
  7.     public void exportBusinessData(HttpServletResponse response) {
  8.         //1查询数据库,获取营业数据
  9.         LocalDate dateBegin = LocalDate.now().minusDays(30);
  10.         //前一天
  11.         LocalDate dateEnd = LocalDate.now().minusDays(1);
  12.         //查询概览数据
  13.         BusinessDataVO businessDataVO = workspaceService.getBusinessData(LocalDateTime.of(dateBegin, LocalTime.MIN), LocalDateTime.of(dateEnd, LocalTime.MAX));
  14.         //2.通过poi将数据写入到excel中
  15.         InputStream in = this.getClass().getClassLoader().getResourceAsStream("template/运营数据报表模板.xlsx");
  16.         //基于模板文件创建一个新的文件
  17.         try {
  18.             XSSFWorkbook excel = new XSSFWorkbook(in);
  19.             //获取表格文件sheet标签页
  20.             XSSFSheet sheet = excel.getSheet("Sheet1");
  21.             //填充数据--时间
  22.             sheet.getRow(1).getCell(1).setCellValue("时间:" + dateBegin + "至" + dateEnd);
  23.             XSSFRow row = sheet.getRow(3);
  24.             row.getCell(2).setCellValue(businessDataVO.getTurnover());
  25.             row.getCell(4).setCellValue(businessDataVO.getOrderCompletionRate());
  26.             row.getCell(6).setCellValue(businessDataVO.getNewUsers());
  27.             //获得第五行
  28.             row = sheet.getRow(4);
  29.             row.getCell(2).setCellValue(businessDataVO.getValidOrderCount());
  30.             row.getCell(4).setCellValue(businessDataVO.getUnitPrice());
  31.             //填充明细数据
  32.             for (int i=0;i<30;i++){
  33.                 LocalDate date=dateBegin.plusDays(i);
  34.                 BusinessDataVO businessData = workspaceService.getBusinessData(LocalDateTime.of(date, LocalTime.MIN), LocalDateTime.of(date, LocalTime.MAX));
  35.                 row= sheet.getRow(7+i);
  36.                 row.getCell(1).setCellValue(date.toString());
  37.                 row.getCell(2).setCellValue(businessData.getTurnover());
  38.                 row.getCell(3).setCellValue(businessData.getValidOrderCount());
  39.                 row.getCell(4).setCellValue(businessData.getOrderCompletionRate());
  40.                 row.getCell(5).setCellValue(businessData.getUnitPrice());
  41.                 row.getCell(6).setCellValue(businessData.getNewUsers());
  42.             }
  43.             //3通过输出流将excel文件下载到客户端浏览器
  44.             ServletOutputStream out = response.getOutputStream();
  45.             excel.write(out);
  46.             //关闭资源
  47.             out.close();
  48.             excel.close();
  49.         } catch (IOException e) {
  50.             throw new RuntimeException(e);
  51.         }
  52.     }
  53. }
复制代码

完结!

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

写过一篇

金牌会员
这个人很懒什么都没写!
快速回复 返回顶部 返回列表