内容纲要
环境
- Java
- Spring框架
- Gradle
概述
Apache POI 提供了一套用于处理Microsoft Office文件的 Java API,可以对诸如excel、ppt、word等类型的文件进行读写操作。常用于在项目中对各种文本文件做操作,包括读取文件内容、生成文件等。
具体参考官方文档:https://poi.apache.org/components/index.html
准备
- 基础包
若只需要处理.xls的excel文件,则引入poi的基础包即可:
implementation 'org.apache.poi:poi:4.1'
- scratchpad包
若需要处理除excel文件外的更多文件,比如PPT、WORD之类的,就需要引入这个包:
implementation 'org.apache.poi:poi-scratchpad:4.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());
}
留言