精华内容
下载资源
问答
  • Java POI合并多个word文件

    万次阅读 热门讨论 2018-09-17 14:29:04
    对于多个docx文件,可以使用POI合并生成一个组合的docx文件,这个方法分享给大家。不过对于docx文件中存在有图片的文档,此种方法没有做处理,需要的朋友可以自己扩展一下。 import java.io.FileNotFoundException...

    对于多个docx文件,可以使用POI合并生成一个组合的docx文件,这个方法分享给大家。不过对于docx文件中存在有图片的文档,此种方法没有做处理,需要的朋友可以自己扩展一下。

    import java.io.FileNotFoundException;
    import java.io.FileOutputStream;
    import java.io.IOException;
    import java.io.OutputStream;
    import java.util.ArrayList;
    import java.util.List;
    
    import org.apache.commons.io.IOUtils;
    import org.apache.poi.openxml4j.opc.OPCPackage;
    import org.apache.poi.xwpf.usermodel.XWPFDocument;
    import org.apache.xmlbeans.XmlOptions;
    import org.openxmlformats.schemas.wordprocessingml.x2006.main.CTBody;
    /**
     * 合并两个docx文档方法,对文档包含的图片无效
     * @author laitong.ma
     * @date 2018年9月17日
     */
    public class POIMergeDocUtil {
    	public static void main(String[] args) throws Exception {
    		
    		String[] srcDocxs = {"e:\\waxz_1.docx","e:\\waxz_2.docx","e:\\waxz_3.docx"};
    		String destDocx = "e:\\wzxz_new.docx";
    		mergeDoc(srcDocxs, destDocx);
    	}
    	/**
    	 * 合并docx文件
    	 * @param srcDocxs 需要合并的目标docx文件
    	 * @param destDocx 合并后的docx输出文件
    	 */
    	public static void mergeDoc(String[] srcDocxs,String destDocx){
    		
    		OutputStream dest = null;
    		List<OPCPackage> opcpList = new ArrayList<OPCPackage>();
    		int length = null == srcDocxs ? 0 : srcDocxs.length;
    		/**
    		 * 循环获取每个docx文件的OPCPackage对象
    		 */
    		for (int i = 0; i < length; i++) {
    			String doc = srcDocxs[i];
    			OPCPackage srcPackage =  null;
    			try {
    				srcPackage = OPCPackage.open(doc);
    			} catch (Exception e) {
    				e.printStackTrace();
    			}
    			if(null != srcPackage){
    				opcpList.add(srcPackage);
    			}
    		}
    		
    		int opcpSize = opcpList.size();
    		//获取的OPCPackage对象大于0时,执行合并操作
    		if(opcpSize > 0){
    			try {
    				dest = new FileOutputStream(destDocx);
    				XWPFDocument src1Document = new XWPFDocument(opcpList.get(0));
    				CTBody src1Body = src1Document.getDocument().getBody();
    				//OPCPackage大于1的部分执行合并操作
    				if(opcpSize > 1){
    					for (int i = 1; i < opcpSize; i++) {
    						OPCPackage src2Package = opcpList.get(i);
    						XWPFDocument src2Document = new XWPFDocument(src2Package);
    						CTBody src2Body = src2Document.getDocument().getBody();
    						appendBody(src1Body, src2Body);
    					}
    				}
    				//将合并的文档写入目标文件中
    				src1Document.write(dest);
    			} catch (FileNotFoundException e) {
    				e.printStackTrace();
    			} catch (IOException e) {
    				e.printStackTrace();
    			} catch (Exception e) {
    				e.printStackTrace();
    			}finally{
                    //注释掉以下部分,去除影响目标文件srcDocxs。
    				/*for (OPCPackage opcPackage : opcpList) {
    					if(null != opcPackage){
    						try {
    							opcPackage.close();
    						} catch (IOException e) {
    							e.printStackTrace();
    						}
    					}
    				}*/
    				//关闭流
    				IOUtils.closeQuietly(dest);
    			}
    		}
    		
    		
    	}
    	
    	/**
    	 * 合并文档内容
    	 * @param src 目标文档
    	 * @param append 要合并的文档
    	 * @throws Exception
    	 */
    	private static void appendBody(CTBody src, CTBody append) throws Exception {
    		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 = CTBody.Factory.parse(prefix + mainPart + addPart
    				+ sufix);
    		src.set(makeBody);
    	}

     

    展开全文
  • 相同格式的excel进行合并,或者对多个word文档进行合并word文档包含图片。
  • 资源描述了poi对于word的操作,poi合并word文档,poi设置word页码,内含maven依赖文档和完整代码,是一个完整工程,打开即可用
  • 左边模板右边输出的文件: 下面贴源码: package com.hidata.tool; import java.io.File; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.IOException; import java.util....

     一、替换模板内容

    咱们那先看效果:

    左边模板右边输出的文件:

    下面贴源码:

    package com.hidata.tool;
    
    import java.io.File;
    import java.io.FileInputStream;
    import java.io.FileOutputStream;
    import java.io.IOException;
    import java.util.ArrayList;
    import java.util.HashMap;
    import java.util.List;
    import java.util.Map;
    
    public class Test {
    
       public static void main(String[] args) throws IOException {
    
          Map<String, Object> wordDataMap = new HashMap<String, Object>();// 存储报表全部数据
          Map<String, Object> parametersMap = new HashMap<String, Object>();// 存储报表中不循环的数据
    
    
    
          List<Map<String, Object>> table1 = new Ar
    展开全文
  • 使用POI合并.docx文件内容工具类(不支持Word2003的.doc) 前言 需求是要把多个Word文件根据顺序合并为一个,找到poi有相关的方法可以做,这里整合一个工具类备用,依赖了poi-ooxml 3.17 依赖 <dependency> &...

    使用POI合并.docx文件内容工具类(不支持Word2003的.doc)

    前言

    需求是要把多个Word文件根据顺序合并为一个,找到poi有相关的方法可以做,这里整合一个工具类备用,依赖了poi-ooxml 3.17

    依赖

    <dependency>
        <groupId>org.apache.poi</groupId>
        <artifactId>poi-ooxml</artifactId>
        <version>3.17</version>
    </dependency>
    <dependency>
        <groupId>org.apache.poi</groupId>
        <artifactId>poi</artifactId>
        <version>3.17</version>
    </dependency>
    

    工具类代码

    package com.jsw.jinzhi.oa.common.utils.word;
    
    import com.google.api.client.util.Lists;
    import org.apache.poi.openxml4j.opc.OPCPackage;
    import org.apache.poi.xwpf.usermodel.Document;
    import org.apache.poi.xwpf.usermodel.XWPFDocument;
    import org.apache.poi.xwpf.usermodel.XWPFPictureData;
    import org.apache.xmlbeans.XmlOptions;
    import org.openxmlformats.schemas.wordprocessingml.x2006.main.CTBody;
    
    import java.io.File;
    import java.io.FileInputStream;
    import java.io.FileOutputStream;
    import java.io.OutputStream;
    import java.util.ArrayList;
    import java.util.HashMap;
    import java.util.List;
    import java.util.Map;
    
    /**
     * @program: xxxxxxxxxx
     * @description: 合并.docx文件工具类,不支持.doc文件
     * @author: Husky
     * @create: 2021-03-16
     **/
    public class AppendDocx {
    
    	/**
    	 * 用于多个合并.docx文件,不支持.doc文件
    	 * @param outputStream 导出文件输出流
    	 * @param sourceFilePathList 需合并的文件路径集合
    	 */
    	public static void appendDocx(OutputStream outputStream, List<String> sourceFilePathList) {
    		try {
    			ArrayList<XWPFDocument> documentList = new ArrayList<>();
    			XWPFDocument doc = null;
    			for (String path : sourceFilePathList) {
    				FileInputStream in = new FileInputStream(path);
    				OPCPackage open = OPCPackage.open(in);
    				XWPFDocument document = new XWPFDocument(open);
    				documentList.add(document);
    			}
    			for (int i = 0; i < documentList.size(); i++) {
    				doc = documentList.get(0);
    				if (i != 0) {
    					appendBody(doc, documentList.get(i));
    				}
    			}
    			doc.write(outputStream);
    		} catch (Exception e) {
    			e.printStackTrace();
    		}
    	}
    
    	/**
    	 * 用于合并两个XWPFDocument对象
    	 * @param src
    	 * @param append
    	 * @throws Exception
    	 */
    	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();
    		// 记录图片合并前及合并后的ID
    		Map<String, String> map = new HashMap<>();
    		for (XWPFPictureData picture : allPictures) {
    			String before = append.getRelationId(picture);
    			//将原文档中的图片加入到目标文档中
    			String after = src.addPictureData(picture.getData(), Document.PICTURE_TYPE_PNG);
    			map.put(before, after);
    		}
    
    		appendBody(src1Body, src2Body, map);
    
    	}
    
    	private static void appendBody(CTBody src, CTBody append, Map<String, String> map) throws Exception {
    		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("<"));
    //下面这部分可以去掉,我加上的原因是合并的时候,有时候出现打不开的情况,对照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:headerReference r:id=\"rId8\" w:type=\"default\"/>","");
    		addPart = addPart.replace("<w:footerReference r:id=\"rId9\" w:type=\"default\"/>","");
    		addPart = addPart.replace("xsi:nil=\"true\"","");
    
    		if (map != null && !map.isEmpty()) {
    			//对xml字符串中图片ID进行替换
    			for (Map.Entry<String, String> set : map.entrySet()) {
    				addPart = addPart.replace(set.getKey(), set.getValue());
    			}
    		}
    		//将两个文档的xml内容进行拼接
    		CTBody makeBody = CTBody.Factory.parse(prefix + mainPart + addPart + sufix);
    
    		src.set(makeBody);
    	}
    }
    
    
    展开全文
  • poi合并多个word为一个

    2021-06-02 23:11:52
    import org.apache.poi.openxml4j.opc.OPCPackage; import org.apache.poi.xwpf.usermodel.Document; import org.apache.poi.xwpf.usermodel.XWPFDocument; import org.apache.poi.xwpf.usermodel.XWPFPictureData; ...

     

    import org.apache.poi.openxml4j.opc.OPCPackage;
    import org.apache.poi.xwpf.usermodel.*;
    import org.apache.xmlbeans.XmlOptions;
    import org.openxmlformats.schemas.wordprocessingml.x2006.main.CTBody;
    
    import java.io.File;
    import java.io.FileInputStream;
    import java.io.FileOutputStream;
    import java.io.OutputStream;
    import java.util.ArrayList;
    import java.util.HashMap;
    import java.util.List;
    import java.util.Map;
    import java.util.regex.Matcher;
    import java.util.regex.Pattern;
    
    public class test {
        public static void main (String[] args) throws Exception {
    
            File newFile = new File("G:/合并的之后生成的文件.docx");
            List<File> srcfile = new ArrayList<File>();
            File file1 = new File("G:/龙.docx");
            File file2 = new File("G:/龙1.docx");
            //File file3 = new File("F:\\report\\step3\\substep9-4.docx");
            //File file4 = new File("F:\\report\\step2\\substep3.docx");
            srcfile.add(file1);
            srcfile.add(file2);
    
            //srcfile.add(file3);
            //srcfile.add(file4);
                OutputStream dest = new FileOutputStream(newFile);
                ArrayList<XWPFDocument> documentList = new ArrayList<XWPFDocument>();
                XWPFDocument doc = null;
                for (int i = 0; i < srcfile.size(); i++) {
                    FileInputStream in = new FileInputStream(srcfile.get(i).getPath());
                    OPCPackage open = OPCPackage.open(in);
                    XWPFDocument document = new XWPFDocument(open);
                    documentList.add(document);
                }
                for (int i = 0; i < documentList.size(); i++) {
                    doc = documentList.get(0);
                    if(i != 0){
                       // documentList.get(i).createParagraph().setPageBreak(true);
                       // documentList.get(i).createParagraph().setPageBreak(true);//实现了分页效果。//但是会出现在首行为空的情况
                        documentList.get(i).createParagraph().createRun().addBreak(BreakType.PAGE);//现了分页效果。使用这种方式不会出现留白的情况
                        appendBody(doc,documentList.get(i));
                    }
                }
    
                doc.write(dest);//输出合并之后的文件
    
        }
    
        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();
            // 记录图片合并前及合并后的ID
            Map<String,String> map = new HashMap();
            for (XWPFPictureData picture : allPictures) {
                String before = append.getRelationId(picture);
                //将原文档中的图片加入到目标文档中
                String after = src.addPictureData(picture.getData(), Document.PICTURE_TYPE_PNG);
                map.put(before, after);
            }
    
            appendBody(src1Body, src2Body,map);
    
        }
    
        private static void appendBody(CTBody src, CTBody append,Map<String,String> map) throws Exception {
            XmlOptions optionsOuter = new XmlOptions();
            optionsOuter.setSaveOuter();
            String appendString = append.xmlText(optionsOuter);
    
    //去掉追加word内容中的 w:sectPr 标签,确保合成的word中只有一个 w:sectPr 标签对,避免合成的word文档打开之后会提示有些内容读不出来,导致文件损坏
            String rgex = "<[\\s]*?w:sectPr[^>]*?>[\\s\\S]*?<[\\s]*?\\/[\\s]*?w:sectPr[\\s]*?>";
            appendString = appendString.replaceAll(rgex, "");
    
            String srcString = src.xmlText();
            String regex = regex(srcString, "w:sectPr");
            System.out.println(regex);
            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("<"));
    
            if (map != null && !map.isEmpty()) {
                //对xml字符串中图片ID进行替换
                for (Map.Entry<String, String> set : map.entrySet()) {
                    addPart = addPart.replace(set.getKey(), set.getValue());
                }
            }
            //将两个文档的xml内容进行拼接
            CTBody makeBody = CTBody.Factory.parse(prefix+mainPart+addPart+sufix);
    
            src.set(makeBody);
        }
    
        /** 获取指定标签中的内容
         * @param xml
         * @param label
         * @return
         */
        public static String regex(String xml, String label) {
            String context = "";
            // 正则表达式
            String rgex = "<" + label + "[^>]*>((?:(?!<\\/" + label + ">)[\\s\\S])*)<\\/" + label + ">";
            Pattern pattern = Pattern.compile(rgex);// 匹配的模式
            Matcher m = pattern.matcher(xml);
            // 匹配的有多个
            List<String> list = new ArrayList<String>();
            while (m.find()) {
                int i = 1;
                list.add(m.group(i));
                i++;
            }
            if (list.size() > 0) {
                // 输出内容自己定义
                context = String.valueOf(list.size());
            }
            return context;
        }
    }

     

     

     注意,

    如果要合并的文档中存在批注的话合成的文件,打开之后会报错的,因为项目没有这个需求所以,目前没有解决

     

    展开全文
  • 需求,今天有个需求,实现word文档批量导出,并附带图片...这里稍微剖析下原理:上面合并的原理是,将word文档转换为xml字符串,然后把要合并的文档的xml进行拼接,生成新的文档。之所以图片无法合并是因为xml只保存...
  • 找了好几个,都有瑕疵,要不图片问题,要不合并后打不开 总结两个问题: ... 2.合并后打不开,参考帖子:https://www.cnblogs.com/himonkey/p/11110726.html ...3.pot-ti 可以替换模板内容,进行word 追加 ...
  • 最近需要做一个java合并wrod的实现方法,网上查了看看发现有的方法word里的图片没办法正确的合并到目标文件。后来又查了下,综合了一下自己写了个测试方法,顺手记了一下。 package ...
  • POI-TL合并多个Word文档

    2021-06-27 23:13:49
    POI-TL合并多个Word文档
  • 使用poi将多个word合并

    2019-03-25 11:10:44
    使用poi将多个word合并,本方法经过测试,目前只支持多个doc格式合并成一个doc,如果是docx格式生成后打不开
  • 在线Api: http://poi.apache.org/apidocs/5.0/ 问题总结 XWPFRun 分段问题 在指定位置填充表格 在表格里面插入表格 插入图片 未解决的问题: 在word里面插入附件 解决问题 XWPFRun 分段问题 例如我要替换word里面...
  • 如图1,现在需要将每一行数据的内容,填写到对应的word文档中,并将入库照片编号对应的照片插入对应位置,如图2,最后要求不能生成单个的word文档,因为文档个数多了,不方便整理和打印,需要合并成一个或者多个;...
  • poi操作Word合并单元格

    千次阅读 2017-08-11 14:21:07
    对于合并单元格的介绍不怎么多,下面是之前做word导出的时候研究的,在stackoverflow查到了点资料。 记录下两个关键方法: [java] view plain copy // word跨列合并单元格   ...
  • Java POI实现word合并

    2020-10-21 14:38:23
    import org.apache.poi.openxml4j.opc.OPCPackage; import org.apache.poi.xwpf.usermodel.BreakType; import org.apache.poi.xwpf.usermodel.Document; import org.apache.poi.xwpf.usermodel.XWPFDocument; import...
  • 文章目录SpringBoot整合poi实现Word文件的导出1、引入Maven依赖2、封装WordUtils工具类3、Word导出应用案例 SpringBoot整合poi实现Word文件的导出 1、引入Maven依赖 <dependency> <groupId>org....
  • 目录 问题描述: 问题发现: 问题排查: 解决具体方法 ...java后端使用 Apache 的 POI导出 Word,涉及到两个 Word 模板合并的时候,合并后的文件打开出现下图中的问题! 问题发现: 找了一圈...
  • word合并全家桶,包括横页和竖页兼容合并,里面包含使用文件格式转换,rtf转换为标准的word格式或者其他类型转换,jacob合并word案例及jar包,docx4j合并word案例及jar包,还有poi合并,以及Plutext-Enterprise-3.3.0.6...
  • POI操作word填充数据,合并多个word为一个,遇到一些问题的解决 最近搞一个向word模板中替换占位符 填充数据,然后将多个word合并在一起的方法。网上一搜有很多资料,现在在这儿对过程中遇到的一些问题进行描述。 ...
  • 使用poi,pageOffice合并word操作。主要区别在于 poi可以进行后台操作,通过各种各样APi接口,直接进行文件io读写操作,,可用于后台操作,pageoffice需要前端预览后保存(根据封装列子,源码修改另行解决)。 poi...
  • java poi 合并单元格

    千次阅读 2017-06-02 16:23:55
    poi导出excel的,动态合并单元格
  • 前段时间我被分配到一个关于poi操作的word的需求 ,大概的需求:前台页面上传的一个word的模板 我这个需求每次上传的word的模板格式不确定 ,再根据这个模板去解析word的占位符,是无法实现.所以之前打算用freemaker去...
  • 目录 效果 所有源码获取方式 pom依赖 加载文档 页眉页脚 页面边距 ...-- https://mvnrepository.com/artifact/org.apache.poi/poi --> <dependency> <groupId>org.apache.p..
  • POI读取Word文件之后,文件一直被占用,无法删除 使用poi读取word文件之后,文件就无法删除,一直正在使用 在操作完word文件之后也关闭了流,并在操作完成之后删除源文件,代码看着好像是没有问题 ...
  • 事先把题库中的每一道试题都已经保存成一个独立的word文件了,但是在选择了部分试题生成一张word试卷的时候,如果不能通过java程序来合并已经选择了的word试题文件,那么就只能通过手动录入和拷贝的方式来合并word...
  • 亲测 使用POI的 **[NiceXWPFDocument](http://deepoove.com/poi-tl/apache-poi-guide.html#_word%E5%90%88%E5%B9%B6)** 进行word文档合并,文档中的图片、表格、各种统计图(饼状、折线、条形...)、文字,都能很...
  • poi合并docx文档

    2020-01-17 10:15:27
    poi合并docx文档 package com.pdf.pdfdemo; import org.docx4j.jaxb.Context; import org.docx4j.openpackaging.exceptions.Docx4JException; import org.docx4j.openpackaging.packages.WordprocessingMLPackage; ...
  • 学习分享:POI-TL 导出Word复杂表格合并分享

    千次阅读 多人点赞 2021-01-11 15:39:35
    最近在做项目时候遇到的一个关于导出Word文件的需求,数据展示可以根据POI-TL的官方的文档还是可以做出来的,但是有一些表格的合并处理poi-tl只是给了简单例子,前期的学习可以参考POI-TL(htt
  • 使用POI读写word doc文件

    千次阅读 2016-05-06 14:11:09
    Apache poi的hwpf模块是专门用来对word doc文件进行读写操作的。在hwpf里面我们使用HWPFDocument来表示一个word doc文档。在HWPFDocument里面有这么几个概念: l Range:它表示一个范围,这个范围可以是整个文档...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 2,185
精华内容 874
关键字:

poi合并文件word