Java应用-2-POI之操作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();
posted @ 2022-07-02 18:50  苍凉温暖  阅读(357)  评论(0编辑  收藏  举报