当前位置:   article > 正文

Apache POI 在java中处理excel

Apache POI 在java中处理excel

介绍:

Apache POI 是一个处理Miscrosoft Office各种文件格式的开源项目。简单来说就是,我们可以使用 POI Java 程序中对Miscrosoft Office各种文件进行读写操作。

一般情况下,POI 都是用于操作 Excel 文件。

如何使用:

1.maven坐标引入

  1. <dependency>
  2. <groupId>org.apache.poi</groupId>
  3. <artifactId>poi</artifactId>
  4. <version>3.16</version>
  5. </dependency>
  6. <dependency>
  7. <groupId>org.apache.poi</groupId>
  8. <artifactId>poi-ooxml</artifactId>
  9. <version>3.16</version>
  10. </dependency>

2.通过入门案例的方式了解代码,代码里面的方法都比较见名知意,就不一 一列举了,主要的逻辑就是用过文件流的方式写入或者写出,然后作为参数,调用excel对象的方法

将创建的excel对象写到磁盘中

  1. public static void write() throws Exception {
  2. //在内存中创建一个Excel对象
  3. XSSFWorkbook excel = new XSSFWorkbook();
  4. //创建sheet页
  5. XSSFSheet sheet = excel.createSheet("sheet");
  6. //在sheet页中创建行,0表示第一行
  7. XSSFRow row = sheet.createRow(0);
  8. //创建单元格,并为单元格设置值,单元格索引也是从0开始
  9. row.createCell(0).setCellValue("姓名");
  10. row.createCell(1).setCellValue("年龄");
  11. //第二行
  12. XSSFRow row1 = sheet.createRow(1);
  13. row1.createCell(0).setCellValue("张三");
  14. row1.createCell(1).setCellValue("20");
  15. //将excel写入磁盘中
  16. FileOutputStream fileOutputStream = new FileOutputStream(new File("D:\\liyuzhe.xlsx"));
  17. excel.write(fileOutputStream);
  18. //关闭资源
  19. fileOutputStream.flush();
  20. fileOutputStream.close();
  21. excel.close();
  22. }

将磁盘中的excel文件读取出来:

  1. /**
  2. * 使用poi读取excel中的内容
  3. */
  4. public static void read() throws Exception {
  5. //创建一个输入流
  6. InputStream in = new FileInputStream(new File("D:\\liyuzhe.xlsx"));
  7. //创建excel对象
  8. XSSFWorkbook excel = new XSSFWorkbook(in);
  9. //读取excel文件中的第一个sheet页
  10. XSSFSheet sheet = excel.getSheetAt(0);
  11. //获取sheet中最后一行的行号,获取带有文字的最后一行
  12. int lastRowNum = sheet.getLastRowNum();
  13. for (int i = 0; i <= lastRowNum; i++) {
  14. //获得某一行
  15. XSSFRow row = sheet.getRow(i);
  16. //获得单元格对象
  17. String cell1 = row.getCell(0).getStringCellValue();
  18. String cell2 = row.getCell(1).getStringCellValue();
  19. //将单元格内容输出
  20. System.out.println(cell1 + " " +cell2);
  21. }
  22. //关闭资源
  23. in.close();
  24. excel.close();
  25. }

main函数:

  1. public static void main(String[] args) throws Exception {
  2. //write();
  3. read();
  4. }

在项目中的使用:

一般在项目中,前端编辑的页面会有一个交互的按钮,点击后交互到后端,后端将excel模板文件内的内容进行填充,然后通过浏览器进行下载,下载到磁盘

例如:

点击后会通过浏览器下载一个excel文件

后端代码:

controller层:

service层:

  1. /**
  2. * 导出数据报表
  3. *
  4. * @param httpServletResponse
  5. */
  6. @Override
  7. public void exportBusiness(HttpServletResponse httpServletResponse) {
  8. //1.查询数据库,获取营业数据 -- 查询最近30天的运营数据
  9. LocalDate dateBegin = LocalDate.now().minusDays(30);//30天前
  10. LocalDate dateEnd = LocalDate.now().minusDays(1);//昨天
  11. //查询概览数据
  12. BusinessDataVO businessDataVO = workspaceService.getBusinessData(LocalDateTime.of(dateBegin, LocalTime.MIN), LocalDateTime.of(dateEnd, LocalTime.MAX));
  13. //2.通过poi将数据写入到excel表格中
  14. //获取resources中的excel模板
  15. /*InputStream in = this.getClass().getClassLoader().getResourceAsStream("template/运营数据报表模板.xlsx");*/
  16. InputStream in = ClassLoader.getSystemResourceAsStream("template/运营数据报表模板.xlsx");
  17. try {
  18. //基于模板文件创建一个新的excel文件
  19. XSSFWorkbook excel = new XSSFWorkbook(in);
  20. //填充数据 --时间
  21. XSSFSheet sheet = excel.getSheet("Sheet1");
  22. sheet.getRow(1).getCell(1).setCellValue("时间" + dateBegin + "至" + dateEnd);
  23. //获得第四行,将数据部分填充
  24. XSSFRow row = sheet.getRow(3);
  25. row.getCell(2).setCellValue(businessDataVO.getTurnover());
  26. row.getCell(4).setCellValue(businessDataVO.getOrderCompletionRate());
  27. row.getCell(6).setCellValue(businessDataVO.getNewUsers());
  28. //获得第五行,将数据部分填充
  29. row = sheet.getRow(4);
  30. row.getCell(2).setCellValue(businessDataVO.getValidOrderCount());
  31. row.getCell(4).setCellValue(businessDataVO.getUnitPrice());
  32. //填充明细数据,遍历30天的明细数据,所以只需要小于30即可
  33. for (int i = 0; i < 30; i++) {
  34. LocalDate date = dateBegin.plusDays(i);//从30天前开始遍历
  35. //查询某一天的营业数据
  36. BusinessDataVO businessData = workspaceService.getBusinessData(LocalDateTime.of(date, LocalTime.MIN), LocalDateTime.of(date, LocalTime.MAX));
  37. //获取第8行,后面的行依次遍历
  38. row = sheet.getRow(7 + i);
  39. //为行上的单元格进行数据填充
  40. row.getCell(1).setCellValue(date.toString());//日期
  41. row.getCell(2).setCellValue(businessData.getTurnover());//营业额
  42. row.getCell(3).setCellValue(businessData.getValidOrderCount());//有效订单
  43. row.getCell(4).setCellValue(businessData.getOrderCompletionRate());//订单完成率
  44. row.getCell(5).setCellValue(businessData.getUnitPrice());//平均客单价
  45. row.getCell(6).setCellValue(businessData.getNewUsers());//新增用户数
  46. }
  47. //3.通过输出流将excel文件下载到客户端浏览器
  48. ServletOutputStream outputStream = httpServletResponse.getOutputStream();
  49. excel.write(outputStream);
  50. } catch (IOException e) {
  51. e.printStackTrace();
  52. }
  53. }

最终会把文件写入到浏览器中进行下载

:例如此种页面较为复杂的excel模板不会再java中处理,一般都是自己再磁盘创建好一个excel,在java中读入使用即可

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/我家小花儿/article/detail/530128
推荐阅读
相关标签
  

闽ICP备14008679号