如何通过 java 将相关数据写入(导出)到 excel 表格文件,Apache Poi 给 Java 程序的 API 对 Microsoft Office 格式文件的读和写提供了最完整解决方案。除了 Apache Poi 工具外,还有一个相关工具是 JXL(Java Excel API),但不经常用。
引入 Apache Poi 包
第一步导入 Apache Poi jar 包。
maven 示例:
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi</artifactId>
<version>4.1.2</version>
</dependency>
gradle 示例:
compile group: 'org.apache.poi', name: 'poi', version: '4.1.2'
poi jar 包内部针对不同的功能,分成了几个子模块,具体结构如下:
- HSSF - 提供读写 Microsoft Excel XLS 格式文件的功能。
- XSSF - 提供读写 Microsoft Excel OOXML XLSX 格式文件的功能。
- HWPF - 提供读写 Microsoft Word DOC 格式文件的功能。
- HSLF - 提供读写 Microsoft PowerPoint 格式文件的功能。
- HDGF - 提供读 Microsoft Visio 格式文件的功能。
- HPBF - 提供读 Microsoft Publisher 格式文件的功能。
- HSMF - 提供读 Microsoft Outlook 格式文件的功能。
转换成 excel 示例
我们这里主要是使用 HSSF 模块对数据进行处理,具体示例如下:
import org.apache.commons.collections4.CollectionUtils;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import org.apache.poi.ss.usermodel.Row;
import org.apache.poi.ss.usermodel.Sheet;
import org.apache.poi.ss.usermodel.Workbook;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.List;
@Slf4j
public class Demo {
private static void writeToExcel(List<String> list) throws IOException {
if (CollectionUtils.isEmpty(list)) {
return;
}
Workbook wb = new HSSFWorkbook();
int oneSheetHeadRowNum = 1; // 头部非内容行数(如标题等)
int oneSheetMaxRowNum = 65536; // excel 一个 sheet 最多支持行
int oneSheetContentAvailableRowNum = oneSheetMaxRowNum - oneSheetHeadRowNum;
int len = list.size();
int needSheetSize = len / (oneSheetContentAvailableRowNum);
log.info("needSheetSize:{}", needSheetSize);
int j = 0;
for (int i = 0; i <= needSheetSize; i++) {
Sheet sheet = wb.createSheet("sheet " + i);
Row row = sheet.createRow(0);
row.createCell(0).setCellValue("搜索词");
row.createCell(1).setCellValue("意图分类");
row.createCell(2).setCellValue("详细信息");
for (int k = 0; j < list.size() && k < oneSheetContentAvailableRowNum; k++, j++) {
String string = list.get(j);
Row contentRow = sheet.createRow(k + 1);
contentRow.createCell(0).setCellValue(string);
contentRow.createCell(1).setCellValue(string);
contentRow.createCell(2).setCellValue(string);
}
}
FileOutputStream fileOut = new FileOutputStream("intention_result.xls");
wb.write(fileOut);
fileOut.close();
}
}