精华内容
下载资源
问答
  • 2022-01-20 17:10:43

    背景:
    要求导出一个word,结果筛选出的打卡记录列表,一条打卡记录一页,里面包含图片。由于第一页的打卡记录前还需要显示工单的统计,所以采用双模板多文件合并的模式,第一页和内容各一个模板。

    问题:
    一开始是用getDocument().addNewBody().set()进行追加合并,导致图片会重复使用第一页的图片

    注:这里写入数据到XWPFDocument用的ParseWord07类是easypoi中的,底层都是poi。for循环中,一个map生成一个文档,都接着headDoc(头部文档)插入内容,实现多个文档拼接成一个

    XWPFDocument headDoc = new ParseWord07().parseWord(tempHeadPath, headMap);
    headDoc.createParagraph().setPageBreak(true);
    for (Map<String, Object> map : exportDataList) {
    	//合并内容
    	XWPFDocument contentDoc = new ParseWord07().parseWord(tempContentPath, map);
    	contentDoc.createParagraph().setPageBreak(true);
    	headDoc.getDocument().addNewBody().set(contentDoc.getDocument().getBody());
    }
    

    导出后发现每条记录的第一张图片都跟第一页的图片一样,多图片的记录除第一张图片能显示之外都没法显示。

    解决办法:
    记录图片合并前及合并后的ID,并用id匹配追加

    XWPFDocument headDoc = new ParseWord07().parseWord(tempHeadPath, headMap);
    headDoc.createParagraph().setPageBreak(true);
    for (Map<String, Object> map : exportDataList) {
    	//合并内容
    	XWPFDocument contentDoc = new ParseWord07().parseWord(tempContentPath, map);
    	contentDoc.createParagraph().setPageBreak(true);
    	WordPoiUtils.appendBody(headDoc, contentDoc);
    }
    

    WordPoiUtils

    /**
         * 两个文件对象进行追加
         * 备注: 解决word模板多页面导出每页中的图片均显示第一页中的图片
         *
         * @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(), picture.getPictureType());
                map.put(before, after);
            }
    
            appendBody(src1Body, src2Body, map);
    
        }
    
        /**
         * 把图片ID替换一下 避免冲突
         *
         * @param src
         * @param append
         * @param map
         * @throws Exception
         */
        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("<"));
    
            if (map != null && !map.isEmpty()) {
                //对xml字符串中图片ID进行替换
                // 下面注释掉的方式会发生图片id冲突
                // for (Map.Entry<String, String> set : map.entrySet()) {
                //     addPart = addPart.replace(set.getKey(), "RE:"+set.getValue());
                // }
                // addPart = addPart.replaceAll("RE:",");
    
                // 采用正则追加替换方式完美解决
                String patter = org.apache.commons.lang.StringUtils.join(map.keySet(), "|");
                Pattern compile = Pattern.compile(patter);
                Matcher matcher = compile.matcher(addPart);
                StringBuffer sb = new StringBuffer();
                while (matcher.find()) {
                    String value = map.get(matcher.group());
                    if (value != null) {
                        matcher.appendReplacement(sb, value);
                    }
                }
                matcher.appendTail(sb);
                addPart = sb.toString();
            }
            //将两个文档的xml内容进行拼接
            CTBody makeBody = CTBody.Factory.parse(prefix + mainPart + addPart + sufix);
            src.set(makeBody);
        }
    
    更多相关内容
  • 由于工作的需要,我需要为客户做个在线生成Excel及Word报表程序,参考了网上很多办法
  • Word邮件合并功能详解:合并后生成多个word文档,删除空白 最近在实习,干了很多打杂得工作,所以office软件用的很多很多,瞬间觉得自己可以去裸考计算机级了哈哈哈哈哈哈。今天因为工作用到了邮件合并这个功能...

    Word邮件合并功能详解:合并后生成多个word文档,删除空白页

    最近在实习,干了很多打杂得工作,所以office软件用的很多很多,瞬间觉得自己可以去裸考计算机二级了哈哈哈哈哈哈。今天因为工作用到了邮件合并这个功能,但又比我之前所学的更深一些,所以我来写下这一篇详解。

    一、预期达到效果

    这是一个信函模板,我要把其中标黄的部分也就是“乐业县”替换成Excel表中的县,如下图所示。

    一共是21个县,因此我要生成21个这样的基于模板的word文件,同时将所有文件命名为“关于将乐业县确认为2020年xxx的函”。

    二、我的操作步骤
    1. 首先我更改模板的各部分样式,同时把我需要的最后保存的文件名以白色文字在文件首行显示,把这行文字设置成 标题1。之所以把文字设成白色是为了和文档底色重合,达到一个隐形的效果 。

    2. 接着我们打开大纲视图,将显示级别选择为1级,我们可以看到一行白色的字,这就是我们刚刚修改格式的那行文字了。

    3. 接着我们就开始一段比较常见的邮件合并操作。首先选择邮件-开始邮件合并-普通word文档


      接着我们选择插入合并域,选择县名这一列,在需要插入的部分都插入县名。

      然后我们选择完成并合并,再选择编辑单个文档,就会生成一个总的word文档。

    4. 生成一个总文档后我们需要借助大纲视图把它拆分成多个word文件,同时以第一行白色字体命名各文件。

    5. 我们切换到大纲视图,把显示级别选为级别1,再选中所有的级别1。

    6. 接着我们选择显示文档-创建,这一步非常重要。

      创建完以后我们可以发现每一个标题1四周出现了一个方框,这就代表你的步骤是正确的。

    7. 最后我们使用快捷键 ctrl+s 来保存,注意新建一个文件夹,不然会搞混。文件名是自动生成的,也就是你的标题1。

    8. 现在打开保存的那个文件夹,我们可以发现所有文档都过来了。

    9. 我们打开其中一个看看什么效果。我们可以发现有一点小瑕疵,最后一页多了一个空白页,咋办呢?删呗。但我发现它不是分页符,也不能直接delete删除。

      我百度了很久觉得最简单的方法就是在倒数第二页右键选择字体再选择隐藏,这样最后的空白页就被删除了。

    三、结语

    这样整个过程就结束了。最近实习都没什么时间来学习新技术,等我学习了新技能再来分享。再见啦。

    本篇文章如有错的地方,欢迎在评论指正。喜欢在微信看技术文章,可以微信搜索「葫芦金水」,回复【Python】【前端基础】【vue开发】即可获得视频资源,回复【答辩PPT】【演讲PPT】即可获得超级实用PPT模板,还有更多资料,建议后台留言或者直接私信我。

    另,如果觉得这本篇文章写得不错,有点东西的话,各位人才记得来个三连【点赞+关注+分享】。

    展开全文
  • 1和2是两个文本文档,3是复制后生成的新文档:这个方法有一个弊端,即生成的新文档会有重复内容,需要手动重复的部分删除,并且第一个以后的文档内容会直接接在前一个文档的末尾,而不会自动换行,解决的办法是在...

    回答:

    1、若是文本文档,最简单的办法是在命令提示符下用copy命令复制,保存为一个新文件,如下图。1和2是两个文本文档,3是复制后生成的新文档:

    a325068da32d6d40a4485633459c50e2.gif

    这个方法有一个弊端,即生成的新文档会有重复内容,需要手动重复的部分删除,并且第一个以后的文档内容会直接接在前一个文档的末尾,而不会自动换行,解决的办法是在第二个以后的文档第一行前按一下回车,加一个空行。

    2、若是doc文档,可以用这样的方法合并(以下是在WPS中操作,Word中的操作与其相似):

    a、新建一个空白文档,然后点击“插入”菜单,在工具栏中找到“对象”,点击旁边的三角箭头,选择“文件中的文字”:

    5492c8adc4d1f96504bcd8ef76b9a955.gif

    b、进入保存多个文档的文件夹,选中要合并的doc文档(最好将文件名改为数字或字母,便于排序和按一定顺序合并,可按住Shift用鼠标选择,也可以按住Shift后,点击第一个文档,再按下方向键向下选):

    c02f6c300c20cd351083845da16c5817.gif

    c、点击上图中的“打开”按钮后,就得到一个合并了的文档:

    533e4e7b679d07657b1cbabab25cb6fd.gif

    若是各个文档的格式不一样,可以按照第一个文档的格式或者重新设置全部文档的格式,还可以加上小标题等。

    展开全文
  • Java 合并Word文档

    2021-03-09 04:26:49
    概述合并文档可以是将两个包含一定逻辑关系的文档合并成一个完整的文档,也...使用该方法合并文档时,被合并文档的内容默认从新的一页开始显示。方法2.获取文档1的最后一个section,然后将文档2中的段落作为新的段落...

    概述

    合并文档可以是将两个包含一定逻辑关系的文档合并成一个完整的文档,也可以是出于方便文档存储、管理的目的合并多个文档为一个文档。下面,就将以上文档操作需求,通过Java程序来实现Word文档合并。合并分两种方法来进行:

    方法1.加载两个文档,将文档2插入到文档1。使用该方法合并文档时,被合并文档的内容默认从新的一页开始显示。

    方法2.获取文档1的最后一个section,然后将文档2中的段落作为新的段落添加到section。新加入的文档承接上一个文档的最后一个段落末尾开始显示。

    使用工具

    Free Spire.Doc for Java (免费版)

    Jar文件获取及导入:

    获取方法1:通过官网下载文件包。解压文件后,将lib文件夹下的Spire.Doc.dll文件导入程序。

    获取方法2:通过maven导入,可参考导入方法。

    Java代码示例(供参考)

    【示例1】新起一页合并Word文档

    import com.spire.doc.*;

    public class Merge1 {

    public static void main(String[] args) {

    //加载文档1

    Document doc1 = new Document("test1.docx");

    //调用方法将文档2插入到文档1

    doc1.insertTextFromFile("test2.doc",FileFormat.Docx_2010);

    //保存合并后的文档

    doc1.saveToFile("Merged1.docx",FileFormat.Docx_2010);

    }

    }

    合并效果:

    e3b4c853ab7b0fbdad2888f9d5482db6.png

    【示例2】承接上文段落合并Word文档

    import com.spire.doc.*;

    public class Merge2 {

    public static void main(String[] args){

    //加载需要合并的两个文档

    Document doc1 = new Document("test1.docx");

    Document doc2 = new Document("test2.doc");

    //获取文档1的最后一节

    Section lastsec = doc1.getLastSection();

    //遍历文档2的所有段落内容,添加到文档1

    for (Section section:(Iterable )doc2.getSections()) {

    for (DocumentObject obj:(Iterable )section.getBody().getChildObjects()

    ) {

    lastsec.getBody().getChildObjects().add(obj.deepClone());

    }

    }

    //保存合并后的文档

    doc1.saveToFile("Merged2.docx",FileFormat.Docx_2010);

    }

    }

    合并效果:

    9aa3227699e7f052ff99d74f150ad3ea.png

    (本文完)

    转载请注明出处!

    展开全文
  • 概要:在我们日常办公中,经常会碰到需要删除文档中的某一页或者某几页的功能,「我的ABC软件工具箱」就实现了批量删除指定页的功能,可以轻松实现对 Word、PPT、PDF 文件的第一页、最后一页以及其他任何的指定页...
  • 常常需要一页打印多人的这些信息,如果一页只打印一个人的,那就太浪费纸张了。下面我们一起来学习如何打印多条记录。一、软件环境我的word是2010版本的,如果版本更高,那更好。电子表格是Excel2010的。很多人可能...
  • 前段时间我被分配到个关于poi操作的word的需求 ,大概的需求:前台页面上传的word的模板 我这个需求每次上传的word的模板格式不确定 ,再根据这个模板去解析word的占位符,是无法实现.所以之前打算用freemaker去...
  • python合并word

    2020-12-29 07:54:32
    1 场景合并多个word文件到个文件中,用于文件的批量打印。要求:每个文件合并时,均从从个新页面开始,文件之间的内容不连在一起。文件的样式不发生改变。2 方案采用python实现,使用python中的python-docx...
  • 《计算机word单项操作邮件合并(78题)》由会员分享,可在线阅读,更多相关《计算机word单项操作邮件合并(78题)(16珍藏版)》请在素问文库上搜索。1、邮件合并 7 8题 用Word的 邮件合并 功能 让...
  • 1、纵向合并单元格 //从第13行起(包括第13...//光标放在第13行的第一个单元格 object WdUnits = Microsoft.Office.Interop.Word.WdUnits.wdLine; object WdMovementType = Microsoft.Office.Interop.Word.WdMovemen
  • 合并word文件

    千次阅读 2018-09-11 12:47:37
    1.打开待合并1个word文档 将光标放置在文末尾 2.插入分节符 1)点击菜单栏的“页面布局”,接着点击“分隔符”下拉菜单,如下图所示: 2)选中分节符的“下一页”,结果如下图所示: 有的不显示分节符...
  • POI操作word填充数据,合并多个word个,遇到一些问题的解决 最近搞个向word模板中替换占位符 填充数据,然后将多个word合并在一起的方法。网上搜有很多资料,现在在这儿对过程中遇到的一些问题进行描述。 ...
  • 批量处理-循环语句、批量Word转PDF三、奇数插入空白PDF四、合并PDF 前言 初学python,主要目的是办公自动化,使用场景为日常办公,解决的问题为批量Word转PDF、合并PDF、奇数插空白(方便PDF合并后双面打印...
  • phpword合并单元格

    2021-03-23 12:30:00
    1. php合并单元格你嵌入html语言不就可以了吗 ?else{$sql = mysql_query("select * from price group by company ",$conn);while($row = mysql_fetch_array($sql)){?>
  • 使用该方法合并文档时,被合并文档的内容默认从新的一页开始显示。 方法2.获取文档1的最后一个section,然后将文档2中的段落作为新的段落添加到section。新加入的文档承接上一个文档的最后一个段落末尾开始显示。 ...
  • Java通过freemarker方式导出word文档的优缺点都很明显。 优点:操作简单,方便,word的模板的格式样式都被保留了下来。 缺点:需要有固定或者有规律的模板,如果要导出的表格当中不确定哪里是合并单元格用这种方法是...
  • Easypoi合并word工具类

    2021-02-25 10:36:01
    * word文件合并 * @param wordList * @return * @throws Exception */ public static XWPFDocument mergeWord(List<XWPFDocument> wordList) throws Exception{ if (CollectionUtils.isEmpty(wordList)...
  • 电脑Word文档中两个表格如何合并

    千次阅读 2021-07-28 05:07:22
    电脑Word文档中两个表格如何合并腾讯视频/爱奇艺/优酷/外卖 充值4折起Word文档是我们经常在工作学习中使用的软件,我们有的时候也会在Word文档中绘制表格。接下来小编就教大家怎么在Word文档中将两个表格拼接。...
  • 适合每页格式固定,添加文件新起一页的情况。可进行测试。 package could.com.hanwen.govapi.Test; import org.apache.commons.collections.CollectionUtils; import org.apache.poi.openxml4j.opc.OPCPackage; ...
  • Word翻页 去掉表格的横线
  • Q1:word中如何将两页变成一页把第二页的内容剪切粘贴在第一页上,然后选中第一页后的回车符删除即可Q2:一个表格在Word文档里被分成两页,要怎么合并为一页1、打开word文档后,我们依次点击“页面布局”--“页边距...
  • 怎样在word中设置试卷答案题目同时显示怎样在word中设置试卷答案题目同时显示 老师们在课堂上给学生评讲试卷时,都遇到个难题,那就是题目答案不能同时显示,每次讲完一道题就要回去查看答案,很不方便。...
  • Word/WPS 利用邮件合并批量生成文档

    千次阅读 2021-06-16 10:25:26
    Word/WPS 利用邮件合并批量生成文档WPS1. 先找到功能所有位置2. 准备用于批量生成的数据3. 插入数据批量生成文档4. 批量生成文档参考资料 WPS 准备个模板文档、组数据。通过邮件合并功能,将每行数据填入模板...
  • 使用Java合并多个word文档

    万次阅读 2018-08-24 15:11:12
    //打开第一个文件 Object doc = Dispatch .invoke( (Dispatch) docs, "Open", Dispatch.Method, new Object[] { (String) fileList.get(0), new Variant(false), new Variant(true) }, new int[3]).toDispatch();...
  • 前言: 有时我们的系统中有这样的需求:用户将文件上传到服务器,然后需要我们将...对于我们开发web系统的开发人员来说,只是需要将word文件合并或者其他一些简单操作,就要学习如此多的技术,未免学习成本太大。 ...
  • word怎么将图片合并

    万次阅读 2020-12-30 05:41:50
    Word中怎么把图片文字组合在一起在word2010中,图片要文字组合,方法如下: 方法:打开word2010,点击”插入“,选择”图片“;在”插入图片“的界面上,点击选中特定的图片后,点击”插入“;可以右击插入...
  • 、如何在word中创建表格1.选择“插入”选项卡,单击“表格”按钮,在弹出的列表框中选择“插入表格”命令。2.在弹出的“插入表格”对话框中,对列数、行数进行设置,这里我们设置“列数”为“5”,“行数”为“6”...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 34,096
精华内容 13,638
关键字:

word第一页和第二页合并