• Apache POl


    介绍

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

    Apache POl 的应用场景 

    1.银行网银系统导出交易明细
    2.各种业务系统导出Excel报表
    3.批量导入业务数据 

    入门案例


    Apache Pol的maven坐标:

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

    通过POI创建Excel文件并写入文件内容

    1. /**
    2. * 通过POI创建Excel文件并写入文件内容
    3. */
    4. public static void write() throws IOException {
    5. //在内存中创建一个文件
    6. XSSFWorkbook excel = new XSSFWorkbook();
    7. //在excel文件中创建一个sheet页
    8. XSSFSheet sheet = excel.createSheet("info");
    9. //在sheet页中创建行对象,rownum的编号从0开始
    10. XSSFRow row = sheet.createRow(1);
    11. //创建单元格并写入内容
    12. row.createCell(1).setCellValue("城市");
    13. row.createCell(2).setCellValue("姓名");
    14. //创建新行
    15. row = sheet.createRow(2);
    16. //创建单元格并写入内容
    17. row.createCell(1).setCellValue("北京");
    18. row.createCell(2).setCellValue("张三");
    19. //创建新行
    20. row = sheet.createRow(3);
    21. //创建单元格并写入内容
    22. row.createCell(1).setCellValue("北京");
    23. row.createCell(2).setCellValue("李四");
    24. //通过输出流将内存中的excel文件输出到磁盘
    25. FileOutputStream outputStream = new FileOutputStream(new File("B:\\info.xlsx"));
    26. excel.write(outputStream);
    27. //关闭资源
    28. outputStream.close();
    29. excel.close();
    30. }

    通过POI读取已经存在的Excel文件并输出文件内容到控制台

    1. public static void read() throws IOException {
    2. //读取磁盘上已经存在的Excel文件
    3. XSSFWorkbook excel = new XSSFWorkbook(new FileInputStream(new File("B:\\info.xlsx")));
    4. //读取Excel文件中的第一个Sheet页
    5. XSSFSheet sheet = excel.getSheetAt(0);
    6. //获取Sheet中的最后一行的行号
    7. int lastRowNum = sheet.getLastRowNum();
    8. for (int i =1;i<= lastRowNum;i++){
    9. //获取一行
    10. XSSFRow row =sheet.getRow(i);
    11. //获取单元格对象
    12. String cellValue1 = row.getCell(1).getStringCellValue();
    13. String cellValue2 = row.getCell(2).getStringCellValue();
    14. System.out.println(cellValue1 + " " +cellValue2);
    15. }
    16. }

     

    如果excel的格式过于复杂可以先创建好模版,再将数据填入

    1. /**
    2. * 导出运营数据报表
    3. * @param response
    4. */
    5. public void exportBusinessData(HttpServletResponse response) {
    6. //1.查询数据库获取最近30天的运营数据
    7. LocalDate dateBegin = LocalDate.now().minusDays(30);
    8. LocalDate dateEnd = LocalDate.now().minusDays(1);
    9. //查询运营数据
    10. BusinessDataVO businessDataVO = workspaceService.getBusinessData(LocalDateTime.of(dateBegin,LocalTime.MIN),LocalDateTime.of(dateEnd,LocalTime.MAX));
    11. //通过POI将数据写入Excel文件中
    12. InputStream in = this.getClass().getClassLoader().getResourceAsStream("template/1.xlsx");
    13. try {
    14. //基于模版文件创建一个新的Excel文件
    15. XSSFWorkbook excel = new XSSFWorkbook(in);
    16. XSSFSheet sheet = excel.getSheet("Sheet1");
    17. //填空数据
    18. //时间
    19. sheet.getRow(1).getCell(1).setCellValue("时间:"+dateBegin+"致"+dateEnd);
    20. //概览数据
    21. XSSFRow row = sheet.getRow(3);
    22. row.getCell(2).setCellValue(businessDataVO.getTurnover());
    23. row.getCell(4).setCellValue(businessDataVO.getOrderCompletionRate());
    24. row.getCell(6).setCellValue(businessDataVO.getNewUsers());
    25. row = sheet.getRow(4);
    26. row.getCell(2).setCellValue(businessDataVO.getValidOrderCount());
    27. row.getCell(4).setCellValue(businessDataVO.getUnitPrice());
    28. //明细数据
    29. for (int i =0;i<30;i++){
    30. LocalDate date = dateBegin.plusDays(i);
    31. //查询运营数据
    32. BusinessDataVO businessData = workspaceService.getBusinessData(LocalDateTime.of(date,LocalTime.MIN),LocalDateTime.of(date,LocalTime.MAX));
    33. //获取某一行
    34. row = sheet.getRow(7+i);
    35. row.getCell(1).setCellValue(date.toString());
    36. row.getCell(2).setCellValue(businessData.getTurnover());
    37. row.getCell(3).setCellValue(businessData.getValidOrderCount());
    38. row.getCell(4).setCellValue(businessData.getOrderCompletionRate());
    39. row.getCell(5).setCellValue(businessData.getUnitPrice());
    40. row.getCell(6).setCellValue(businessData.getNewUsers());
    41. }
    42. //获取一个输出流对象将excel下载的浏览器
    43. ServletOutputStream outputStream = response.getOutputStream();
    44. excel.write(outputStream);
    45. //关闭资源
    46. excel.close();
    47. outputStream.close();
    48. } catch (IOException e) {
    49. e.printStackTrace();
    50. }
    51. }

     

     

  • 相关阅读:
    9.1充血模型和贫血模型
    【软件测试】毕业打工两年,辞职一年后转行月薪18K,软件测试让我发起了第一春......
    Nvm,Nrm使用教程
    莫名其妙的越界错误原因之条件判断顺序——基于LeetCode 99题,恢复二叉搜索树
    给你一个项目,你将如何开展性能测试工作?
    React:五、React脚手架应用
    RPG游戏完整指南
    ARM Cortex-M 的 SP
    jenkies构建springboot
    go高并发之路——go语言如何解决并发问题
  • 原文地址:https://blog.csdn.net/qq_64376339/article/details/136330431