精华内容
下载资源
问答
  • word模板运用

    2012-12-26 20:57:22
    大家知道,Word提供了各式各样的模板,在开始编辑Word文档尤其是专业性质... 下面就带大家来好好认识一下Word模板。 第一部分 Word模板的基础应用  Word模板的分类及存放位置  Word中的模板分为两类:一是系统
    大家知道,Word提供了各式各样的模板,在开始编辑Word文档尤其是专业性质的文档之前,先看看有没有现成的模板可用吧。如果有,那么大可以发挥“拿来主义”的精神,利用现成的模板来制作,这样一来,不但作品的质量会非常好,而且效率也高得多。
    

      下面就带大家来好好认识一下Word模板。


    第一部分 Word模板的基础应用

      Word模板的分类及存放位置

      Word中的模板分为两类:一是系统向导或模板,第二类为用户自定义模板。

      Word的系统向导或模板安装在 X:\Program Files\Microsoft Office\Templates\2052文件夹中,其扩展名是WIZ(向导)和DOT(模板)。

      用户自定义模板存放的位置会由于Windows版本的不同而不一样:对于Windows 2000/NT/XP用户,自定义模板会放到C:\Documents and Settings\用户名\Application Data\Microsoft\Templates文件夹下;如果使用Windows 9x/Me,模板会被放置到 C:\Windows\ApplicationData\Microsoft\Templates 文件夹下。(X为安装OFFICE软件的目标盘符)

      使用现成的Word模板

      Office XP本身准备了很多精美模板,只要选择“文件”→“新建”,在Word窗口右侧会出现“新建文件”窗口任务格,单击“根据模板新建”下的“通用模板”项目弹出“模板”选择窗口。

      在这里所有模板已经分门别类放置好了,有常用、Web页、报告、备忘录、出版物、其他文件、信函和传真、英文向导模板等几类向导或模板,而且可以单击相应标签打开,其中会有相应模板文件名及模板描述信息,并可预览。

      选中自己需要的模板,然后单击“确定”按钮即可打开已经套用该模板的新文件。有的模板可能还会打开向导窗口要求进行一些参数的选择与设置。如图1:

      安装外部Word模板

      模板是以文件的形式存放的。因此,如果从网上或光盘上找到一些Word模板,只要把它们拷贝到 C:\Documents andSettings\用户名\Application Data\Microsoft\Templates文件夹下(Windows2000/XP用户)或C:\Windows\ApplicationData\Microsoft\Templates文件夹下即可(Windows 9x/Me用户)。

      删除不必要的Word模板

      如果不需要太多模板,或觉得安装了太多模板,可打开“资源管理器”,进入用户自定义模板文件夹,再把相应的模板文件删除掉即可。

      对Word模板加密

      如果不想别人使用Word提供的通用模板(Normal.dot)或自己精心创作的一个模板,又该怎么办呢?这时可以对该模板进行加密:

      打开通用模板文件Narmal.dot(其它模板文件做法相同),然后在“工具”/“选项”/“安全性”选项卡中的“此文档的文件加密选项”区的“打开权限密码”中对其设置密码,再按下工具栏上的“保存”按钮。以后每次启动Word时,就会提示输入密码了。如果有密码当然可以使用,没有密码,就无法使用此模板,如图10:

      使用多个Word模板

      默认情况下,Word只能支持惟一的默认模板,这往往不能满足我们的需求。其实你可以让Word使用多个模板:

      先在一个文件夹下右击,选择“新建”→“MicrosoftWord文档”生成几个Word文件,然后分别用Word打开它们,按照自己的要求对这些文件进行处理,最后选中它们,右击鼠标,选择“属性”,在打开的“属性”窗口中选中“只读”前的小勾,把多个“模板”文件设置成只读文件。

      以后要应用某一个“模板”文件时,只要双击它,此时Word会打开一个以当前选中的“模板”文件为蓝本的“只读”文件,只要按下Ctrl+S键,Word就会弹出“另保存”对话框供我们另存文件,而且原来“模板”文件中的内容并不会被覆盖。利用这种方法理论上可以实现无数个“模板”。

      共享模板

      对局域网中的用户来说,自定义模板可以让网络上的其他用户共享。具体做法是:将自定义模板放入某个共享文件夹中,并为该共享文件夹建立一个快捷方式。网络上的其他用户可以把这个快捷方式放入自己的 C:\Program Files\MicrosoftOffice\Templates\2052 文件夹中,然后就能像本地安装的模板那样调用了。


    第二部分 Word模板的编辑与修改

      创建自己的Word模板

      有时可能对那些制作精致的样式“爱不释手”,那么可不可以把别人做好的样式引用到自己的模板文件中来呢?答案是肯定的,方法就是把其它模板或文档中样式引用到自己的模板中来,从而得到自己的模板。

      下面的操作只是简单地学习创建的方法,而实际中的运用水平如何,还取决于对样式和模板使用经验的积累程度。

      1.启动Word,进入程序主界面后,选择菜单“文件→新建”命令,显示“新建文档”任务窗格。单击任务窗格“模板”区的“本机上的模板”,打开“模板”对话框,选择“常用”选项卡,选中“空白”项,然后选中“新建”区的“模板”单选框,单击“确定”后创建了一个新的空白模板。

      2.接下来,假设要把Word提供的“典雅型报告”模板中的“块引用”和“标题2”样式引用到当前的模板,以创建自己模板。选择菜单“工具→模板和加载项”命令,打开“模板和加载项”对话框,单击“管理器”按钮,出现“管理器”对话框,如图2:

      3.单击“管理器”对话框右侧“在Normal中(N)”区下方的“关闭文件”按钮,清除标准模板Normal中的样式列表。刚才的“关闭文件”按钮并为“打开文件”按钮,单击“打开文件”按钮,在显示的“打开文件”对话框内中定位至 D:\Program Files\MicrosoftOffice\Templates\2052文件夹(假设Office安装在D盘),然后选中“典雅型报告”后,单击“打开”按钮如图3:

      小提示:C:\Program Files\Microsoft Office\Templates是Word提供模板的保存位置,注意和前面Word用户创建模板的默认保存位置区别。

      4.返回“管理器”对话框,可以看到“典雅型报告”模板中的样式均列在右边的列表中,然后选中要引用到自己模板的样式“标题2”,再单击“复制”按钮即可如图4。拖动样式框滚动条,找到“块引用”样式,用同样的方法复制到自己的模板中去。

      5.完成操作后单击“关闭”按钮,返回Word编辑窗口,打开“样式和格式”任务窗格,可以看到“标题2”和“块引用”样式,已被引入到自己的模板中如图5:

      6.用同样的方法可以引用其它模板或文档中的样式,最后单击工具栏上的“保存”按钮,在弹出的“另存为”对话框中设定好模板的名称,采用默认保存位置,即可完成模板的创建。

      7.为了使模板更加完善,大家还可以细心定义其他的细节。

      首先,一定不要忘记根据模板的性质,设计合适的样式集合。设计的时候要注意命名规则、不同段落样式的相互关系、格式的统一性等等问题。想了解样式的奥妙,可以试用一下Word提供的“中文报告”等模板,仔细揣摩一下不同样式之间的关系;

      其次,用户还可以为模板定义专门的自动图文集,供用户快速插入一些文本和图片。

      最后,大家还可以根据自己的实际水平和文档性质,重新定义工具栏按钮。这样,当使用特定模板的时候,Word的外观也会相应地起变化,把编辑此类文档最常用的按钮呈现在最合适的位置。

      小提示:直接把DOC文件另存为模板的方法是不可取的,那样做获得的模板会缺少许多功能,如“自动图文集”中的词条不能用等。

      修改、改造已有模板

      Office XP本身带有大量各式各样的文件模板,但有些在使用时可能并不尽如人意。这时,可以自己来修改已有的文件模板,使它更符合使用者的要求。

      选择“文件”→“新建”,再单击“根据模板新建”下的“通用模板”项目弹出“模板”选择窗口,从中选择一个类别,如“信函和传真”,然后选择“典雅型信函”,再依次在相应位置填入“公司名称”、“职务”、“姓名”等信息,最后单击“文件”→“另存为”,在“另存为”对话框的“保存类型”下拉框中选择“文件模板”,并默认保存在模板文件夹下。以后使用时,只要选择“文件”→“新建”,就能在“常规”模板标签中看到刚才制作的模板,双击后即可使用自己修改后的模板了,如图6:

      下面再修改一下默认页面大小,选择“文件”→“页面设置”,将页面大小及上下左右边距设置自己所需的值,再单击“纸张”标签,在其中定义页面的宽度和高度。最后按下窗口左下方的“默认”按钮,此时会出现一个修改默认模板的窗口,按下“是”按钮,如图7。

      重新启动Word,这时新建的文件已经自动缩进,且页面也窄了许多,说明刚才的设置已经生效了。

      小提示:现在网上有很多英文的Word模板文件,大家可以把其中的英文信息改为中文的,再保存成模板,这样就可以更好地为自己所用。

      生成稿纸文件模板

      选择“文件”→“新建”,在右边窗格中出现的“新建文件”窗口任务格中单击“根据模板新建”下的“通用模板”项目,然后在弹出“模板”对话框,单击“报告”标签,并双击其中的“稿纸向导”项目,系统会提示插入Office XP安装光盘,就可以成功安装稿纸模板。

      接下来,就可以顺着向导按下“下一步”按钮继续;接下来选择稿纸大小及方向,再选择稿纸网络线种类,并设置字数和行数和网格方式,设置页号位置。最后,单击“完成”按钮即可生成一个空白的个性稿纸方式文件。

      制作专业套打效果模板

      首先用扫描仪把表格扫描成图片文件,在Word中选择“插入”→“图片”→“来自文件”,然后把扫描后的表格文件插入到文件中。选择“文件”→“页面设置”,调整纸张大小与表格文件的原始尺寸一致,然后右击该图片并选择“设置图片格式”,在弹出的对话框中选择“版式”标签,然后选择“衬于文字下方”,调整图片使其正好覆盖整个页面。

      接着在需要打印的空栏处插入文本框,调整其大小正好和表格图片的空栏尺寸一致。然后右击文本框,在弹出的快捷菜单中选择“设置文本框格式”,设置该文本框的“颜色与线条”为“无线条颜色”。

      按照上述步骤插入多个文本框,最后选中所有文本框,再单击鼠标右键,选择“组合”将它们组合在一个对象。

      接着在文本框中单击左键,选择菜单“插入”→“域”,在弹出的对话框中,选择“域名”为MacroButton,宏名为AcceptAllChangeShown,在显示文字中输入提示文字。

      最后将文件中的图片删除,并把新建的文件保存为模板即可。

    下次使用时,调用此模板,将光标移到文本框中,输入相关内容确定后就可以打印了,非常方便的,如图9:

      小提示:大家也可以用它来制作多种票据的模板,并把它们拷贝给同事,就可以实现模板的共享了。

      快速修改Word默认模板

      启动Word,按下Ctrl+N键新建一个空文档,选择“工具(T)”→“自定义(C)…”,选择“命令”选项卡,在这里用户可以定制自己的工具栏,按窗口提示做就可以了。注意窗口下方的“保存于(S):”,当单击“关闭”按钮时,定制的工具栏就被保存在Normal.dot中了,如图11:

      在上面的窗口中单击“键盘(K)…”,弹出“自定义键盘”窗口,先选择“类别(C)”,再选择“命令(O)”,鼠标位于“请按新快捷键(N):”框中,这里是按住键盘上的二个键:Ctrl+D,窗口显示如图12:

      用鼠标点击左下角按钮“指定(A)”,关闭窗口回到文档编辑状态便可使用。注意窗口中的“将更改保存在(V):”框,当单击“关闭”按钮时,定制的键盘快捷键就被保存在Normal.dot中了。

      快速制作Word默认模板

      启动Word,按下Ctrl+N键新建一个空文档,选择“文件”→“页面设置”,并对页边距、纸张及版式进行设置。完成后单击一下设置对话框最左下角的“默认”按钮。并在Word弹出的提示窗口中单击“是”按钮。以后每次运行Word,Word都会以此模板为蓝本新建文件。


    第三部分 Word模板的另类应用

      使用其它模板改变当前文档样式

      文档制作完成后,可以通过“格式”菜单下的“主题”命令,使用“样式库”选择其它模板,一次性替换当前文档的样式组合,让文档以新模板中的样式风格显示。具体操作方法如下:

      在当前文档打开的情况下,选择菜单“格式→主题”命令,打开“主题”对话框,单击“样式库”按钮,显示“样式库”对话框,在左侧的“模板”列表框中选择一个模板,比如“典雅型报告”,单击“确定”按钮如图13,返回Word编辑界面,可以看到当前文档的外观按照“典雅型报告”模板的样式风格显示。

      小提示:该方法也可以用于已把文档制作完成后,发现先前为文档选择的模板并不适合,需要为文档更换一个模板的情形。

      右击建立个性Word文档

      进入C:\Documents andSettings\用户名\Templates文件夹,在空白处右击,选择“新建”→“Microsoft Word文档”新建一个Word文件,命名为winword8.doc。双击winword8.doc,然后对其中的字体、字形、页面大小等作一些个性设置,并保存该文件。

      以后在“资源管理器”中右击鼠标,选择“新建”→“Microsoft Word 文档”,再双击新建的文档,就会发现,它已经套用了在winword8.doc中的设置了,从而可以使用自己的个性化Word。

      用Word模板批量转换文件

      如果经常要一次转换多个文件,可通过Word的模板来完成:

      先把要转换的文件放到一个文件夹中,然后启动Word,再选择“文件”→“新建”,并在“新建文件”窗口任务格中选择“通用模板…”,在弹出的“模板”窗口中单击“其它文档”选项卡,双击其中的“转换向导”图标,单击“确定”按钮。此时WordXP会弹出文件转换向导,直接按“下一步”按钮继续。接下来选择转换类型,设置源文件夹和目标文件夹,再选择转换文件,进行转换即可。也可以直接双击X:\Program Files\Microsoft Office\Templates\2052\下的文件“转换向导.Wiz”,如图8:

      获得更多模板资源

      如果觉得Word中内置的模板不能满足需要,大家可以通过从网上下载更多的模板:

      选择“文件”→“新建”,就可以看到“新建文档”任务窗格,注意最下面的“Microsoft.com上的模板”链接。单击后,即可打开该站点上的中文模板库。其中提供了很多类别的模板,非常丰富。只要单击网页上的模板类型链接,就能在网页上看到该类模板的名称和提供商等内容。

      单击模板名称,并在“模板最终用户许可协议”窗口中单击“同意”按钮,同时单击“在MicrosoftWord中编辑”,IE会将模板下载到硬盘,完成后自动用WordXP打开模板。如果对模板效果满意,再用“另存为”将它保存为模板,就可以像普通模板那样调用了。

      小提示:在重新安装系统之前,必须对自定义模板文件夹中的模板文件作一个备份,否则会丢失喔。

      坏事的Normal.dot模板

      有时点击Word图标,它却没有启动,反而出现一个错误信息。重装都无济于事,严重时,甚至不能卸载和重装Word。一般情况下,这是由于Word的Normal.dot模板文件损坏所造成的,可以通过系统的查找工具找到该文件,然后将其删除,这时Word会自动重建一个新的Normal.dot文件,并恢复正常。

      利用模板让Word文件自动备份

      默认情况下Word文件是不能自动备份的。不过,可以通过下面的技巧让它具有自动备份功能:启动Word并新建一个空白文件,单击“工具”菜单中的“保存选项”,在“保存”对话框中,选中“保留备份”复选框。同时,勾选“自动保存时间间隔”复选框,再在后面设置一个时间间隔,时间越小,保存越频繁。

      完成后,单击“确定”按钮。然后单击“文件”→“另存为”,在“另存为”对话框“保存类型”下拉框中选择“文件模板”,再在“文件名”中输入:ct.dot,然后把它保存到C:\Documents and Settings\Administrator\ApplicationData\Microsoft\Templates文件夹下(Windows 9x/Me则保存到C:\Windows\ApplicationData\Microsoft\Templates文件夹中)。

      关闭Word,启动“资源管理器”,切换到C:\Documents andSettings\Administrator\ApplicationData\Microsoft\Templates文件夹下,将Normal.dot删除或者改名,将刚才保存的cfan.dot重命名为Normal.dot。以后使用Word编辑文件时,每次保存文件,Word都会保存一个副本文件,并以.wbk为扩展名与原文件保存在同一文件夹中。如果哪一次文件发生损坏,就可以选择“文件”→“打开”,在“打开”对话框的“文件类型”中选择“所有文件”,然后找到这个WBK文件,再打开即可。

    展开全文
  • VC++下操作Word,如何将编辑框的内容输出到word模板文档指定位置
  • java 制作word模板

    2020-10-29 16:54:49
    背景:用于实现动态调整word模板中的内容 条件:office组件中格式为docx的word文件 对象与属性关系,如图所示

    背景:用于实现动态调整word模板中的内容

    条件:office组件中格式为docx的word文件

    对象与属性关系(一个学生对应一个同桌及N门学科),如图所示

    一、原生模板

    二、配置参数属性

    1、当前对象的属性,直接写属性名称即可:${属性名}

    2、属性为多选或单选的格式:eq \o\ac(□,${属性名[从0 开始的下标]!}) 

    (1)按图所示操作,找到

    (2)打开域代码

    (3)复制格式进去,并修改属性名称和下标,调整好后记得点击“确定”按钮进行保存

    (4)效果

    (5)有了第一个样式,第1+N个的时候可以直接复制过去,然后再进行调整

    A、复制

    B、选中当前代码(上图标红的部分),右键,选择“编辑域

    C、同样打开“域代码

    D、调整下标,调整完毕后,点击“确定”按钮进行保存

    整体效果

    PS:需要注意的是,当出现这类型的属性时,需要在实体中的属性get方法上加入@WordField(title = "标题,可不写",num=个数)

    3、当前对象中对象的参数,从第二个对象开始写,且与属性之间用下划线"-"拼接:${二级对象_属性名}

    4、list数组格式,需要注意的是不用加"[]":${二级对象和下标_属性名}

    三、制作模板

    1、将文件改成zip的压缩模式,注意,直接重命名改后缀,不要使用压缩!!!另外得是zip后缀的,rar等其他压缩格式不行!!!

    2、解压文件,使用解压插件解压

    3、找到document.xml文件

    4、打开文件document.xml,进行内容调整

    (1)去除每个参数中多余的代码(图中标红所示),每个完整的参数中间不能出现任何代码(图中标绿所示)

    (2)调整完毕后要保存文件

    5、压缩文件

    6、将压缩文件重命名为docx格式,重命名!!!

    7、至此,文件模板制作完毕

    模板使用:https://blog.csdn.net/super_DuoLa/article/details/109384791

    展开全文
  • Vue 自定义富文本编辑器 tinymce 支持导入 word 模板

    万次阅读 热门讨论 2018-09-13 10:03:10
    自定义富文本编辑器分为前端项目和后端项目两个部分,首先先说一下前端项目 前端 前端项目地址: https://github.com/haoxiaoyong1014/editor-ui 编辑器名称: tinymce 前端采用的 vue.js 至于Vue 中怎么集成 ...

    自定义富文本编辑器分为前端项目和后端项目两个部分,首先先说一下前端项目

    前端

    前端项目地址: https://github.com/haoxiaoyong1014/editor-ui

    编辑器名称: tinymce

    前端采用的 vue.js

    至于Vue 中怎么集成 tinymce 编辑器参考: https://segmentfault.com/a/1190000012791569

    其中关键代码在项目中的 index.vue

    <template>
    <div>
      <Row>
        <Col span="18" offset="3">
          <Card shadow>
            <Upload action="http://localhost:2020/upload/word/template"
                    :on-success="handleSuccess">
              <Button icon="ios-cloud-upload-outline">上传模板</Button>
            </Upload>
            <Form ref="editorModel" :model="editorModel" :rules="editorRules">
              <FormItem prop="content">
                <textarea  class='tinymce-textarea' id="tinymceEditer" style="height: 800px">
                </textarea>
              </FormItem>
              <FormItem>
                <Button type="primary" @click="handleSubmit('editorModel')">Submit</Button>
                <Button type="ghost" @click="handleReset('editorModel')">Reset</Button>
              </FormItem>
            </Form>
            <Spin fix v-if="spinShow">
              <Icon type="load-c" size=18 class="demo-spin-icon-load"></Icon>
              <div>加载组件中...</div>
            </Spin>
          </Card>
        </Col>
      </Row>
    </div>
    </template>
    <script>
    import tinymce from 'tinymce';
    import util from '@/libs/util';
    export default {
      name: 'index',
      data () {
        return {
          spinShow: true,
          editorModel: {
            content: 'dfsd'
          },
          content2: 'sdds',
          editorRules: {
            content: [
              {
                type: 'string',
                min: 5,
                message: 'the username size shall be no less than 5 chars ',
                trigger: 'blur'
              }
            ]
          },
          customEditor: null
        };
      },
      methods: {
        handleSuccess(res){
          console.log(res)
          this.customEditor=res.content;
          console.log('haoxy'+this.customEditor)
          tinymce.get('tinymceEditer').setContent(this.customEditor);
          /*this.$nextTick(() => {
            this.customEditor = tinymce.get("tinymceEditer");
          })*/
        },
        init () {
          this.$nextTick(() => {
            let vm = this;
            let height = document.body.offsetHeight - 300;
            tinymce.init({
              selector: '#tinymceEditer',
              branding: false,
              elementpath: false,
              height: height,
              language: 'zh_CN.GB2312',
              menubar: 'edit insert view format table tools',
              plugins: [
                'advlist autolink lists link image charmap print preview hr anchor pagebreak imagetools',
                'searchreplace visualblocks visualchars code fullpage',
                'insertdatetime media nonbreaking save table contextmenu directionality',
                'emoticons paste textcolor colorpicker textpattern imagetools codesample'
              ],
              toolbar1: ' newnote print preview | undo redo | insert | styleselect | forecolor backcolor bold italic | alignleft aligncenter alignright alignjustify | bullist numlist outdent indent | link image emoticons media codesample',
              autosave_interval: '20s',
              image_advtab: true,
              table_default_styles: {
                width: '100%',
                height: '100%',
                borderCollapse: 'collapse'
              },
              setup: function (editor) {
                editor.on('init', function (e) {
                  vm.spinShow = false;
                  if (localStorage.editorContent) {
                    tinymce.get('tinymceEditer').setContent(localStorage.editorContent);
                  }
                });
                editor.on('keydown', function (e) {
                  localStorage.editorContent = tinymce.get('tinymceEditer').getContent();
                  vm.editorModel.content = tinymce.get('tinymceEditer').getContent();
                });
              }
            });
            /*this.customEditor = tinymce.get("tinymceEditer");*/
          });
        },
    
    
        handleSubmit (name) {
          this.$refs[name].validate((valid) => {
            if (valid) {
              util.post('/html/pdf', this.editorModel).then(res => {
                this.$Message.success('Success!');
              });
            } else {
              this.$Message.error('Fail!');
            }
          });
        },
        handleReset (name) {
          this.$refs[name].resetFields();
        },
      },
      mounted () {
        this.init();
      },
      destroyed () {
        tinymce.get('tinymceEditer').destroy();
      }
    }
    </script>
    

    在原有的编辑器的基础上新增了上传模板功能, 在上传成功之后拿到服务端 返回的 html 数据,将其设置到

    <textarea class='tinymce-textarea' id="tinymceEditer" style="height: 800px"></textarea>
    这个标签中,所有的编辑器都是这个道理.

    上传成功之后:

    handleSuccess(res){
          console.log(res)
          this.customEditor=res.content;
          console.log('haoxy'+this.customEditor)
          tinymce.get('tinymceEditer').setContent(this.customEditor);
    

    看下效果图:

    image

    点击 submit 我是在后端将其转换成了 pdf 文件(按需求定义)

    如果在集成中出现: Uncaught SyntaxError: Unexpected token < 这个错误

    解决方法:

    在 tinymce.init 中把language : zh_CN.GB2312 去掉

    在你需要的地方引入: import '../../../zh_CN'(我是把 zh_CN.js放到了根目录下了,效果是一样的),

    如果编辑器的样式还是没有出来,只出来一个编辑框的话 ,就在你的根目录下的 index.html 中引入:

    <script src="https://cdn.bootcss.com/tinymce/4.7.4/tinymce.min.js"></script>

    后端

    后端(服务端)项目地址: https://github.com/haoxiaoyong1014/editor-service

    后端采用: springBoot , POI

    这里就不对POI做过多的说明了,贴个官网 https://poi.apache.org/,随意看看。

    整体思路:

    1,在编辑器原来的基础上增加上传模板按钮

    2, 前端上传 word 模板

    3, 服务端接收将 word 转换为html 返回前端

    4, 前端拿到服务端返回的值,将其放到富文本编辑器中

    后端主要是第3步

    首先搞清楚下要将doc/docx文档转成html/htm的话要怎么处理,根据POI的文档,我们可以知道,处理doc 格式文件对应的 POI API 为 HWPF、docx 格式为 XWPF。此处参考下这篇好文:http://www.open-open.com/lib/view/open1389594797523.html 在格式转换上说得很清楚。

    所以整体就是:根据文档类型,doc我们用HWPF对象处理转换、docx用XWPF对象处理转换。

    顺便贴一下这个在线文档 http://poi.apache.org/apidocs/index.html,不得不说看得相当麻烦,特别是XWPF的。

    所需依赖

    <dependency>
          <groupId>org.apache.poi</groupId>
          <artifactId>poi</artifactId>
          <version>3.12</version>
        </dependency>
        
        <dependency>
          <groupId>org.apache.poi</groupId>
          <artifactId>poi-scratchpad</artifactId>
          <version>3.12</version>
        </dependency>
        
        <dependency>
          <groupId>fr.opensagres.xdocreport</groupId>
          <artifactId>fr.opensagres.xdocreport.document</artifactId>
          <version>1.0.5</version>
        </dependency>
        
        <dependency>
          <groupId>fr.opensagres.xdocreport</groupId>
          <artifactId>org.apache.poi.xwpf.converter.xhtml</artifactId>
          <version>1.0.5</version>
        </dependency>
        
          <!-- https://mvnrepository.com/artifact/org.apache.commons.io/commonsIO -->
          <dependency>
            <groupId>org.apache.commons.io</groupId>
            <artifactId>commonsIO</artifactId>
            <version>2.6</version>
          </dependency>
          
        <dependency>
          <groupId>com.aspose.words</groupId>
          <artifactId>aspose-words</artifactId>
          <version>15.8.0</version>
        </dependency>
    

    其中 commonsIO 这个依赖不知道为什么下载不下来,我将 jar 放到了我的私服上,在pom.xml 中有体现,这里不做详细说明

    一、处理doc。

    这个相对简单,网上一查一堆,我的代码也是根据网上的做下自己的优化和逻辑。

    因为POI很早前就可以支持doc的处理,所以资料比较多。

    思路就是:HWPFDocument对象实例化文件流 -> WordToHtmlConverter对象处理HWPFDocument对象及预处理页面的图片等(主要是图片)

    文档说明是:

    Converts Word files (95-2007) into HTML files.
    This implementation doesn’t create images or links to them. This can be changed by overriding AbstractWordConverter.processImage(Element, boolean, Picture) method.

    -> org.w3c.dom.Document对象处理WordToHtmlConverter,生成DOM对象 -> 输出文件。

    这里有个好处就是使用到了Document对象,从而解决了编码、文件格式等问题。

    这里因为过程简单,直接贴简单demo,看注释即可:

    import java.io.ByteArrayOutputStream;
    import java.io.File;
    import java.io.FileInputStream;
    import java.io.FileNotFoundException;
    import java.io.FileOutputStream;
    import java.io.InputStream;
    import java.io.OutputStream;
    import java.util.List;
    
    import javax.xml.parsers.DocumentBuilderFactory;
    import javax.xml.transform.OutputKeys;
    import javax.xml.transform.Transformer;
    import javax.xml.transform.TransformerFactory;
    import javax.xml.transform.dom.DOMSource;
    import javax.xml.transform.stream.StreamResult;
    
    import org.apache.commons.io.FileUtils;
    import org.apache.poi.hwpf.HWPFDocument;
    import org.apache.poi.hwpf.converter.PicturesManager;
    import org.apache.poi.hwpf.converter.WordToHtmlConverter;
    import org.apache.poi.hwpf.usermodel.Picture;
    import org.apache.poi.hwpf.usermodel.PictureType;
    import org.apache.poi.xwpf.converter.core.FileImageExtractor;
    import org.apache.poi.xwpf.converter.core.FileURIResolver;
    import org.apache.poi.xwpf.converter.xhtml.XHTMLConverter;
    import org.apache.poi.xwpf.converter.xhtml.XHTMLOptions;
    import org.apache.poi.xwpf.usermodel.XWPFDocument;
    import org.apache.poi.xwpf.usermodel.XWPFPictureData;
    import org.w3c.dom.Document;
    
    public class POIForeViewUtil {
    
    	public void parseDocx2Html() throws Throwable {
    		final String path = "/tmp/";
    		final String file = "xxxxxxx.doc";
    		InputStream input = new FileInputStream(path + file);
    		String suffix = file.substring(file.indexOf(".")+1);// //截取文件格式名
    
    		//实例化WordToHtmlConverter,为图片等资源文件做准备
    		WordToHtmlConverter wordToHtmlConverter = new WordToHtmlConverter(
    				DocumentBuilderFactory.newInstance().newDocumentBuilder()
    						.newDocument());
    		wordToHtmlConverter.setPicturesManager(new PicturesManager() {
    			public String savePicture(byte[] content, PictureType pictureType,
    					String suggestedName, float widthInches, float heightInches) {
    				return suggestedName;
    			}
    		});
    		if ("doc".equals(suffix.toLowerCase())) {
    			// doc
    			HWPFDocument wordDocument = new HWPFDocument(input);
    			wordToHtmlConverter.processDocument(wordDocument);
    			//处理图片,会在同目录下生成并保存图片
    			List pics = wordDocument.getPicturesTable().getAllPictures();
    			if (pics != null) {
    				for (int i = 0; i < pics.size(); i++) {
    					Picture pic = (Picture) pics.get(i);
    					try {
    						pic.writeImageContent(new FileOutputStream(path
    								+ pic.suggestFullFileName()));
    					} catch (FileNotFoundException e) {
    						e.printStackTrace();
    					}
    				}
    			}
    		} 
    
    		// 转换
    		Document htmlDocument = wordToHtmlConverter.getDocument();
    		ByteArrayOutputStream outStream = new ByteArrayOutputStream();
    		DOMSource domSource = new DOMSource(htmlDocument);
    		StreamResult streamResult = new StreamResult(outStream);
    		TransformerFactory tf = TransformerFactory.newInstance();
    		Transformer serializer = tf.newTransformer();
    		serializer.setOutputProperty(OutputKeys.ENCODING, "utf-8");//编码格式
    		serializer.setOutputProperty(OutputKeys.INDENT, "yes");//是否用空白分割
    		serializer.setOutputProperty(OutputKeys.METHOD, "html");//输出类型
    		serializer.transform(domSource, streamResult);
    		outStream.close();
    		String content = new String(outStream.toByteArray());
    		 //我此时不想让它生成文件,所以我注释掉了,按需求定
            /*FileUtils.writeStringToFile(new File(path, "interface.html"), content,
                    "utf-8");*/
    	}
    
    	public static void main(String[] args) throws Throwable {
    		new POIForeViewUtil().parseDocx2Html();
    	}
    }
    

    其中 content 就是我们想要的 HTML 数据

    接下来我看第二中 docx

    二、处理docx。

    docx是07的版本,处理起来困难的多,貌似POI对docx的处理方法没有doc那么便捷,处理样式等等都有问题,我遇到的两个最明显问题就是字体编码问题和表格的边框线显示。

    思路:XWPFDocument加载文件流 -> XHTMLOptions处理页面资源(主要图片) -> OutputStream输出流直接输出文件。

    过程代码相当简单,可是越简单结果约没有预期的好。输出的文件字体编码默认为GBK,例如我的“微软雅黑”字体就变成“寰蒋闆呴粦”,而且节点的显示也没有doc处理的好。

    同样贴一下demo代码:

    import java.io.File;
    import java.io.FileInputStream;
    import java.io.FileOutputStream;
    import java.io.IOException;
    import java.io.InputStream;
    import java.io.OutputStream;
    
    import javax.xml.transform.OutputKeys;
    import javax.xml.transform.Transformer;
    import javax.xml.transform.TransformerFactory;
    import javax.xml.transform.stream.StreamResult;
    
    import org.apache.poi.xwpf.converter.core.FileImageExtractor;
    import org.apache.poi.xwpf.converter.core.FileURIResolver;
    import org.apache.poi.xwpf.converter.xhtml.XHTMLConverter;
    import org.apache.poi.xwpf.converter.xhtml.XHTMLOptions;
    import org.apache.poi.xwpf.usermodel.XWPFDocument;
    import org.apache.poi.xwpf.usermodel.XWPFPictureData;
    
    public class Word07ToHtml {
    
    	public static void parseToHtml() throws IOException {
    		File f = new File("tmp/xxxxx.docx");
    		if (!f.exists()) {
    			System.out.println("Sorry File does not Exists!");
    		} else {
    			if (f.getName().endsWith(".docx") || f.getName().endsWith(".DOCX")) {
    				
    				// 1) 加载XWPFDocument及文件
    				InputStream in = new FileInputStream(f);
    				XWPFDocument document = new XWPFDocument(in);
    
    				// 2) 实例化XHTML内容(这里将会把图片等文件放到生成的"word/media"目录)
    				File imageFolderFile = new File("f:/opt");
    				XHTMLOptions options = XHTMLOptions.create().URIResolver(
    						new FileURIResolver(imageFolderFile));
    				options.setExtractor(new FileImageExtractor(imageFolderFile));
    				//options.setIgnoreStylesIfUnused(false);
    				//options.setFragment(true);
    				
    			// 3) 将XWPFDocument转成XHTML并生成文件  --> 我此时不想让它生成文件,所以我注释掉了,按需求定
                /*OutputStream out = new FileOutputStream(new File(
                        path, "result.html"));
                XHTMLConverter.getInstance().convert(document, out, null);*/
                ByteArrayOutputStream baos = new ByteArrayOutputStream();
                XHTMLConverter.getInstance().convert(document, baos, options);
                String content = baos.toString();
                baos.close();
    			} else {
    				System.out.println("Enter only MS Office 2007+ files");
    			}
    		}
    	}
    }
    

    其中 content 就是我们想要的 HTML 数据

    点击 submit 我是在后端将其转换成了 pdf 文件(按需求定义)

    POI的jar包下载路径:https://archive.apache.org/dist/poi/release/bin/poi-bin-3.9-20121203.zip

    至此 富文本编辑器增加导入 word 模板就结束了, 无论是导入文件还导入图片都是一个道理.

    注: 前端项目使用方式

    git clone https://github.com/haoxiaoyong1014/editor-ui.git

    进入项目执行:

    npm install

    npm run dev

    前提: 需要安装 npm

    前端项目地址: https://github.com/haoxiaoyong1014/editor-ui

    后端项目地址: https://github.com/haoxiaoyong1014/editor-service

    如果对您有帮助还请给个星星哦!

    2018/10/19更新,更新内容修复 bug

    放到项目中遇到的问题修复

    • 问题描述1:

    当上传模板之后点击浏览器刷新编辑框中的内容会变为之前上传的内容

    • 解决方法:
    
     if (localStorage.editorContent) {
                    tinymce.get('tinymceEditer').setContent(localStorage.editorContent);
                  }
                  
    

    将这段代码注释掉即可,因为编辑器会自动的将内容保存到本地,当你去点击浏览器刷新的时候他会去本地取出并赋值到编辑框中

    • 问题描述2:

    当你在编辑框中进行编辑的时候tinymce编辑器监听了键盘按下的事件,但是键盘按下的前一个字符没有保存,例如:

    你在编辑框中输入4个字符 aaaa 你再点击submit生成pdf文件,但是 pdf文件中就只有3个字符aaa

    • 解决方法:

    因为编辑器只监听了keydown事件,并没有去监听keyup事件
    所以加上如下代码即可

    editor.on('keyup', function (e) {
                  localStorage.editorContent = tinymce.get('tinymceEditer').getContent();
                  vm.editorModel.content = tinymce.get('tinymceEditer').getContent();
                });
    
    
    • 问题描述3:

    当点击submit 生成pdf文件时,生成的 pdf 文件样式改变了

    • 解决方法:

    这是因为将 word 文档转换成 html 的时候自动的加上了这段样式

    <div style="width: 595.0pt; margin: 72.0pt 90.0pt 72.0pt 90.0pt;"></div>

    解决方法可以在前端解决也可以在后端去解决,这里我选择了在后端解决

    后端在返回给前端html 的时候,在返回的内容上加上

    respInfo.setContent("<div style=\"width: 595.0pt; margin: -72.0pt -90.0pt -72.0pt -90.0pt !important;\">"+content+"</div>")

    总结何尝不是一种学习

    展开全文
  • poi操作word模板

    热门讨论 2013-10-17 15:30:51
    poi操作word模板,读取数据后,将数据填充到新生成的文件中
  • VS2010下word操作(C++),如何将编辑框的内容保存到word模板文档的指定位置
  • 在一些的项目开发中,会有一些生成Word文件的操作,比如将获取到的一些数据添加到Word模板当中的相应的位置生成一份Word文档。 由于最近的Python项目当中需要将一些从服务器查出的数据添加到Word模板当中生成一份...

       在一些的项目开发中,会有一些生成Word文件的操作,比如将获取到的一些数据添加到Word模板当中的相应的位置生成一份Word文档。

        由于最近的Python项目当中需要将一些从服务器查出的数据添加到Word模板当中生成一份Word文档,完成这个操作需要用到的是Python当中一个叫做docx-mailmerge的包,这个包的作用是解析MS Word docx文件,并且找到合并字段并且用你想要的任何值去填充他们。其实,这个“mailmerge”可以是一个有用的模板系统,可以用于更复杂的解决方案,而不仅仅是填充文档中的名称和地址。

    首先,我们需要安装docx-mailmerge这个包。在命令行输入语句,开始安装该包。

    pip install docx-mailmerge

    如果你的系统中已经安装了该包,系统会有如下的提示。

    在完成了docx-mailmerge的安装之后,需要在Word中进行域的设置,这些域就是你的数据填充的位置。

    以Word 2013为例,在Word模板当中,将鼠标光标移动到你细腰插入数据的地方,之后按下图所示进行操作:

    点击域之后,选择 邮件合并,域名选择MergeField,域名可以理解为你在代码中的一个变量,将你要插入的数据赋值给这个变量,你的数据便会插入到模板当中。另外,格式按照自己的要求去选择,默认为无。

    这里我简单的编辑了一个证明的模板,在需要插入数据的地方设置完域之后,结果如下图所示:

     在完成前两步工作之后,最后一步就剩下代码的编写工作了。

    在本文中,其实这一部分代码非常简单,本文我写一个简单的Demo,其中我的文件名称和给域赋的值都是写死的,在项目中生成的Word名称和给域赋值都可以是变量,还有,模板的位置,生成文件的位置可以改变,生成文件的名字可以是变量,这样,每次生成的docx文件名字就会不一样,比如在我的项目当中,我就将身份证号作为文件名称,这样按照模板生成的docx文件不会出现重复。

    document_1.write('F:\\{}.docx'.format(emp_full_info.get("identity_card")))

    由于Python默认是Unicode编码,所以字符串赋值前要加u,如果是变量赋值,则可以用decode方法,比如:

    Year=year.decode(encoding='UTF-8', errors='strict')

    Demo具体的源码:

    from mailmerge import MailMerge
    
     # 打印模板
            template = "F:\\WorkingProve11.docx"
    
            # 创建邮件合并文档并查看所有字段
    
            document_1 = MailMerge(template)
            print("Fields included in {}: {}".format(template,document.get_merge_fields()))
            document_1.merge(
                people_name=u'勒布朗',
                identity_card_id='123456789',
                begin_work_year='2018',
                begin_work_month='7',
                department_name=u'洛杉矶湖人',
                job_name=u'联盟第一人'
                
            )
    
            document_1.write('F:\\test666.docx')

    最后,在制定的F盘下出现了生成的test666.docx文件,打开之后结果如下图: 

     

    最后要注意的一点是,如果在同一位置下生成的两份文件名字一样,代码是会报错的。

    解决方法有以下几种:

    1.运行程序之前,将原来的文件删除。

    2.在代码中将文件名称更改。

    3.按照上文我所说的,将文件名称改为变量。

    希望本文可以帮助到大家。

    展开全文
  • 需求:根据word模板,动态填充模板内容,生成新的word。 实现:获取数据库数据,根据word模板填充内容,生成新的word文档。 应用场景:笔者的应用场景是生成客户合同,根据用户提交的具体合同内容,填充进合同模板内...
  • Word模板引擎使用指南

    千次阅读 2017-11-12 20:23:09
    1.简介  Docx模板是一个带标记的Word文档,模板引擎用数据替换这些标记生成新的Word文档。   这是一份文档,同时也是一个模板,后面的示例...使用Word可视化编辑,操作简单标记语法简单易学文档样式100%兼容数据格
  • Android实现word模板套打功能

    千次阅读 2019-06-21 08:26:03
    过程:制作word模板,进行数据填充,打印输出。 步骤一 制作word模板 遇到问题:直接使用word编辑好的模板会导致打印出来后,部分占位符未被替换。因为word保存时会将占位符的标签分割,如下图: 应修正为 ...
  • phpword 模板替换并导出教程

    千次阅读 2019-12-12 10:19:34
    word 模板文件定义 楼主在 public\uploads\application\template.docx 该路径下面创建了 word模板文件template.docx 该模板文件含有若干个形如 “ $ {baby_station} ” 的变量,这些变量就是用来在下面export方法...
  • freemarker制作word模板

    千次阅读 2019-08-29 17:21:59
    1.调用free marker导出word @Test public void testExportWord() { EnergyVo vo = new EnergyVo(); // 为ftl中所用的属性集合对象 File file = null; String fileName = "test.ftl"; try {...
  • java 使用word模板生成word

    万次阅读 2018-05-28 17:15:19
    二:新建一个word文档 三:存放地址 四:代码 public class DocUtil { private static Logger log =Logger. getLogger (DocUtil. class ) ; public static void main (String[] args) { Map map= new ...
  • word模板以xml格式另存一份,得到xml格式模板 在xml 文件中,使用freemark标签,替换一些自定义值 使用freemark 解析xml ,输出到.doc 文件  在处理的时候要把文件后缀改成.ftl格式 获得自定义内容的word文件...
  • 获取数据录入到固定的word模板,最后生成新的word文档。 Poi-tl官方文档:http://deepoove.com/poi-tl/ 一、需求 根据word模板,动态填充模板内容,生成新的word。 二、poi-tl介绍 poi-tl(poi template language)...
  • //引用 phpword 类 use Common\Lib\Util\PhpWord\PhpWord; function generatingWord(){ //实例化 phpword 类 ... //指定模板文件 $templateProcessor = new TemplateProcessor("temp...
  • java根据xml模板生成word编辑内容)

    千次阅读 2019-01-11 19:31:05
    1.使用的依赖 <groupId>org.freemarker ...编辑xml文件:(xml模板编辑word文档使用wps另存为xml格式)   参考: https://blog.csdn.net/qq_32786873/article/details/52535845
  • 如何实现用户自定义Word模板

    千次阅读 2014-08-15 11:19:32
    导读: 在涉及到word文档生成的项目中,一般采用编程将数据填充到word模板中生成文件的实现方式,如果模板由开发人员自己设计,那么编程填充数据是相对容易实现的;但如果用户希望可以自己修改模板或自己定义新模板...
  • matlab生成word模板

    千次阅读 2019-05-06 15:05:39
    matlab gui一个成绩录入系统 function varargout = grade_word(varargin) % GRADE_WORD MATLAB code for grade_word.fig % GRADE_WORD, by itself, creates a new GRADE_WORD or raises the existing % singl...
  • Java导出数据到Word模板

    千次阅读 2019-09-23 18:21:46
    Java导出数据到Word模板.前言网上的方案需求介绍模板简介使用体验poi-tlFreemarker操作步骤总结 前言 相信很多人都会遇到Java导出的业务,Java导出主要有导出数据到Excel和Word,但是相比较而言对于导出数据到Excel的...
  • Python批量处理Excel文件信息替换Word模板原由和思路工具准备1. 前期处理1.1 数据处理1.2 模板处理2. 编写代码2.1 使用Pycharm新建项目ExcelToWord2.2 新建ETW.py主程序文件并安装相应库2.3 主要代码块解析3. 打包...
  • 使用java poi 替换word模板里面的内容

    千次阅读 2019-11-29 14:04:03
    使用java poi 替换word模板里面的内容需求背景功能实现对模板进一步加工,方便我们程序处理java代码验证 需求背景 业务提供了一个word的签名模板,要求根据订单内容替换模板中的关键信息,需要替换的内容已明确。 ...
  • 使用C#操作word模板

    千次阅读 2017-06-30 15:02:08
    前段时间在做项目时,系统中有一个功能模块,内容是在线填写资料并保存成word...首先,我们先制作完一份word模板文件。  ①打开word2010,制作如下表格→插入书签→保存成word模板文档(Student.dot):  

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 33,470
精华内容 13,388
关键字:

word模板编辑