Как объединить несколько файлов .docx в один файл в JAVA? - PullRequest
0 голосов
/ 28 октября 2019

Я работаю над веб-приложением JAVA, одним из бизнес-запросов является объединение нескольких файлов DOCX в один файл DOCX.

входные данные представляют собой список файлов, желаемый выходной файл - один файл DOCX, которыйсодержит всю информацию, собранную из файлов.

Я пробовал этот код, но он не работал для меня:

public File mergeInOneFile(List<File> files) throws IOException, InvalidFormatException, XmlException {
        List<CTBody> sourceBody = new ArrayList<>();
        for (File file : files) {
            OPCPackage srcFile = OPCPackage.open(file);
            XWPFDocument srcDocument = new XWPFDocument(srcFile);
            CTBody srcBody = srcDocument.getDocument().getBody();
            sourceBody.add(srcBody);
        }
        CTBody source = sourceBody.get(0);
        sourceBody.remove(0);
        while (sourceBody.size() != 0){
            appendBody(source, sourceBody.get(0));
            sourceBody.remove(0);
        }
        return (File) source;
    }

private static void appendBody(CTBody src, CTBody append) throws XmlException {
        XmlOptions optionsOuter = new XmlOptions();
        optionsOuter.setSaveOuter();
        String appendString = append.xmlText(optionsOuter);
        String srcString = src.xmlText();
        String prefix = srcString.substring(0,srcString.indexOf(">")+1);
        String mainPart = srcString.substring(srcString.indexOf(">")+1,srcString.lastIndexOf("<"));
        String suffix = srcString.substring( srcString.lastIndexOf("<") );
        String addPart = appendString.substring(appendString.indexOf(">") + 1, appendString.lastIndexOf("<"));
        CTBody makeBody = CTBody.Factory.parse(prefix+mainPart+addPart+suffix);
        src.set(makeBody);
    }
}

Этот метод deos не работал для меня,Знаете ли вы другие уловки, чтобы достичь моей цели?

Ответы [ 2 ]

1 голос
/ 28 октября 2019

Ошибка явно из-за этой строки: return (File) source. source является типом CTBody, и вы преобразуете его в File, пока они не связаны.

0 голосов
/ 04 ноября 2019

Я решил проблему объединения списка файлов DOCX в один файл, это мой код:

public File merge(final List<File> files) throws IoAppException, OtherAppException {
        Path outPath = this.fileStorageService.getPath()
                .resolve(UUID.randomUUID().toString() + Directory.DOCX_EXTENSION);
        File outFile = outPath.toFile();
        try (OutputStream os = new FileOutputStream(outFile);
                InputStream is = new FileInputStream(files.get(0));
                XWPFDocument doc = new XWPFDocument(is);) {


            CTBody ctBody = doc.getDocument().getBody();
            for (int i = 1; i < files.size(); i++) {
                try (InputStream isI = new FileInputStream(files.get(i)); XWPFDocument docI = new XWPFDocument(isI);) {

                    CTBody ctBodyI = docI.getDocument().getBody();
                    appendBody(ctBody, ctBodyI);
                } catch (Exception e) {
                    e.printStackTrace();
                    throw new OtherAppException("", e);
                }
            }
            doc.write(os);
            return outFile;
        } catch (FileNotFoundException e) {
            e.printStackTrace();
            throw new IoAppException("", e);
        } catch (IOException e) {
            e.printStackTrace();
            throw new IoAppException("", e);
        }
    }
private static void appendBody(CTBody src, CTBody append) throws XmlException {
        XmlOptions optionsOuter = new XmlOptions();
        optionsOuter.setSaveOuter();
        String appendString = append.xmlText(optionsOuter);
        String srcString = src.xmlText();
        String prefix = srcString.substring(0, srcString.indexOf(">") + 1);
        String mainPart = srcString.substring(srcString.indexOf(">") + 1, srcString.lastIndexOf("<"));
        String sufix = srcString.substring(srcString.lastIndexOf("<"));
        String addPart = appendString.substring(appendString.indexOf(">") + 1, appendString.lastIndexOf("<"));
        CTBody makeBody;
        try {
            makeBody = CTBody.Factory.parse(prefix + mainPart + addPart + sufix);
        } catch (XmlException e) {
            e.printStackTrace();
            throw new XmlException("", e);
        }
        src.set(makeBody);
    }
...