今天在开发过程中遇到的一个需求,java读取文档内容并同步生成数据表,在 Java 编程中,操作文档也是一个常见功能,下面就简单介绍一下解决过程。
依赖
<!-- 这边java版本为1.8 -->
<!-- Apache POI 处理 Word 文档 -->
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi-ooxml</artifactId>
<version>5.2.3</version>
</dependency>
<!-- Apache POI 核心库 -->
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi</artifactId>
<version>5.2.3</version>
</dependency>
<!-- XMLBeans 解析器,用于处理 Word XML 数据 -->
<dependency>
<groupId>org.apache.xmlbeans</groupId>
<artifactId>xmlbeans</artifactId>
<version>5.1.1</version>
</dependency>
<!-- Commons Compress 库,用于压缩和解压缩文件 -->
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-compress</artifactId>
<version>1.21</version>
</dependency>
Apache POI:
- `XWPFDocument` 类用于读取 `.docx` 文件。
- `XWPFParagraph` 代表文档中的段落,`XWPFRun` 用于操作段落中的文本。
- `XWPFTable` 代表文档中的段落,`XWPFRun` 用于操作表格中的文本。
话不多说直接上代码
// 读取段落
try(
//获取上传的文档内容,并放入XWPFDocument中
InputStream inputStream = file.getInputStream();
XWPFDocument document = new XWPFDocument(inputStream)){
// 读取文档中的段落
List<XWPFParagraph> paragraphs = document.getParagraphs();
//循环段落
for (XWPFParagraph paragraph : paragraphs) {
//转为list类型
List<XWPFRun> runs = paragraph.getRuns();
//循环拿到内容
for (XWPFRun run : runs) {
String text = run.getText(0);
if (text != null) {
// 假设每个段落占一行
currentLineCount++;
pageContent.append(text).append("\n");
// 判断是否需要分页
if (currentLineCount >= maxLinesPerPage) {
// 输出当前页内容
savePageContent(pageContent.toString(), pageNumber);
// 重置分页参数
pageContent.setLength(0);
currentLineCount = 0;
pageNumber++; } } } }
// 保存最后一页内容
if (pageContent.length() > 0) {
savePageContent(pageContent.toString(), pageNumber);
}
// 关闭文档
file.close();
document.close();
}
// 将每页内容保存为新的文件或处理分页内容
private static void savePageContent(String content, int pageNumber) throws IOException {
String fileName = "页" + pageNumber + ".txt";
FileOutputStream fos = new FileOutputStream(fileName);
fos.write(content.getBytes());
fos.close();
System.out.println("页 " + pageNumber + " to " + fileName);
}
这里是未分页获取所有文本内容(内容中含表格)
try (InputStream inputStream = file.getInputStream();
XWPFDocument xwpfDocument = new XWPFDocument(inputStream)) {
// 读取文档中的段落
List<XWPFParagraph> paragraphs = xwpfDocument.getParagraphs();
// 创建一个 List 来存储每页的内容
List<String> pages = new ArrayList<>();
StringBuilder stringBuilder = new StringBuilder();
// 遍历段落
for (XWPFParagraph paragraph : paragraphs) {
stringBuilder.append(paragraph.getText()).append('\n');
// 将当前页的内容添加到 pages 列表
String[] split = stringBuilder.toString().trim().split(" ");
for (String s : split) {
if (!s.trim().isEmpty()) {
pages.add(s);
}
}
}
System.out.println(pages);
// 获取所有的表格
List<XWPFTable> tables = xwpfDocument.getTables();
// 遍历所有表格
for (XWPFTable table : tables) {
System.out.println("New Table:");
// 遍历表格中的行
for (XWPFTableRow row : table.getRows()) {
// 遍历每一行的单元格
for (XWPFTableCell tableCell : row.getTableCells()) {
System.out.print(tableCell.getText() + '\t'); // 改为 `print` 避免多余换行
//这里可以来判断也以后得业务逻辑,判断循值是否是自己需要的
}
System.out.println(); // 换行,表示一行表格的结束
}
}
} catch (IOException e) {
// 处理异常逻辑,例如记录日志
e.printStackTrace();
}
}
就此功能完成了。