内容纲要

环境

  • Java
  • Spring框架
  • Gradle

概述

Apache POI 提供了一套用于处理Microsoft Office文件的 Java API,可以对诸如excel、ppt、word等类型的文件进行读写操作。常用于在项目中对各种文本文件做操作,包括读取文件内容、生成文件等。

具体参考官方文档:https://poi.apache.org/components/index.html

准备

  1. 基础包

若只需要处理.xls的excel文件,则引入poi的基础包即可:

implementation 'org.apache.poi:poi:4.1'
  1. scratchpad包

若需要处理除excel文件外的更多文件,比如PPT、WORD之类的,就需要引入这个包:

implementation 'org.apache.poi:poi-scratchpad:4.1'
  1. ooxml包

如果需要处理.xlsx的excel文件或者是.docx的word文件,则需要引入这个包:

implementation 'org.apache.poi:poi-ooxml:4.1'

对于POI每个包能够支持的文件类型,我们用官方文档中的一个表格做个记录:

常用类

由于目前使用的Office多是07及以后的版本,所以我们就针对于poi-ooxml支持的XSSF和XWPF做一个简要的介绍。

Excel

常用类 说明
XSSFWorkbook Excel的文档对象
XSSFSheet Excel的表单
XSSFRow Excel的行
XSSFCell Excel的单元格
XSSFCellStyle Excel的单元格样式

Word

常用类 说明
XWPFDocument Word的文档对象
XWPFParagraph Word的段落
XWPFHeader Word的页眉
XWPFFooter Word的页脚
XWPFTable Word中的表单
XWPFTableRow Word中的表单的行
XWPFTableCell Word中的表单的单元格

使用示例

读取Excel中的内容

File template = new File("C:\\test");
XSSFSheet sheetTemplate = (new XSSFWorkbook(new FileInputStream(template))).getSheetAt(0);
XSSFRow headerRow = sheetTemplate.getRow(0);
int columnCount = headerRow.getPhysicalNumberOfCells();
for (int i = 0; i <= columnCount; i ++) {
  XSSFCell headerCell = headerRow.getCell(i);
  System.out.println("表头:" + headerCell.getStringCellValue());
}
int rowNum = sheetTemplate.getLastRowNum();
for (int i = 1; i <= rowNum; i++) {
  XSSFRow row = sheetTemplate.getRow(i);
}

写入数据并生成Excel

public InputStream createExcel(CreateFileRequest request) {
  XSSFWorkbook xssfWorkbook = new XSSFWorkbook();
  XSSFSheet sheet = xssfWorkbook.createSheet("test");
  XSSFRow header = sheet.createRow(0);

  buildExcelTitle(header);
  buildExcelContent(sheet);

  return getInputStreamByWorkbook(xssfWorkbook);     
}

private void buildExcelTitle(XSSFRow header) {
  List excelTitles = List.of("姓名", "性别", "年龄");
  IntStream.range(0, excelTitles.size()).forEach(i -> {
    XSSFCell cell = header.createCell(i);
    cell.setCellValue(excelTitles.get(i));
  });
}

private void buildExcelContent(XSSFSheet sheet) {
  List> rows = List.of(
    List.of("Tom", "MALE", "18"),
    List.of("Alice", "FEMALE", "20")
  );
  rows.forEach(rowContent -> {
    XSSFRow row = sheet.createRow(sheet.getLastRowNum() + 1);
    for (int i = 0; i < rowContent.size(); i++) {
      row.createCell(i).setCellValue(rowContent.get(i));
    }
  });
}

private InputStream getInputStreamByWorkbook(XSSFWorkbook xssfWorkbook) {
  FileItem file = new DiskFileItemFactory().createItem("file", MediaType.MULTIPART_FORM_DATA_VALUE, true, "测试文件");
  try {
    OutputStream outputStream = file.getOutputStream();
    xssfWorkbook.write(outputStream);
    return file.getInputStream();
  } catch (IOException e) {
    log.error("文件上传IO异常", e);
  }
}

设置单元格样式

public void setExcelStyle() {
  XSSFWorkbook xssfWorkbook = new XSSFWorkbook();
  XSSFSheet sheet = xssfWorkbook.createSheet(request.getContent().getSheetName());
  XSSFRow header = sheet.createRow(0);
  //设置单元格样式
  XSSFCellStyle cellStyle = xssfWorkbook.createCellStyle();
  cellStyle.setAlignment(HorizontalAlignment.CENTER);
  cellStyle.setWrapText(true);
  cellStyle.setFillBackgroundColor(IndexedColors.BLUE_GREY.getIndex());
  //设置字体样式
  XSSFFont font = xssfWorkbook.createFont();
  font.setBold(true);
  font.setFontHeight(18);
  font.setFamily(FontFamily.ROMAN);
  font.setColor(IndexedColors.BLACK.getIndex());
}
最后修改日期: 2024年1月19日

留言

撰写回覆或留言

发布留言必须填写的电子邮件地址不会公开。