• Java应用2POI之操作Excel


    1. 前言

    Apache POI是Apache开源的用以Java操作Microsoft Office套件档案进行读写的API库。

    1. 版本
      • HSSF:支持Excel 97~2003版本的.xls文档操作,不过局限性较大,单个sheet最多65536行256列。
      • XSSF:支持Excel 2007版本往后.xlsx文档,单个sheet最多1048576行16384列。但是可能会消耗大量内存导致溢出风险。
      • SXSSF:在XSSF基础上的低内存消耗方式,从POI 3.8版本开始支持。原理是限制内存占用的大小,且将内存中超过100条生成的数据缓存在磁盘上。用于超大写入量的文件,但是需要清理生成的缓存文件。
    2. 选择
      Excel是向下兼容的,也就是高版本兼容低版本的文档。但是还不支持.xlsx文档的Excel版本也不多了,所以比较推荐使用XSSF,本篇也是基于XSSF操作的。因为XSSF所有操作文档的数据都是缓存在内存中的,如果要同时处理大量的Excel文档,还是要注意内存的使用量。
    3. 依赖(可以的话尽量使用maven,手动导入太痛苦了)
      • poi-3.17.jar
      • poi-ooxml-3.17.jar
      • poi-ooxml-schemas-3.17.jar
      • xmlbeans-2.3.0.jar
      • commons-collections4-4.1.jar
    4. 更多方法请见:
      Apache POI使用详解 (HSSF)
      HSSFCellStyle 设置 Excel单元格样式
    5. 注意:
      HSSF和XSSF很多对象和参数都不一致,相同功能但是不同方法名和参数值,具体需要查询后使用。

    2. 创建&编辑文档

    1. 创建文档
      // 创建Excel文档对象
      XSSFWorkbook workbook = new XSSFWorkbook();
      
    2. 字体样式
      // 字体样式是全局的,基于XSSFWorkbook对象
      XSSFFont font = workbook.createFont();
      // 是否加粗
      font.setBold(true);
      // 字体
      font.setFontName("宋体");
      // 字号
      font.setFontHeightInPoints((short) 10);
      
    3. 单元格样式
      // 单元格样式也是全局的
      XSSFCellStyle cellStyle = workbook.createCellStyle();
      // 设置单元格内文字字体样式
      cellStyle.setFont(font);
      // 设置上下左右边框加粗
      cellStyle.setBorderTop(BorderStyle.THIN);
      cellStyle.setBorderBottom(BorderStyle.THIN);
      cellStyle.setBorderLeft(BorderStyle.THIN);
      cellStyle.setBorderRight(BorderStyle.THIN);
      // 设置单元格背景颜色,设置颜色有“两”种方式,且需要设定一下FillPattern才可生效
      cellStyle.setFillForegroundColor(new XSSFColor(new Color(255, 255, 255)));
      cellStyle.setFillForegroundColor(new XSSFColor(Color.decode("#FFFFFF")));
      cellStyle.setFillPattern(FillPatternType.SOLID_FOREGROUND);
      // 内容居中
      cellStyle.setAlignment(HorizontalAlignment.CENTER);
      
    4. 创建Sheet页
      XSSFSheet sheet = workbook.createSheet();
      // 设置Sheet页名称,Sheet页下标从0开始
      workbook.setSheetName(0, "SheetName");
      // 设置列宽度,列从下标0开始,第二个参数是每加1就是一个英文字符的1/256,所以用60字符*256,就可以展示60字符宽度
      sheet.setColumnWidth(0, 60 * 256);
      // 冻结第一行,前两个参数是冻结的第几列第几行,后两个参数是窗口可见象限
      sheet.createFreezePane(0, 1, 0, 1);
      // 冻结第一列
      sheet.createFreezePane(1, 0, 1, 0);
      // 合并单元格,CellRangeAddress(开始行下标, 结束行下标, 开始列下标, 结束列下标)
      // 注意:这里合并单元格以后会出现合并单元格样式丢失,此时创建出所有合并的单元格原格并添加上样式即可正常
      sheet.addMergedRegion(new CellRangeAddress(0, 10, 0, 10));
      
    5. 创建Sheet的行
      // Sheet行下标从0开始
      XSSFRow  row = sheet.createRow(0);
      
    6. 创建Row的列
      // Row列下标从0开始
      XSSFCell cell = row.createCell(0);
      // 设置值
      cell.setCellValue("xxyy");
      // 设置样式
      cell.setCellStyle(cellStyle);
      // 设置文档内Sheet页+单元格超链接,语法是:HYPERLINK("#<Sheet页名称>!<单元格列行标识>")
      cell.setCellFormula("HYPERLINK(\"#SheetName!A1\")");
      
    7. 写入到文件
      File file = new File("C:\\test.xlsx");
      try {
          FileOutputStream fos = new FileOutputStream(file);
          workbook.write(fos);
          fos.close();
      } catch (FileNotFoundException e) {
          throw new RuntimeException(e);
      } catch (IOException e) {
          throw new RuntimeException(e);
      }
      

    3. 读取文档

    File file = new File("C:\\test.xlsx");
    InputStream in = new FileInputStream(file);
    // 读取Excel
    XSSFWorkbook wb = new XSSFWorkbook(in);
    // 获取第一个sheet,下标还是从0开始
    XSSFSheet sheet = wb.getSheetAt(0);
    // 获取第一行
    XSSFRow row = sheet.getRow(0);
    // 获取第一列
    XSSFCell cell = row.getCell(0);
    // 获取单元格内容
    String value = cell.getStringCellValue();
    
  • 相关阅读:
    Php排序
    php导出excel表
    yii的多表查询
    MySQL中自定义排序
    jquery中的obj.attr()和obj.data
    PhpStorm快捷键
    记2019年目标之一没有996的大数据分析BI实战历程
    2018年传统公司技术部门技术变迁和2019展望
    mpvue微信小程序开发随笔
    docker toolbox的redis 配置主从及哨兵模式保证高可用
  • 原文地址:https://www.cnblogs.com/NyanKoSenSei/p/16438016.html
Copyright © 2020-2023  润新知