paquete com.ruoyi.survey.test; importar org.apache.poi.openxml4j.opc.OPCPackage; importar org.apache.poi.openxml4j.util.ZipSecureFile; importar org.apache.poi.xwpf.usermodel.Document; importar org.apache.poi.xwpf.usermodel.XWPFDocument; importar org.apache.poi.xwpf.usermodel.XWFPPictureData; importar org.apache.xmlbeans.XmlOptions; importar org.openxmlformats.schemas.wordprocessingml.x2006.main.CTBody; importar java.io.Archivo; importar java.io.FileInputStream; importar java.io.FileOutputStream; importar java.io.OutputStream; importar java.util.*; public class DocxMerge { public static void main(String[] args) { // Consulta todos los archivos que deben fusionarse en la carpeta // String basePath="D:\\data\\.work\\0530\\declaration file"; // String[] list=new File(basePath).list(); // for (String s:list ) { // String a=s.substring(0,s.indexOf(".")-1); // String b=s.substring(0,s.indexOf(".")-8); System.out .println(a); // System.out.println(b); // Archivo file1 = new File("D:\\data\\.work\\0530\\after merging\\"+b+". docx "); // List<File> targetFile1 = new ArrayList<>(); // targetFile1.add(new File("D:\\data\\.work\\0530\\declaration file\\"+ a+" 4.docx")); // targetFile1.add(new File("D:\\data\\.work\\0530\\declaration file\\"+a+"5.docx")); // // appendDocx(file1, targetFile1); // // } // System.out.println("Fusionar con éxito!!!"); //Fusionar un archivo file1 = new File("D:\\data\\.work\\0530\\after merging\\3.docx" ); List<File> targetFile1 = new ArrayList<>(); targetFile1.add(new File("D:\\data\\.work\\0530\\declaration file\\SQ2022YFC3800142_xm_sqs_zw_part2_4.docx")); targetFile1 . add(new File("D:\\data\\.work\\0530\\declaration document\\SQ2022YFC3800142_xm_sqs_zw_part2_5.docx")); appendDocx(file1, targetFile1); System.out.println("¡Fusionar correctamente! !! \n"); } /** * Combinar varios archivos docx en uno * @param outfile archivo de salida * @param targetFile archivo de destino */ public static void appendDocx(File outfile, List<File> targetFile) { try { OutputStream dest = new FileOutputStream(outfile); ArrayList<XWPFDocument> documentList = new ArrayList<>(); XWPFDocumento doc = nulo; for (int i = 0; i < targetFile.size(); i++) { ZipSecureFile.setMinInflateRatio(-1.0d); FileInputStream in = new FileInputStream(targetFile.get(i).getPath()); OPCPackage abierto = OPCPackage.open(in); documento XWPFDocument = nuevo XWPFDocument(abierto); listadedocumentos.add(documento); } for (int i = 0; i < documentList.size(); i++) { doc = documentList.get(0); if (i != 0) { //Solución Después de fusionar la palabra, todas las tablas están juntas sin paginación. Agregar un salto de página puede resolver documentList.get(i).createParagraph().setPageBreak(true); documentList.get(i).createParagraph() . appendBody(doc, documentList.get(i)); } doc.write(dest); } catch (Exception e) { e.printStackTrace(); } } public static void appendBody(XWPFDocument src, XWPFDocument append) throws Exception { CTBody src1Body = src.getDocument().getBody(); CTBody src2Body = append.getDocument().getBody(); List<XWPFPictureData> allPictures = append.getAllPictures(); // Registrar ID de imágenes antes y después de fusionar Map<String, String> map = new HashMap<>() ; for (XWFPPictureData picture: allPictures) { private static void appendBody(CTBody src, CTBody append, Map<String, String> map) throws Exception { String before = append.getRelationId(picture); //Agregue las imágenes del documento original al documento de destino String after = src.addPictureData(picture.getData(), Document.PICTURE_TYPE_PNG); map.put(before, after); } //Este código resuelve principalmente el problema de fusionar errores de palabras, analizar y lanzar bombas de compresión ZipSecureFile.setMinInflateRatio( -1.0d ); appendBody(src1Body, src2Body, map); } XmlOptions optionsOuter = new XmlOptions(); optionsOuter.setSaveOuter(); String appendString = append.xmlText(optionsOuter); String srcString = src.xmlText(); String prefijo = 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("<")); // La siguiente parte se puede eliminar, la razón por la que agregué es que al fusionar, a veces hay un break Si no se abre, puede abrirlo normalmente eliminando algunas etiquetas según document.xml addPart = addPart.replaceAll("w14:paraId=\"[A-Za-z0-9]{1,10}\ "", ""); addPart = addPart.replaceAll("w14:textId=\"[A-Za-z0-9]{1,10}\"", ""); addPart = addPart.replaceAll("w :rsidP=\"[A-Za-z0-9]{1,10}\"", ""); addPart = addPart.replaceAll("w:rsidRPr=\"[A-Za-z0-9]{1,10}\"", ""); addPart = addPart.replace("<w:footerReference r:id=\"rId9\" w:type=\"default\"/>",""); addPart = addPart.replace("xsi:nil=\"true\"",""); if (map != null && !map.isEmpty()) { //Reemplace el ID de la imagen en la cadena xml por (Map.Entry<String, String> set : map.entrySet()) { addPart = addPart.replace(set.getKey(), set.getValue()); } } //Concatenar el contenido xml de dos documentos CTBody makeBody = CTBody.Factory.parse(prefix + mainPart + addPart + sufix); src.set(makeBody); } }
Si java combina dos contenidos de palabras de acuerdo con el marco
Supongo que te gusta
Origin blog.csdn.net/m0_57666466/article/details/130952027
Recomendado
Clasificación