• 使用POI实现操作Excel文件。


    1、添加依赖
    1. <dependency>
    2. <groupId>org.apache.poigroupId>
    3. <artifactId>poiartifactId>
    4. <version>4.1.2version>
    5. dependency>
    6. <dependency>
    7. <groupId>org.apache.poigroupId>
    8. <artifactId>poi-ooxmlartifactId>
    9. <version>4.1.2version>
    10. dependency>
    2、xls和xlsx的区别介绍
    1. xls是Excel03版本,最大支持65536行、256列,poi 操作xls,使用HSSFWorkbook
    2. xlsx是Excel007版本,最大支持1048576行、16384列,poi-ooml操作xlsx,使用XSSFWorkbook

    3、代码示例,读取Excel
    1. /**
    2. * 读.xlsx文件
    3. */
    4. private static List> readXlsx(String path) throws Exception {
    5. InputStream is = Files.newInputStream(Paths.get(path));
    6. XSSFWorkbook xssfWorkbook = new XSSFWorkbook(is);
    7. List> result = new ArrayList>();
    8. // 循环每一页,并处理当前循环页 (sheet 页)
    9. int numberOfSheets = xssfWorkbook.getNumberOfSheets();
    10. for (int i = 0; i < numberOfSheets; i++) {
    11. XSSFSheet sheetAt = xssfWorkbook.getSheetAt(i);
    12. if (sheetAt == null) {
    13. continue;
    14. }
    15. // 从第一行一直循环到当前sheet的最后一行
    16. for (int rowNum = 1; rowNum <= sheetAt.getLastRowNum(); rowNum++) {
    17. // 获取行数据,然后在获取列数据
    18. XSSFRow xssfRow = sheetAt.getRow(rowNum);
    19. int minColIx = xssfRow.getFirstCellNum();
    20. int maxColIx = xssfRow.getLastCellNum();
    21. List rowList = new ArrayList();
    22. for (int colIx = minColIx; colIx < maxColIx; colIx++) {
    23. XSSFCell cell = xssfRow.getCell(colIx);
    24. if (cell == null) {
    25. continue;
    26. }
    27. rowList.add(cell.toString());
    28. }
    29. result.add(rowList);
    30. }
    31. }
    32. return result;
    33. }
    34. /**
    35. * 读.xls文件
    36. */
    37. private static List> readXls(String path) throws IOException {
    38. InputStream is = Files.newInputStream(Paths.get(path));
    39. HSSFWorkbook hssfWorkbook = new HSSFWorkbook(is);
    40. List> result = new ArrayList>();
    41. int numberOfSheets = hssfWorkbook.getNumberOfSheets();
    42. for (int i = 0; i < numberOfSheets; i++) {
    43. HSSFSheet hssfSheet = hssfWorkbook.getSheetAt(i);
    44. if (hssfSheet == null) {
    45. continue;
    46. }
    47. int firstRowNum = hssfSheet.getFirstRowNum();
    48. int lastRowNum = hssfSheet.getLastRowNum();
    49. for (int rowIx = firstRowNum; rowIx < lastRowNum; rowIx++) {
    50. HSSFRow row = hssfSheet.getRow(rowIx);
    51. int minColIx = row.getFirstCellNum();
    52. int maxColIx = row.getLastCellNum();
    53. List rowList = new ArrayList();
    54. for (int colIx = minColIx; colIx < maxColIx; colIx++) {
    55. HSSFCell cell = row.getCell(colIx);
    56. if (cell == null) {
    57. continue;
    58. }
    59. rowList.add(cell.toString());
    60. }
    61. result.add(rowList);
    62. }
    63. }
    64. return result;
    65. }
    4、代码示例,写Excel (HSSFWorkBook类似)
    1. // 将上面读取的数据,在重新写到一个新的文件中
    2. private static void writeXlsx(List> dataList, String destPath) throws IOException {
    3. // 创建一个工作簿
    4. XSSFWorkbook xssfWorkbook = new XSSFWorkbook();
    5. Sheet sheet001 = xssfWorkbook.createSheet("sheet001");
    6. for (int i = 0; i < dataList.size(); i++) {
    7. Row row = sheet001.createRow(i);
    8. List rowData = dataList.get(i);
    9. for (int j = 0; j < rowData.size(); j++) {
    10. Cell cell = row.createCell(j);
    11. cell.setCellValue(rowData.get(j));
    12. }
    13. }
    14. FileOutputStream fileOutputStream = new FileOutputStream(destPath);
    15. xssfWorkbook.write(fileOutputStream);
    16. fileOutputStream.close();
    17. }

    5、合并单元格 --- addMergedRegion
    1. private static void mergeWithXSSF(String destPath) throws IOException {
    2. XSSFWorkbook xssfWorkbook = new XSSFWorkbook();
    3. XSSFSheet sheet = xssfWorkbook.createSheet("new Sheet");
    4. XSSFRow row = sheet.createRow(1);
    5. XSSFCell cell = row.createCell(1);
    6. cell.setCellValue("测试合并单元格");
    7. // 按照范围合并单元格
    8. sheet.addMergedRegion(new CellRangeAddress(1, 1, 1, 2));
    9. FileOutputStream fileOutputStream = new FileOutputStream(destPath);
    10. xssfWorkbook.write(fileOutputStream);
    11. fileOutputStream.close();
    12. }

    合并效果:

    6.合并单元格的优化 -----  addMergedRegionUnsafe

    当我们还使用addMergedRegion方法的时候,比如循环10000次合并操作,可以计算一下耗时

    1. private static void mergeWithXSSF1(String destPath) throws IOException {
    2. XSSFWorkbook xssfWorkbook = new XSSFWorkbook();
    3. XSSFSheet sheet = xssfWorkbook.createSheet("new Sheet");
    4. long startTime = System.currentTimeMillis();
    5. for (int i = 0; i < 10000; i++) {
    6. XSSFRow row = sheet.createRow(i);
    7. XSSFCell cell = row.createCell(1);
    8. cell.setCellValue("测试合并单元格");
    9. sheet.addMergedRegion(new CellRangeAddress(i, i, 1, 2));
    10. }
    11. long endTime = System.currentTimeMillis();
    12. System.out.println("耗费时间: " + (endTime - startTime));
    13. FileOutputStream fileOutputStream = new FileOutputStream(destPath);
    14. xssfWorkbook.write(fileOutputStream);
    15. fileOutputStream.close();
    16. }
    17. 耗费时间: 22918

    如果换成addMergedRegionUnsafe方法,同样循环10000次合并操作,计算了一下耗时

    1. private static void mergeWithXSSF1(String destPath) throws IOException {
    2. XSSFWorkbook xssfWorkbook = new XSSFWorkbook();
    3. XSSFSheet sheet = xssfWorkbook.createSheet("new Sheet");
    4. long startTime = System.currentTimeMillis();
    5. for (int i = 0; i < 10000; i++) {
    6. XSSFRow row = sheet.createRow(i);
    7. XSSFCell cell = row.createCell(1);
    8. cell.setCellValue("测试合并单元格");
    9. // 改成不校验
    10. sheet.addMergedRegionUnsafe(new CellRangeAddress(i, i, 1, 2));
    11. }
    12. long endTime = System.currentTimeMillis();
    13. System.out.println("耗费时间: " + (endTime - startTime));
    14. FileOutputStream fileOutputStream = new FileOutputStream(destPath);
    15. xssfWorkbook.write(fileOutputStream);
    16. fileOutputStream.close();
    17. }
    18. 耗费时间: 926

    可以看到,消耗的时间是大大减少的。

  • 相关阅读:
    【计组】为什么计算机采用补码进行运算?
    拆分文字后再分组去重
    批量处理文件夹及子文件夹下文件名
    【Java】封装
    [附源码]Python计算机毕业设计Django学生宿舍维修管理系统
    数据分析实战 | 关联规则分析——购物车分析
    [ue5]建模场景学习笔记(5)——必修内容可交互的地形,交互沙(3)
    [物联网] OneNet 多协议TCP透传
    力扣leetcode 1619. 删除某些元素后的数组均值
    kafka生产者如何提高吞吐量
  • 原文地址:https://blog.csdn.net/qq_43325216/article/details/132780593