首页 > 解决方案 > Word 文档合并使用 Apache POI 合并后生成“文件损坏错误”

问题描述

嘿,伙计们请注意,这似乎是与以前的帖子类似的问题- 但在那里发布的解决方案并不能解决我的错误。

我的要求是,

1)加载多个word文档,2)将word文档合并为一个word文档。

伙计们付出了一些努力,我能够使用 Apache POI API 合并文件。但是,一旦我尝试打开合并的文件,Microsoft Word 会生成以下错误,

“Word 在 final.docx 中发现了不可读的内容。是否要恢复此文档的内容?如果您信任此文档的来源,请单击“是”。

在此处输入图像描述

伙计们注意到,在我单击“是”后,Microsoft Word 能够完全恢复文件;结果文件已正确合并。但是,如果可能的话,我想消除文件损坏错误警告。

我的合并类代码清单,

package rx.reportgenerator.gh;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.util.logging.Level;
import java.util.logging.Logger;
import org.apache.poi.ss.usermodel.Cell;
import org.apache.poi.ss.usermodel.Row;
import org.apache.poi.ss.usermodel.Sheet;
import org.apache.poi.ss.usermodel.Workbook;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;
import java.io.InputStream;
import java.io.OutputStream;
import java.util.ArrayList;
import java.util.List;
import org.apache.poi.openxml4j.opc.OPCPackage;
import org.apache.poi.xwpf.usermodel.XWPFDocument;
import org.apache.poi.xwpf.usermodel.XWPFParagraph;
import org.openxmlformats.schemas.wordprocessingml.x2006.main.CTBody;
/**
 *
 * @author kwadwooteng-amoko
 */
public class WordMerge {



    private final OutputStream merger;
    private final List<InputStream> docs;
    private XWPFDocument first;



    public WordMerge(OutputStream result) {
        this.merger = merger;
        docs = new ArrayList<>();
    }

    public void add(InputStream document) throws Exception{            
        docs.add(document);
        OPCPackage src = OPCPackage.open(document);
        XWPFDocument xDocument = new XWPFDocument(src);     
        XWPFParagraph paragraph = xDocument.createParagraph();
        paragraph.setPageBreak(true);
        if(docs.size() == 1){
            first = xDocument;
        } else {            
            CTBody xBody = xDocument.getDocument().getBody();
            first.getDocument().addNewBody().set(xBody);            
        }        
    }

    public void doMerge() throws Exception{
        first.write(merger);                
    }

    public void close() throws Exception{
        merger.flush();
        merger.close();
        for (InputStream input : inputs) {
            input.close();
        }
    }   

}

据我所知,我的库依赖项都是最新的:

在此处输入图像描述

不知道为什么代码会产生错误。尽管合并准确地完成了。你能帮帮我吗伙计们

标签: javams-wordapache-poidocxnetbeans-8

解决方案


不确定这个问题是否已经解决。但是,由于我刚刚遇到了与此错误相同的问题,因此我想与其他人分享我的解决方案:

在 word 文件中使用 apache poi 生成空表单元格时,会出现同样的错误。出于某种原因,word 不喜欢那些空单元格。在我为表中的所有空单元格添加 .addParagraph() 后,错误消失了。来源:https ://bz.apache.org/bugzilla/show_bug.cgi?id=65292


推荐阅读