精华内容
下载资源
问答
  • 如何删除Word文档中的全部超链接

    千次阅读 2018-04-28 21:25:30
    对于Word中的超链接也不是没有办法删除,使用插入菜单下超链接选项下的删除超链接是可以删除Word中的超链接的,但是如果一个Word文档中的超链接太怎么办呢?一个一个地删除确实很累人也很烦人,使用下面的方法就...

    本文内容整理来源网上搜索。

    网页上很多内容都是带有超链接的,在把这些内容复制到Word中的时候,里面很多文字和图片都带有超链接,这些超链接是不会自动去掉的。

    对于Word中的超链接也不是没有办法删除,使用插入菜单下超链接选项下的删除超链接是可以删除Word中的超链接的,但是如果一个Word文档中的超链接太多怎么办呢?一个一个地删除确实很累人也很烦人,使用下面的方法就可以把Word中的超链接全部快速地删除。

    方法一:Ctrl+Shift+F9快捷键删除Word文档中超链接

    先把内容复制到WORD中,这个时候是带有超链接的,全选复制过来的内容,快捷键是 Ctrl+A,然后再按快捷键Ctrl+Shift+F9WORD文档中所有的超链接都删除了。

    方法二:设置粘贴选项删除Word文档中超链接

    选择编辑菜单中的选择性粘贴,选择无格式文本,粘贴到Word中的就是不带任何超链接的纯文字了。 其实一个比较简单的办法是先粘贴在记事本里,然后再拷贝粘贴进Word。如果你用的是word2003,粘贴后在底下选择仅保留文本就可以了。

    方法三:宏命令实现删除Word文档中超链接

    好多时候,我们在网上收集资料,常常保留着许多超链接,下面的方法告诉我们如何使用Word宏实现删除Word文档中的所有超链接。

    1)打开Word的菜单 工具->->Visual Basic 编辑器,或直接按快捷键 Alt+F11,打开Visual Basic 编辑器。

    2)在左侧的工程中右单击你要实现删除超链接的文档工程,插入”-“模块。 注:一般我们是设置在normal模板工程中

    3)在打开的模块窗口中粘贴下面的代码: Sub RemoveHyperlinks() Dim oField As Field For Each oField In ActiveDocument.Fields If oField.Type = wdFieldHyperlink Then oField.Unlink End If Next Set oField = Nothing End Sub [Ctrl+A 全部选择 提示:你可先修改部分代码,再按运行]

    4)保存,返回到你的当前文档。

    5)测试使用: 打开工具”-“”-"宏命令,找到刚完成的"RemoveHyperlinks", 单击运行,就看到效果了。 这个时候就会看到刚才的超链接已经去掉,测试成功。

     

    展开全文
  • 项目目的  目前,Office文件的在线处理越来越深入人心,越来越的办公系统Word文档都采用了SOAOffice中间件来在线打开保存,同时也产生了一些更好、更高级的需求,本文所讨论的正是这样的一需求:...

     本文通过一个实用例子完整演示如何在线打开word文档并高亮显示指定的关键文字。

    1. 项目目的

         目前,Office文件的在线处理越来越深入人心,越来越多的办公系统中的Word文档都采用了SOAOffice中间件来在线打开保存,同时也产生了一些更好、更高级的需求,本文所讨论的正是这样的一个需求:

    打开文档的时候,高亮显示指定的关键字。

    搜索结果高亮显示关键字。

    2. 思路

    写一个查找函数,可以在查找结束的时候,高亮显示所有的关键字,如果要求打开文档的时候就高亮显示的话,可以在文档打开的事件中处理;如果要高亮显示多个不同的关键字的话,可以用这个函数进行多次的搜索。

    3. 关键函数

    function  MarkKeyWord(value)

    {

        var appSlt = document.getElementById("SOAOfficeCtrl").Document.Application.Selection;

        appSlt.HomeKey(6); // 设置文档中的光标到文件首。

        appSlt.Find.ClearFormatting();

        appSlt.Find.Replacement.ClearFormatting();

        appSlt.Find.Text = value;

       while (appSlt.Find.Execute()){

            appSlt.Range.HighlightColorIndex = 7; // 高亮时的背景色

        }

        appSlt.HomeKey(6);

    }

    4. 示例程序架构

    这里使用ASP.NET示例,关键代码就是上面的那个函数,用什么开发语言都可以做这个效果,这个应用也不涉及到保存,为了简单,保存的代码也忽略掉了。

    Demo/

    |---- Highlight.aspx       // 打开文档的页面

    |---- Highlight.aspx.cs

    Doc/                //存放文档的目录

            |-- test.doc        //测试文件,test.asp就是打开的这个文件

    5. 代码编写

    Highlight.aspx

    ************************

    <%@ Page Language="C#" AutoEventWireup="true" CodeFile="Highlight.aspx.cs" Inherits="Highlight" %>

     

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

     

    <html xmlns="http://www.w3.org/1999/xhtml">

    <head runat="server">

        <title>Highlight</title>

        <script type="text/javascript">

            function  MarkKeyWord(value)

            {

                   var appSlt = document.getElementById("SOAOfficeCtrl").Document.Application.Selection;

                   appSlt.HomeKey(6);

                       appSlt.Find.ClearFormatting();

                       appSlt.Find.Replacement.ClearFormatting();

                   appSlt.Find.Text = value;

     

                 while (appSlt.Find.Execute())

                   {

                          appSlt.Range.HighlightColorIndex = 7;

                   }

                   appSlt.HomeKey(6);

            }

        </script>

    </head>

    <body>

        <form id="formData" runat="server" method="post">

        <div>

       

        </div>

        <!--**************   SOAOFFICE 客户端代码开始    ************************-->

           <SCRIPT language="JavaScript" event="OnInit()" for="SOAOfficeCtrl">

                  // 控件打开文档前触发,用来初始化界面样式

           </SCRIPT>

           <SCRIPT language="JavaScript" event="OnDocumentOpened(str, obj)" for="SOAOfficeCtrl">

                  // 控件打开文档后立即触发,添加自定义菜单,自定义工具栏,禁止打印,禁止另存,禁止保存等等

                  bDocOpen = true;

                  MarkKeyWord("");

           </SCRIPT>

           <SCRIPT language="JavaScript" event="OnDocumentClosed()" for="SOAOfficeCtrl">

                  bDocOpen = false;

           </SCRIPT>

           <SCRIPT language="JavaScript" event="OnUserMenuClick(index, caption)" for="SOAOfficeCtrl">

                  // 添加您的自定义菜单项事件响应

           </SCRIPT>

           <SCRIPT language="JavaScript" event="OnCustomToolBarClick(index, caption)" for="SOAOfficeCtrl">

                  // 添加您的自定义工具栏按钮事件响应

           </SCRIPT>   

        <!--   OBJECT标签,客户端控件引用    -->

           <OBJECT id="SOAOfficeCtrl" codeBase="SOAOffice.ocx#version=8,1,0,0" height="100%" width="100%"

               data="" classid="clsid:83171BA4-BDCA-42a8-BE44-745ABF36EB7E" VIEWASTEXT>

               <div align="center" STYLE="color:red;">

               本机尚未安装SOAOFFICE客户端控件,请安装浏览器上方黄色提示条或弹出提示框中的SOAOFFICE客户端控件。</div>

               </OBJECT>

        <!--**************   SOAOFFICE客户端代码结束   ************************-->

        </form>

    </body>

    </html>

     

     

     

    Highlight.aspx.cs

     ******************

    // 仅在Page_Load中添加下面的代码即可

    protected void Page_Load(object sender, EventArgs e)

        {

            //-----------  SOAOFFICE 服务器端编程开始  -------------------//

     

            // 首先确保引用SOAOFFICE中间件的服务器端.NET组件SOAOfficeX

            // SOAOfficeX.dll 在本示例代码的 bin 文件夹下

            SOAOfficeX.SOAOfficeCtrl SOACtrl = new SOAOfficeX.SOAOfficeCtrl();

     

            // 设置SOAOFFICE中间件服务页面

            SOACtrl.ServerURL = "soaservice/soaserv.aspx";

            SOACtrl.SaveDocURL = "SaveDoc.aspx";

     

            SOACtrl.WebOpen("doc/test.doc", SOAOfficeX.soaWorkMode.docNoRevision, "somebody", "Word.Document");

            //-----------  SOAOFFICE 服务器端编程结束  -------------------//

     

        }

    6. 思路拓展

           利用这个技术(主要是MarkKeyWord函数),其一,可以实现在文档打开以后的任何时候执行搜索高亮显示,不一定是在文档的的同时;其二,可以高亮显示关键字,那么也就可以取消高亮显示,这样又可以重新搜索高亮显示其他的关键字;其三,可以同时高亮显示多个关键字,只需要设置不同的高亮颜色就可以了,修改HighlightColorIndex的值:

    appSlt.Range.HighlightColorIndex = 7;  // 黄色

    本文完整的示例代码请下载:

    http://www.kehansoft.com/web/shared/democode/mark_key_word2.rar

    转摘声明:转摘请注明出处并做回链。

     

    展开全文
  • 背景一天,产品经理递给我了一份word报告,我定睛一看 这个文档有大大小小的标题层级,还有排版好的段落、各种一目了然的饼图、走势图,当然还少不了颜色循环交替的报表。精致程度不亚于小明同学的学习报告。 准备 ...

    2503d96b8584778410a9f47173bd040c.png
    推荐:亲身体验,数次踩坑,遂撰写此文,以备各位不时之需。

    背景

    一天,产品经理递给我了一份word报告,我定睛一看

    a98bb58d888c13e14c9cecaddff686df.png

    这个文档有大大小小的标题层级,还有排版好的段落、各种一目了然的饼图、走势图,当然还少不了颜色循环交替的报表。精致程度不亚于小明同学的学习报告。

    011b09939195ffa1ca4563800604bdfe.png

    准备

    鲁迅:身为一名Java程序员,任何时候都不要忘记站在巨人的肩膀上。

    df60a22d07b6dd6b125399cb16e784ba.png

    通过某歌搜索关键词:java+word+导出,我立马得出了很多成熟的方案,通过横向、纵向比较,再结合本次报告样式比较多、用户可灵活选择不同模块导出的特点,最终,我决定使用Freemarker 动态替换模版数据来导出word文档。至于导出文档的最终格式,有两种选择:

    4bb96a8fa562e6ca5da4406051b4f424.png

    那到底使用doc还是docx格式的文档? 每当人生当中每次面临选择我都很慎重。最终我选择使用docx格式(原因文末会讲),但是为了让大家有更多的选择,满足更多的业务场景,借此机会,小明会给大家分别介绍使用freemarker导出两种格式的word文档方式。

    思路

    FreeMarker是一个基于Java的模板引擎,最初专注于使用MVC软件架构生成动态网页。但是,它是一个通用的模板引擎,不依赖于servlets或HTTP或HTML,因此它通常还用于生成源代码,配置文件或电子邮件。

    此时,我们用它动态生成xml文件,进而导出word文档。

    a16f111b594f4c58e38170d7a162eaf3.png

    整体流程如下:

    6826a89126f678ee74f741a3e1694c30.png

    准备

    • WPS 由金山软件股份有限公司发布,用于办公软件最常用的文字编辑、表格、演示稿等功能。

    对,就是这个国产的办公软件。我也是第一次发现在导出文档这件事上,它如多年好友般友好。(word解析后的xml文件阅读性很强,一般人我不告诉他) * 开发工具(IDEA、Visual Studio Code等) 你喜欢的,顺手的,就是最好的。

    实现

    集成Freemarker模版引擎

    本次项目使用的框架依旧是Springboot,这个框架在集成各个组件表现都很便捷,不再赘述,这次集成Freemarker也不例外。 * 首先我们在项目中增添依赖spring-boot-starter-freemarker pom.xml文件如下所示:

    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-freemarker</artifactId>
    </dependency>
    • 按照默认约定,我们可以在resources下创建一个templates文件夹(查看FreeMarkerProperties源码可以发现默认目录就是这个),用于存放模版文档。

    ef51f8d9854296c34cc4087c825f0056.png
    • application.yml增加配置
    spring:
      freemarker:
        template-loader-path: classpath:/templates
        cache: false # 开发环境缓存关闭
        suffix: xml
        charset: UTF-8

    生成doc格式的文档

    这里先拿使用freemarker导出doc格式的word文档举例。 首先将docxTemplate.docx(调整好样式的模版文档)另存为WORD 2003 XML文档(.xml)

    8b6282ca01484a26dba122ec7e4f8bde.png

    此处命名为docTemplete.xml,使用编辑工具首次打开时,会发现这个文档里面是压缩的xml,因此我们首先需要格式化一下。

    注意:如果你使用的是Visual Studio Code开发工具,一定要检查你所使用的xml格式化插件,是否会优化你的xml标签 。比如:<w:rPr>会变成<rPr>。使用Visual Studio Code的同学,oh my god ! 小明在这里推荐大家使用这个插件:XML Language Support by Red Hat * 现在,我们就使用freemarker语法编辑docTemplete.xml,比如使用占位符${}替换当前文档中的文本,以达到动态生成文本的目的,直接上代码。
    public static Configuration getConfiguration(){
            //创建配置实例
            Configuration configuration = new Configuration(Configuration.VERSION_2_3_28);
            //设置编码
            configuration.setDefaultEncoding("utf-8");
            configuration.setClassForTemplateLoading(WordUtil.class, "/templates");
            return configuration;
    }
    
        /**
         * 生成doc文件
         *
         * @param ftlFileName 模板ftl文件的名称
         * @param params      动态传入的数据参数
         * @param outFilePath 生成的最终doc文件的保存完整路径
         */
        public void ftlToDoc(String ftlFileName, Map params, String outFilePath) {
            try {
                /** 加载模板文件 **/
                Template template = configuration.getTemplate(ftlFileName);
                /** 指定输出word文件的路径 **/
                File docFile = new File(outFilePath);
                FileOutputStream fos = new FileOutputStream(docFile);
                Writer bufferedWriter = new BufferedWriter(new OutputStreamWriter(fos, "utf-8"), 10240);
                template.process(params, bufferedWriter);
                if (bufferedWriter != null) {
                    bufferedWriter.close();
                }
            } catch (TemplateException e) {
                e.printStackTrace();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }

    生成docx格式的文档

    高能预警! 在成功使用Freemarker动态导出doc格式的文档之后,相信大家和我的心情一样非常激动。但以上操作只是一个小铺垫,接下来我们来看看如何实现docx格式的文档导出,小明相信一定会让各位看官大跌眼镜!不,大开眼界! 首先,告诉大家一个秘密:docx格式的文档其实是一个ZIP格式的压缩文件哦! 什么?你不信?验证如下: windows的小伙伴 将docx文档修改为ZIP格式(修改.docx后缀名为.zip),然后通过解压工具解压。 MacOS的小伙伴 直接使用unzip命令解压word文档,解压过后我们会发现该文档其实还有自己的目录结构

    75736e90d9a481b9aa601bfa83052f8c.png

    929461d1bad146d2e270480f92ee0831.png

    当然,这么多文件我们不必一一知悉,只需关注小明红线标注的文件和目录即可: document.xml文件用于存放核心数据,文字,表格,图片引用等 media目录用于存放所有文档的图片 _rels目录下的document.xml.rels里存放的是配置信息,比如图片引用关系,即在document.xml中引用id对应media中的哪个图片。 获取zip里的document.xml文档以及_rels文件夹下的document.xml.rels文档 * 显而易见,如果我们要想根据数据动态导出不同的word文档,只需要:通过freemarker将本次数据填充到document.xml中,并将图片配置信息填充至document.xml.rels文档里,再用文件流把本次图片写入到media目录下替换已经存在的图片,最后把填充过内容的document.xml、document.xml.rels以及media用流的方式写入zip即可输出docx文档!上代码。

    好吧,限于篇幅,代码见文末 Github地址

    问题及解决方案

    当然,大家在第一次尝试去干某一件事时,都不一定是一蹴而就的。就比如在导出word时,就可能会遇到以下问题。​

    特殊字符

    问题:有些文本数据中难免含有特殊字符,如:< > @ ! $ & 等等。

    解决方案:这些特殊字符如果不进行转义,就会引起word打不开的现象,比如表格中的超链接的&符号,就需要替换为&amp;,如果你的文档用office打开时提示文件损坏,九成是因为特殊符号引起的,我们可以打开documet.xml定位报错位置;当然还有终极方案,我们可以利用Freemarker的语法直接在模板中使用<![CDATA[ ]]> 处理。比如:

    <w:t><![CDATA[ ${article.title} ]]></w:t>

    图片变形

    问题:因为echarts生成的图表是响应式的,不同的屏幕大小、分辨率,会造成每次前端传过来的图片宽高比例不一致,如果还直接将图片按照之前的比例放进文档,会造成生成后文档中的图片变形。

    思路:首先将文档中的图片设置为原图,然后锁定宽高比,将图片调整到合适大小,解压文档从document.xml,得到此时word中该图片宽高对应的值,如下所示:

    82c57afa3664e4200ec1156d051c7152.png

    要想保证不同像素比例的宽高在文档中不变形,我们需要固定cy的值,然后根据固定比例动态求得当前像素比例图片在word中代表的宽cx的值。计算方法如下所示: 公式:

    a/b = x/y

    其中,a表示图片在word中宽的数值,b代表图片在word中高的数值,x表示前端传过来图片的宽(单位:像素),y表示前端传过来图片的高(单位:像素)。因此,已知b、x、y,根据公式,我们即可求出a;

    我就是文末

    当然,还有用一些其他注意事项: 如果word中的模块比较多的话,使用Freemarker语法要仔细一点; 为什么小明最终选择导出docx格式的文档呢?(还不是因为产品经理的需求嘛)因为doc格式的文档,小明尝试导出后,发现该文档并不是一个合法的doc文档,体现在:不能在手机上(微信、钉钉)正常预览,office提示以xml形式打开等。因此在导出doc文档时,通过Freemaker填充document.xml后得到的并不是一个合法的word文档,查了相关资料,还需要借助第三方工具进行签名,而签名还需要在windows系统下才能完成,但是我们平时用的生产环境都是Linux……因此,考虑再三,再三权衡,最终选择导出docx格式的文档。这种方式再适合不过,而且还能保证在当前主流APP上都能正常预览。 * 敲黑板!导出docx文档最重要的一个思想是将本次数据写入覆盖模版文件(在商业中,相当于借壳上市),重新输出一个zip格式压缩的文件,这个文件就是我们最终想要的文档。

    以上,就是小明word导出的前前后后,如果你也曾经遇到过或者现在正好遇到word文档导出开发的问题,欢迎一起讨论交流。

    相关链接

    我上传了工具类,包含doc、docx 的导出,以及导出word文档时特殊符号转义,还有图片Base64转换成文件输出的方法。 GitHub地址:https://github.com/WhenCoding/coder-xiaoming/blob/master/src/main/java/com/xm/coder/util/WordUtil.java> 推荐:亲身体验,数次踩坑,遂撰写此文,以备各位不时之需。

    ## 背景

    一天,产品经理递给我了一份word报告,我定睛一看

    ![类似这样](https://img.mynamecoder.com/20200903140209.png)

    这个文档有大大小小的标题层级,还有排版好的段落、各种一目了然的饼图、走势图,当然还少不了颜色循环交替的报表。精致程度不亚于小明同学的学习报告。

    ![](https://img.mynamecoder.com/webp.png)

    ## 准备

    > 鲁迅:身为一名Java程序员,任何时候都不要忘记站在巨人的肩膀上。

    ![](https://img.mynamecoder.com/20200907151347.png)

    通过某歌搜索关键词:**java+word+导出**,我立马得出了很多成熟的方案,通过横向、纵向比较,再结合本次报告样式比较多、用户可灵活选择不同模块导出的特点,最终,我决定使用**Freemarker** 动态替换模版数据来导出word文档。至于导出文档的最终格式,有两种选择:

    ![](https://img.mynamecoder.com/20200903160210.png)

    那到底使用**doc**还是**docx**格式的文档?

    每当人生当中每次面临选择我都很慎重。最终我选择使用**docx**格式(原因文末会讲),但是为了让大家有更多的选择,满足更多的业务场景,借此机会,小明会给大家分别介绍使用**freemarker**导出两种格式的word文档方式。

    ## 思路

    > FreeMarker是一个基于Java的模板引擎,最初专注于使用MVC软件架构生成动态网页。但是,它是一个通用的模板引擎,不依赖于servlets或HTTP或HTML,因此它通常还用于生成源代码,配置文件或电子邮件。

    此时,我们用它动态生成xml文件,进而导出word文档。

    ![](https://img.mynamecoder.com/20200903154144.png)

    整体流程如下:

    ![](https://img.mynamecoder.com/20200903152139.png)

    ## 准备

    * WPS

    > 由金山软件股份有限公司发布,用于办公软件最常用的文字编辑、表格、演示稿等功能。

    对,就是这个国产的办公软件。我也是第一次发现在导出文档这件事上,它如多年好友般友好。(word解析后的xml文件阅读性很强,一般人我不告诉他)

    * 开发工具(IDEA、Visual Studio Code等)

    你喜欢的,顺手的,就是最好的。

    ## 实现

    ### 集成Freemarker模版引擎

    本次项目使用的框架依旧是Springboot,这个框架在集成各个组件表现都很便捷,不再赘述,这次集成Freemarker也不例外。

    * 首先我们在项目中增添依赖`spring-boot-starter-freemarker`

    pom.xml文件如下所示:

    ```xml

    <dependency>

    <groupId>org.springframework.boot</groupId>

    <artifactId>spring-boot-starter-freemarker</artifactId>

    </dependency>

    ```

    * 按照默认约定,我们可以在resources下创建一个templates文件夹(查看FreeMarkerProperties源码可以发现默认目录就是这个),用于存放模版文档。

    ![](https://img.mynamecoder.com/20200903164916.png)

    * application.yml增加配置

    ```yml

    spring:

    freemarker:

    template-loader-path: classpath:/templates

    cache: false # 开发环境缓存关闭

    suffix: xml

    charset: UTF-8

    ```

    ### 生成doc格式的文档

    这里先拿使用freemarker导出doc格式的word文档举例。

    * 首先将docxTemplate.docx(调整好样式的模版文档)另存为WORD 2003 XML文档(*.xml)

    ![](https://img.mynamecoder.com/20200903162724.png)

    此处命名为docTemplete.xml,使用编辑工具首次打开时,会发现这个文档里面是压缩的xml,因此我们首先需要格式化一下。

    > 注意:如果你使用的是**Visual Studio Code**开发工具,一定要检查你所使用的xml格式化插件,是否会优化你的xml标签 。比如:`<w:rPr>`会变成`<rPr>`。使用**Visual Studio Code**的同学,oh my god ! 小明在这里推荐大家使用这个插件:XML Language Support by Red Hat

    * 现在,我们就使用freemarker语法编辑docTemplete.xml,比如使用占位符`${}`替换当前文档中的文本,以达到动态生成文本的目的,直接上代码。

    ```

    public static Configuration getConfiguration(){

    //创建配置实例

    Configuration configuration = new Configuration(Configuration.VERSION_2_3_28);

    //设置编码

    configuration.setDefaultEncoding("utf-8");

    configuration.setClassForTemplateLoading(WordUtil.class, "/templates");

    return configuration;

    }

    /**

    * 生成doc文件

    *

    * @param ftlFileName 模板ftl文件的名称

    * @param params 动态传入的数据参数

    * @param outFilePath 生成的最终doc文件的保存完整路径

    */

    public void ftlToDoc(String ftlFileName, Map params, String outFilePath) {

    try {

    /** 加载模板文件 **/

    Template template = configuration.getTemplate(ftlFileName);

    /** 指定输出word文件的路径 **/

    File docFile = new File(outFilePath);

    FileOutputStream fos = new FileOutputStream(docFile);

    Writer bufferedWriter = new BufferedWriter(new OutputStreamWriter(fos, "utf-8"), 10240);

    template.process(params, bufferedWriter);

    if (bufferedWriter != null) {

    bufferedWriter.close();

    }

    } catch (TemplateException e) {

    e.printStackTrace();

    } catch (IOException e) {

    e.printStackTrace();

    }

    }

    ```

    ### 生成docx格式的文档

    **高能预警!** 在成功使用Freemarker动态导出doc格式的文档之后,相信大家和我的心情一样非常激动。但以上操作只是一个小铺垫,接下来我们来看看如何实现docx格式的文档导出,小明相信一定会让各位看官大跌眼镜!不,大开眼界!

    首先,告诉大家一个秘密:**docx格式的文档其实是一个ZIP格式的压缩文件哦!** 什么?你不信?验证如下:

    * windows的小伙伴

    将docx文档修改为ZIP格式(修改.docx后缀名为.zip),然后通过解压工具解压。

    * MacOS的小伙伴

    直接使用`unzip`命令解压word文档,解压过后我们会发现该文档其实还有自己的**目录结构**!

    ![震惊!](https://img.mynamecoder.com/20200907100322.png)

    ![](https://img.mynamecoder.com/20200907101744.png)

    当然,这么多文件我们不必一一知悉,只需关注小明红线标注的文件和目录即可:

    * document.xml文件用于存放核心数据,文字,表格,图片引用等

    * media目录用于存放所有文档的图片

    * _rels目录下的document.xml.rels里存放的是配置信息,比如图片引用关系,即在document.xml中引用id对应media中的哪个图片。

    * 获取zip里的document.xml文档以及_rels文件夹下的document.xml.rels文档

    * 显而易见,如果我们要想根据数据动态导出不同的word文档,只需要:通过freemarker将本次数据填充到document.xml中,并将图片配置信息填充至document.xml.rels文档里,再用文件流把本次图片写入到media目录下替换已经存在的图片,最后把填充过内容的document.xml、document.xml.rels以及media用流的方式写入zip即可输出docx文档!上代码。

    > 好吧,限于篇幅,代码见文末 Github地址

    ## 问题及解决方案

    当然,大家在第一次尝试去干某一件事时,都不一定是一蹴而就的。就比如在导出word时,就可能会遇到以下问题。​

    ### 特殊字符

    **问题**:有些文本数据中难免含有特殊字符,如:`< > @ ! $ &` 等等。

    **解决方案**:这些特殊字符如果不进行转义,就会引起word打不开的现象,比如表格中的超链接的`&`符号,就需要替换为`&amp;`,如果你的文档用office打开时提示文件损坏,九成是因为特殊符号引起的,我们可以打开documet.xml定位报错位置;当然还有终极方案,我们可以利用Freemarker的语法直接在模板中使用`<![CDATA[ ]]> ` 处理。比如:

    ```

    <w:t><![CDATA[ ${article.title} ]]></w:t>

    ```

    ### 图片变形

    **问题**:因为echarts生成的图表是响应式的,不同的屏幕大小、分辨率,会造成每次前端传过来的图片宽高比例不一致,如果还直接将图片按照之前的比例放进文档,会造成生成后文档中的图片变形。

    **思路**:首先将文档中的图片设置为原图,然后锁定宽高比,将图片调整到合适大小,解压文档从`document.xml`,得到此时word中该图片宽高对应的值,如下所示:

    ![](https://img.mynamecoder.com/20200913163808.png)

    要想保证不同像素比例的宽高在文档中不变形,我们需要固定`cy`的值,然后根据固定比例动态求得当前像素比例图片在word中代表的宽`cx`的值。计算方法如下所示:

    公式:

    ```

    a/b = x/y

    ```

    其中,a表示图片在word中宽的数值,b代表图片在word中高的数值,x表示前端传过来图片的宽(单位:像素),y表示前端传过来图片的高(单位:像素)。因此,已知b、x、y,根据公式,我们即可求出a;

    ## 我就是文末

    当然,还有用一些其他注意事项:

    * 如果word中的模块比较多的话,使用Freemarker语法要仔细一点;

    * 为什么小明最终选择导出docx格式的文档呢?(还不是因为产品经理的需求嘛)因为doc格式的文档,小明尝试导出后,发现该文档并不是一个合法的doc文档,体现在:不能在手机上(微信、钉钉)正常预览,office提示以xml形式打开等。因此在导出doc文档时,通过Freemaker填充document.xml后得到的并不是一个合法的word文档,查了相关资料,还需要借助第三方工具进行签名,而签名还需要在windows系统下才能完成,但是我们平时用的生产环境都是Linux……因此,考虑再三,再三权衡,最终选择导出docx格式的文档。这种方式再适合不过,而且还能保证在当前主流APP上都能正常预览。

    * 敲黑板!导出docx文档最重要的一个思想是将本次数据写入覆盖模版文件(在商业中,相当于借壳上市),重新输出一个zip格式压缩的文件,这个文件就是我们最终想要的文档。

    以上,就是小明word导出的前前后后,如果你也曾经遇到过或者现在正好遇到word文档导出开发的问题,欢迎一起讨论交流。

    ## 相关链接

    我上传了工具类,包含doc、docx 的导出,以及导出word文档时特殊符号转义,还有图片Base64转换成文件输出的方法。

    GitHub地址:https://github.com/WhenCoding/coder-xiaoming/blob/master/src/main/java/com/xm/coder/util/WordUtil.java

    展开全文
  • Word翻译如何在线操作

    2018-09-17 11:14:34
    Word翻译如何在线进行?我们用Word文档的时候很多,但是也会有英文或者其他文字的Word文档,我们要将Word翻译成中文怎么操作呢?...3:点击选择文件,选择需要进行翻译的Word文档,可以添加多个Word文档。 ...

    Word翻译如何在线进行?我们用Word文档的时候很多,但是也会有英文或者其他文字的Word文档,我们要将Word翻译成中文怎么操作呢?下面小编就为大家操作一下在线Word翻译的操作方法。

    1:首先在浏览器搜索迅捷在线翻译,进入到网站的首页。

    2:在网站首页找到源语言以及目标语言,更改至自己需要的语言。

    3:点击选择文件,选择需要进行翻译的Word文档,可以添加多个Word文档。

    4:点击开始翻译,你需要翻译的Word文档就会在翻译的过程中,请耐心等待。

    5:翻译完成的Word文档可以在温馨提示后直接下载到自己指定的文件夹中。

    迅捷在线翻译http://tool.xunjiepdf.com/transfer/

    展开全文
  • 我们进行英文文档阅读的时候往往还会遇到很陌生的单词,很多人选择的方法是直接将单词复制进搜索或者是那本词典进行查找,这样会很浪费我们的时间的,也很麻烦,那么,除了上述方法还有没有简单的方法呢?...
  • python如何获取word文件某个关键字之后的表格用python对word文档进行搜索和读取,要CSS布局HTML小编今天和大家分享读取docx文件某个关键字文本最好是全部都读取到程序程序进行判断。 本文实例讲述了...
  • PDF格式由于他本身特有的属性让大家工作应用的场景还是很,但是他看起来方便,编辑却很费劲!我们都知道PDF文档一般是无法直接编辑的,那么如何才能编辑PDF格式文档呢?今天教给大家一方法轻松解决PDF不能...
  • 办公都会用到PDF文件,有时需要把PDF文件转换Word,PDF转Word在线转换如何转换?PDF文件很常见,所以转换方法也,接下来接分享在线的方法。...27栏目找到文档转换下的PDF转Word栏目 3接着点击选择文...
  • 我们工作也是经常使用到,但是有时候我们编辑word文档的时候,需要使用到PPT幻灯片的内容,这时候从PPT中将内容复制到word,很浪费时间,而且还容易出错。下面小编给大家分享一方法,快速解决问题。...
  • 昨天领导发过来一份资料,交待说汇总一下马上给他,结果打开一看是好几个PDF文档,眼看领导规定的时间就要到了,手动将文件打出来,时间肯定不够,先把PDF转成Word再将这几个Word整合到一个文档,是一个可行...
  • oracle学习文档 笔记 全面 深刻 详细 通俗易懂 doc word格式 清晰 第一章 Oracle入门 一、 数据库概述 数据库(Database)是按照数据结构来组织、存储和管理数据的仓库,它产生于距今五十年前。简单来说是本身可视...
  • 真理无法渗透到封闭的思想。 如果宇宙的所有地方都Aleph...Aleph由多个组织和感兴趣的个人使用和开发。 如果您有兴趣参与此过程,请阅读支持政策(SUPPORT.md)和贡献规则(CONTRIBUTING.md),然后取得联系:
  • 很多人问起现在的CHM帮助文档如何作为软件的热点敏感帮助,网上搜索的资料也不,可能是太简单了吧,呵呵!今天整理了一下,详细的介绍VC开发的软件对CHM帮助文档的调用方法以及CHM帮助文档的制作要求。 一、...
  • 1、百度上搜索OCR文字识别工具,并安装一OCR文字识别工具,这样就可以将图片的文字转化为Word文档了。2、打开OCR文字识别工具,其启动页发现从图片读文件选项,并点击它,这样就可以找到自己想要读取的...
  • 时候我们网上下载的PDF文件有很图片都是倒着的,这就需要将图片旋转过来使用,那么如何将PDF文件图片旋转90度?今天就来为大家盘点这小方法,一起来看看吧。1、我们大家肯定都使用PDF图片,但是不一定...
  • 有时下载一些PDF文档后,发现里面的很内容都是繁体字,对于大多人来说阅读起来会很不方便,那么怎么才能快速将这些繁体字转成常用的简体中文字体呢? 虽然PDF的字体转换能找到的方法几乎没有,但是Word的简体和...
  • 有很PDF文件一开始没有目录,阅读的时候非常不方便,但其实给PDF文件添加书签目录操作非常简单,我们自己就可以很轻松的搞定。 一、将PDF转成Word ...1、打开上一步转换后的Word文档之后,右下
  • 我们需要在多个pdf文档中找到某段话的出处,扫描版、pdf工具都是让人头痛的事; 我们需要将pdf还原为word,扫描版让你一个字一个字的敲键盘,心累; 甚至pdf被加密了,却无法执行任何操作,只可看不可动; 是不是就...
  • 文档(Document):一般搜索引擎的处理对象是互联网网页,而文档概念要更宽泛些,代表以文本形式存在的存储对象,相比网页来说,涵盖更种形式,比如Word,PDF,html,XML等不同格式的文件都可以称之为文档。...
  • •我需要多个许可证,我该如何联系Kami? 通过sales@kamiapp.com与Kami代表联系。有关更多信息,请访问www.kamiapp.com有用的链接:•Kami博客:kami.app/blog•入门视频,教程和案例研究:kami.app / ...
  • 针对POIExcel和Word的封装 hutool-socket 基于Java的NIO和AIO的Socket封装 可以根据需求对每模块单独引入,也可以通过引入hutool-all方式引入所有模块。 文档 中文文档 参考API 视频介绍 安装 Maven ...
  • 1.2 快速的全文搜索,可以搜索Word、PPT、Excel、PDF等各种文档中的内容 1.3 可以使用单个标签搜索,也可以使用多个标签组合过滤 2. 文档归类方法 文档可以按分类、标签、附件等各种方式进行归类整理 2.1 一个文档...
  • 能够同时处理多个识别任务,一键扫描并识别,结果可保存为TXT文本文件、或保存为Word文档格式保留原稿版面,方便二次处理。具有自动分析、自动识别功能,操作更为简单快捷。内建的过滤系统可将文稿上的文字、图片、...
  • 常常遇到文档无法对齐,或表格...“查找-替换”: 查找框输入:(")(*)(") 替换框输入:“2” 在搜索选项勾选“使用通配符” 单击“全部替换”WORD里边怎样设置每页不同的页眉?如何使不同的章节显示的...
  • 第一部分 界面设计

    2013-10-22 23:10:34
    实例051 如何在程序设置Word文档的字体风格 实例052 如何使用Onldle事件 实例053 如何使程序在循环时响应外界事件 实例054 如何设置程序在系统启动时自动运行 实例055 如何创建线程程序 实例056 如何创建可...
  • 改变Word文档日期的显示格式.reg 将Word插入对象的名称汉化.reg 设置Office的安装位置.reg 设置Word的文件保存路径.reg 设置是否显示Office助手.reg 安全与限制 : 点击浏览该文件 从浏览清单隐藏服务器....
  • Python核心编程第二版(中文)

    热门讨论 2015-04-23 16:40:13
    目录 ······ 第1部分 Python核心 ...15.3.5 search()一个字符串查找一个模式(搜索与匹配的比较) 15.3.6 匹配多个字符串(|) 15.3.7 匹配任意单个字符(.) 15.3.8 创建字符集合...
  • 实例034 使用goto语句数组中搜索指定图书 第3章 字符串处理技术 3.1 字符及字符串转换 实例035 将字母全部转换为大写或小写 实例036 字母与ASCII码的转换 实例037 汉字与区位码的转换 实例038 将汉字转换为...
  • 实例034 使用goto语句数组中搜索指定图书 第3章 字符串处理技术 3.1 字符及字符串转换 实例035 将字母全部转换为大写或小写 实例036 字母与ASCII码的转换 实例037 汉字与区位码的转换 实例038 将汉字转换为...

空空如也

空空如也

1 2 3 4 5 ... 7
收藏数 122
精华内容 48
关键字:

如何在多个word文档中搜索