5

我尝试根据输入数据创建一个新表并将其插入到 docx 文档中。以下导致损坏的输出文件:

private Tbl getSampleTable(WordprocessingMLPackage wPMLpackage) {

        ObjectFactory factory = Context.getWmlObjectFactory();
        int writableWidthTwips = wPMLpackage.getDocumentModel().getSections().get(0).getPageDimensions().getWritableWidthTwips();
        List<Map<String, String>> data = getSampleTableData();
        TableDefinition tableDef = getSampleTableDef();
        int cols = tableDef.getColumns().size();
        int cellWidthTwips = new Double(Math.floor((writableWidthTwips / cols))).intValue();

        Tbl table = TblFactory.createTable((data.size() + 1), cols, cellWidthTwips);

        Tr headerRow = (Tr) table.getContent().get(0);

        int f = 0;
        for (Column column : tableDef.getColumns()) {
            Tc column = (Tc) headerRow.getContent().get(f);
            f++;
            Text text = factory.createText();
            text.setValue(column.getName());
            R run = factory.createR();
            run.getContent().add(text);
            column.getContent().add(run);
            headerRow.getContent().add(column);
        }
        int i = 1;

        for (Map<String, String> entry : data) {
            Tr row = (Tr) table.getContent().get(i);
            i++;
            int p = 0;
            for (String key : entry.keySet()) {
                Tc column = (Tc) row.getContent().get(p);
                p++;
                Text tx = factory.createText();
                R run = factory.createR();
                tx.setValue(entry.get(key));
                run.getContent().add(tx);
                column.getContent().add(run);
                row.getContent().add(column);
            }
        }
        return table;
    }

在不插入表格的情况下,将按原样创建 docx 文档。

我通过尝试将此表插入到作为输入参数接收的文件中来使用此函数:

    ByteArrayInputStream bis = new ByteArrayInputStream(file);
    WordprocessingMLPackage wPMLpackage = null;
    wPMLpackage = WordprocessingMLPackage.load(bis);

    // Zip it up
    ByteArrayOutputStream baos = new ByteArrayOutputStream();
    SaveToZipFile saver = new SaveToZipFile(wPMLpackage);
    saver.save(baos);
    byte[] template = baos.toByteArray();

    WordprocessingMLPackage target = WordprocessingMLPackage.load(new ByteArrayInputStream(template));
    target.getMainDocumentPart().getContent().clear();

    target.getMainDocumentPart().addObject(getSampleTable(target));
    ByteArrayOutputStream baos2 = new ByteArrayOutputStream();
    SaveToZipFile saver2 = new SaveToZipFile(target);
    saver2.save(baos2);
    return baos2.toByteArray();

有人知道为什么生成的文件不能被 Microsoft Word 解释?错误消息是“无法打开文件,因为它的内容会导致问题”。只要我不插入此表,就可以对文档进行操作。

4

2 回答 2

12

在段落中插入运行会导致所需的结果:

 private Tbl getSampleTable(WordprocessingMLPackage wPMLpackage) {

    ObjectFactory factory = Context.getWmlObjectFactory();
    int writableWidthTwips = wPMLpackage.getDocumentModel().getSections()
                                        .get(0).getPageDimensions()
                                        .getWritableWidthTwips();
    List<Map<String, String>> data = getSampleTableData();
    TableDefinition tableDef = getSampleTableDef();
    int cols = tableDef.getColumns().size();
    int cellWidthTwips = new Double(
            Math.floor((writableWidthTwips / cols))
        ).intValue();

    Tbl table = TblFactory.createTable((data.size() + 1), cols, cellWidthTwips);

    Tr headerRow = (Tr) table.getContent().get(0);

    int f = 0;
    for (Column column : tableDef.getColumns()) {
        Tc column = (Tc) headerRow.getContent().get(f);
        P columnPara = (P) column.getContent().get(0);
        f++;
        Text text = factory.createText();
        text.setValue(column.getName());
        R run = factory.createR();
        run.getContent().add(text);
        columnPara.getContent().add(run);
    }
    int i = 1;

    for (Map<String, String> entry : data) {
        Tr row = (Tr) table.getContent().get(i);
        i++;
        int d = 0;
        for (String key : entry.keySet()) {
            Tc column = (Tc) row.getContent().get(d);
            P columnPara = (P) column.getContent().get(0);
            d++;
            Text tx = factory.createText();
            R run = factory.createR();
            tx.setValue(entry.get(key));
            run.getContent().add(tx);
            columnPara.getContent().add(run);
        }
    }
    return table;
}
于 2013-11-15T08:53:02.117 回答
1

在创建表格(或其他任何事情)时,值得牢记的一种方法是在 Word 中创建您想要的内容,然后使用 docx4j 代码生成工具之一生成相应的 Java 代码。

代码生成工具有 2 种方式可用:

Word AddIn 的优点是可以避免保存上传周期。

于 2015-10-13T21:52:40.570 回答