我想用poi在特定位置插入一个表,生成表,但我发现这个表不可见。
使用macOS及其文本工具预览或编辑此doc时,可以看到doc中生成的表格,POI也可以读取表格和内容。我计划上传4张图片来显示这个过程,但我只能发布2张图片,对不起。
@Test
public void exportDoc() throws Exception {
FileInputStream readFile = new FileInputStream(new File(readDoc));
FileOutputStream replaceFile = new FileOutputStream(new File(replaceDoc));
HWPFDocument document = new HWPFDocument(readFile);
Table table = WordUtil.insertNewTable(document,"${table}");
insertTableInDoc(table);
document.write(replaceFile);
readFile.close();
replaceFile.close();
}
private Table insertNewTable(HWPFDocument doc, String sourceValue) {
Range range = doc.getRange();
Table table = null;
for (int i = 0; i < range.numSections(); ++i) {
Section s = range.getSection(i);
for (int x = 0; x < s.numParagraphs(); x++) {
Paragraph p = s.getParagraph(x);
if (p.text().contains(sourceValue)) {
//remove target text
range.replaceText(sourceValue, "");
table = p.insertTableBefore((short) 3, 3);
return table;
}
}
}
return table;
}
private void insertTableInDoc(Table table) {
int count = 1;
for (int rowNum = 0; rowNum < table.numRows(); rowNum++) {
TableRow tableRow = table.getRow(rowNum);
for (int colNum = 0; colNum < tableRow.numCells(); colNum++) {
TableCell cell = tableRow.getCell(colNum);
Paragraph paragraph = cell.getParagraph(0);
CharacterRun characterRun = paragraph.getCharacterRun(0);
characterRun.insertBefore("number: " + count++);
}
}
}
答案 0 :(得分:2)
使用HWPF项目的当前状态,在尝试将内容插入.doc文件时可能会运气不佳。您最好的选择是使用不同的格式(docx)。
过去一年我没有看过HWPF,所以关于HWPF的现状我可能错了:
几年前,我正在为客户开发一个自定义HWPF库。该自定义库的主要目标是修改.doc文件的能力,Word可以正确处理修改后的文件。因此我知道在多少级别修改.doc文件最终会失败。公共HWPF库在修改时无法处理.doc文件格式的许多方面(文本框,双字节字符范围,形状文件,嵌套表,......等等)。
要正确处理修改,库必须支持特定.doc文件的所有“功能”。因此,当.doc文件中有形状时,即使插入了简单的文本片段并且未触摸形状,HWPF也必须调整形状的位置表。如果未处理形状,打开输出文件时Word将崩溃。
如果可以,请使用docx或rtf。如果是一个选项,您可以尝试一个能够处理.doc文件的商业库。