HWPF-POI: table insert into doc with poi hwpf is not visible

HWPF-POI:The table insert into doc with poi hwpf is not visible

我想用poi在特定位置插入一个table,生成了table,但是我发现这个table不可见

使用macOS及其文本工具预览或编辑此文档时可以看到文档中生成的table,POI可以阅读table和内容,也。我打算上传4张图片来展示过程,但我只能post 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++);
        }
    }
}

PS:

我确定这不是微软 mac 的问题,在 windows 平台的文档中生成 table 也不可见。

(第一次提问,如有不妥或表述不清楚,请告知,我会及时修改,谢谢)

就 HWPF 项目的当前状态而言,您在尝试将内容插入 .doc 文件时可能不太走运。最好的选择是使用不同的格式 (docx)。

过去一年我没有看过 HWPF,所以关于 HWPF 的当前状态我在这里可能是错误的:

几年前,我正在为客户开发自定义 HWPF 库。该自定义库的主要目标是能够修改 .doc 文件,并且 Word 可以正确处理修改后的文件。因此我知道在多少级别修改 .doc 文件最终会失败。 public HWPF 库在修改时无法处理 .doc 文件格式的许多方面(文本框、两字节字符范围、形状文件、嵌套表格……仅举几例)。

要正确处理修改,库必须支持特定 .doc 文件的所有 "features"。因此,当 .doc 文件中有形状时,HWPF 必须调整形状的位置表,即使插入了一个简单的文本片段并且没有触及形状。如果不处理形状,Word 在打开输出文件时会崩溃。

因此,如果可以,请使用 docx 或 rtf。如果可以,您可以尝试其中一个能够处理 .doc 文件的商业图书馆。