精华内容
下载资源
问答
  • 如果文档较长或打印多个文档,为了节省纸张,就必须采取双面打印。如何将这种HTML 文档双面打印出来呢?大致应该以下三个步骤:一、 将HTML 文档转换成文本文档(一) 使用浏览器转换HTML文件如果是在Netscape浏览器...

    b6fc1d1550e55a2c998725e02ede9000.png

    HTML文件到WORD文档双面打印三步曲

    2000/04/14 软件世界

    上网的同学常常会下载一些HTML文档,为了阅读的便于,有时需要将这种文件打印下来。如果文档较长或打印多个文档,为了节省纸张,就必须采取双面打印。如何将这种HTML 文档双面打印出来呢?大致应该以下三个步骤:

    一、 将HTML 文档转换成文本文档

    (一) 使用浏览器转换HTML文件

    1-1100-jpg_6_0_______-796-0-0-796.jpg

    如果是在Netscape浏览器浏览网上文件过程中,可以在浏览器File 菜单中选取Save As ,在“存为类别”下拉框中选取“Plain Text (*.txt)”,可以将HTML 文件直接存为TXT文件。注意:如果“文件名”中不加入.TXT 后缀的话,Netscape 4.0以前的版本中将不会自动加*.TXT 后缀,也就是说下载后的文件并不标志为TXT文件。对于即将下载的文件,可以从浏览器的“File”菜单中选择“Open page”,打开硬盘上的HTML文件后,选择“FILE”菜单中的“SAVE AS”,将其另存为文本文件。用IE转换文件的过程与上相类似。缺点:不能进行批量转换,一次只能转化一个文件;由于对生成该HTML文档编辑器的兼容性问题,转换后的文档常常有许多地方不能正确转化,特别是容易发生换行错误,阅读出来十分难受:一是在不该折行的地方折了行,如一个单词占了一行;二是在该折行的地方不折行,形成一条需要用水平卷滚条往右拉动很长能够读完的行。

    (二)用HTMASC进行HTML到TXT文件的转换

    运行HTMASC(笔者使用的是HTMASC32,版本2.2),在 “FILE” 菜单中选取“Open”打开单个要转化的HTML文件,再选取“CONVERT”或在“FILE” 菜单中选择“Multiple Convert… …”,选定相应的目录和文件即可进行转化(用相应的界面选择亦可)。见图1、图2。

    选项Options简单表明:Word Wrap:使单词自动换行;Show Lights:显示配置灯(灯绿表示选中该项 ); Configure Lights:对HTMASC 进行简单配置;Hints:是否随鼠标的移动而在鼠标下方显示界面的有关信息;Links: 是否在转化文件中储存链接信息;SD:是否将转化文件保存在原文件模式下;ST:显示标题;COMP:在转换文件中略去空行)。建议通常应用选中以上几项。也可以直接在Options菜单中选取More… …,指定Output directory(输出文件模式)及上述设定。见图3。

    缺点:对中文的支持不够好,在转换中英文混排的HTML文档中,会出现错误,如图4。如果对同一个文件进行两次转换,甚至会出现同一位置的汉字的转换结果会不同的状况;对有些空格符识别不好,会出现像图5中一样的乱字符;编辑功能很差,没有替换功能。

    2dddc331fe6b50166a45c7026d68c37b.png

    优点:转换速度快;可以进行批量文件转换;对英文HTML文件的兼容性最好。

    (三)使用WORD 97对HTML文档进行转换

    大家知道,WORD 97可以编辑HTML文档,那么为什么不使用WORD97直接对HTML进行编辑、打印呢?使用WORD97在转化HTML文档时有下列几个缺点:一是转换速度很慢;二是不能进行批量转换;三是对生成该HTML文档编辑器的兼容性不好,对非Microsoft编辑器生成的HTML文档识别不好。如对一文件的转换:

    HTMASC转换内容为:De(德 virtues)

    WORD 97转换为:De(? virtues)

    4e55e7d34769ddd63a47532cd0e57839.png

    由上可见,对HTML文件转换,以HTMASC 兼容性、适应性最好,且可推动批量转换,转换速率快,是首选HTML文件转换工具。在转换中英文混排HTML文件时,先用HTMASC 尝试一下,如果转换结果不理想,再采取可恰当观看该文件的浏览器进行转换。

    二、用WORD 进行粗略编辑

    为什么不用NOTEPAD 等对文本文件进行编辑?因为大多数文本编辑工具编辑功能更差,比如NOTEPAD甚至连字符串替换功能都没有,而且NOTEPAD 不能编辑大的文件。文本文件编辑器中UltraEdit—32,功能十分强悍。但由于我们的目的是将文档双面打印出来,而UltraEdit—32目前还不支持双面打印,所以我们没有选用它。使用WORD进行仔细编辑,其主要动机在于:(1)对照原文,检查转换过程中有无错误;(2)去掉无意义的乱字符;(3)去掉如“返回”、“上页”、“下页”、“BACK"、“HOME"等仅用于指示链接的文字;(4)按照自己需求对文档进行简洁排版(如对页面进行修改),以便打印。(5)如果必须原文中的照片,在文档的相应位置插入相应截图。

    通常,我们为了节省纸张,对应打印的转化后的文档的页面修改与一般使用的模版Normal.dot中所设定的不一样,比如我们将页面边距设得小一些,选择小的字号。有两种方式,可以让我们不必每编辑一个文件都对文件的以上参数进行修改。

    一种方法是运用WORD 模板,在“文件”菜单中选取“新建”,在之后出现选单中选取新建模板,新建一模板文件(与编辑一WORD 文档的过程相同),在页面设定中定义好相应参数,如在“字符数/行数”定义每页行数、字体种类和大小;在“纸张大小”中定义纸张;在“页边距”中定义文字距页边的距离。定义完后,以类似NORMAL1.DOT等的文件名保存后,退出WORD。将Normal.dot更名,如更名为Normal-dot.bak,再将NORMAL1.DOT 复制或更名为NORMAL.DOT,再开启WORD 后可以直接在一新DOC文件中“插入”要编辑的文本文件,即可获取所必须格式的DOC文档了。这种方式的特点:如果你用的机器是跟对方公用的,在使用完毕后,需要将文档模版改回。

    bfa57eec6afed553f646eddfce06c2d6.png

    另一种方法是编辑一依照自己规定的空白文档,存为TEMP.DOC,要编辑文本文档时,先开启该文档,然后插入要排版的文本文件,另存为一文件名,如和文本文件名相同的WORD文档,关闭之。再从文件菜单底部所列的近期使用文件中找到TEMP.DOC ,再如上重复编辑另一文件就能。值得一提的是,笔者在用WORD直接编辑HTMASC转换的TXT文件的过程中,发现如图5中的乱字符(应转换为括号)在图标定义为粗体和斜体时可以在编辑中展现出来,而用粗体和仿宋体却直接呈现为空格。所以在上述的文件中或模板中插入文本文件后试卷格式word格式字体,可以用CTRL+A将所有文本选中,定义图标为仿宋体或斜体,可以省去对如图5中的乱字符的查找替换。

    三、用WORD双面打印文档

    要实现多页数的双面打印,打印机应支持连续进纸,否则一张张送纸,实在浪费时间。照上述方法编辑完后,从“文件”菜单中选取“打印”或用快捷键CTRL+P,调出打印对话窗口,右下角“打印”框中先选取“偶数页面”,打印完毕后,最好放置一段时间如10分钟左右,(目的是使纸张充分冷却下来,不然的话很容易夹纸。)然后将整叠打印的纸板(已打印面朝上)放回打印机,再打印奇数页,打印完后将整叠打印文件翻过来即为次序正确的文件。如果先打印奇数页,再打印偶数页,打印完毕将整叠纸张翻过来后,其排序为2/1,4/3,6/5… …,需要一张张调整页数的总之。

    需要指出的是在模板或用作模板作用的TEMP文件的修改中一定要加上页码,这样在打印完毕整理时才能确保顺序不乱。一般状况下,首先打印偶数页的情况下,用激光打印机不会出什么疑问,打印完后,大体检查一下即可。打印另一面(通常是奇数页)的之后试卷格式word格式字体,由于纸张已从打印机中走过一遍,很容易变形造成卡纸或相粘导致将一页的内容打印到两页上,如果打印页数较少,打错了可以重来。如果打印页数较多,在打印过程中发生上述两种错误一定要及时关掉打印机电源,将打错的页数取出。然后WIN95“开始”菜单中选取“设置”选择“打印机”,右击你使用的打印机图标,选择“清除打印作业”。以上工作做完后,从WORD 中再次按前面步骤打印去除错误页之后的偶数页面,此时要在打印对话窗口中的“打印范围”中选取“页码范围”,并填入如“18-”,表示打印18页以后的内容,见图6。注意千万不要忘记在该对话窗口中右下角“打印”框中选中“偶数页面”!!!

    通过以上三个步骤,一份符合自己心意的文档就打印下来了。

    展开全文
  • 二、选定相同格式的文本 编辑了一篇较长文档,假设共有36章,而且对所有的章标题都使用了"标题1"样式。现在如果用户要选中文档中所有的36个章标题,以便做一个目录,有一个简便的操作方法: word2007:...

    一、在Word中当你要选择多处不相临文本时选按如下步骤操作:

    1.选择所需的第一项,例如表格单元或是段落或是某行。

    2.按住ctrl再去选择其它的项。

    二、选定相同格式的文本 编辑了一篇较长的文档,假设共有36章,而且对所有的章标题都使用了"标题1"样式。现在如果用户要选中文档中所有的36个章标题,以便做一个目录,有一个简便的操作方法:

    word2007:选择任意标题,单击开始选项卡,然后在样式组中单击对话框启动,在样式任务空格中指向“标题1”样式,然后在其后出现的三角简单打开列表中单击选择所有36个实例按钮,选中所有章标题后,你就可以复制粘贴了。

    当然对老版本我们可以在"格式"菜单中的"样式和格式"命令,打开"样式和格式"对话框; 在文档中,单击任意一个章标题。此时"样式和格式"对话框中的"所选文字的格式"下将显示该格式的描述; 再在"样式和格式"对话框中,单击"全选"按钮,则可选择文档中所有与选定内容或插入点所在文本格式相同的文本。选中所有的章标题。 选中所有章标题后,用户就可以一次性重新定义章标题的格式,或者使用"复制"、"剪贴"等命令提取文章的标题了。

    三、查找选择多处文本

    假设用户编辑了一篇文档,现在想知道某词在文档中出现的次数,并希望对该词加粗显示,可用下述操作方法快速实现:

    word2007:开始,编辑组中单击查找。在查找内容中输入要找的文字,然后单击在以下项中查找按钮,在打开的列表中单击主文档。此时对话框中会显示找到了多少个同时文档中的所有这个文字都被选中,然后要怎么做就跟下面老版本后边一致了。

    老版本我们这样做:单击"编辑"菜单中的"查找"命令,系统弹出"查找和替换"对话框;.在"查找内容"框中输入要查找的词,然后选中"突出显示所有在该范围找到的项目"复选标记,并从列表中选择要进行搜索的文档部分,如"主文档"; 单击"查找全部"按钮,此时在"突出显示所有在该范围找到的项目"后将出现"Word找到×个与此条件相匹配的项"。其中的"×"即是该词在文档中出现的次数。实际上,在用户单击"查找全部"按钮后,Word将查找并且同时选中符合"查找内容"框中所指定的文字或格式的所有实例。既然Word已选中所有的该词,当然用户就可以单击格式工具栏中的"加粗"按钮,使所有的词都以粗体显示了。

     

    展开全文
  • 如果文档较长或打印多个文档,为了节约纸张,就需要采用双面打印。如何将这些HTML 文档双面打印出来呢?大致需要以下三个步骤:一、 将HTML 文档转换成文本文档(一) 使用浏览器转换HTML文件如果是在Netscape浏览器...

    上网的朋友经常会下载一些HTML文档,为了阅读的方便,有时需要将这些文件打印出来。如果文档较长或打印多

    个文档,为了节约纸张,就需要采用双面打印。如何将这些HTML 文档双面打印出来呢?大致需要以下三个步骤:

    一、 将HTML 文档转换成文本文档

    (一) 使用浏览器转换HTML文件

    如果是在Netscape浏览器浏览网上文件过程中,可以在浏览器File 菜单中选择Save As

    ,在“存为类型”下拉框中选择“Plain Text (*.txt)”,可以将HTML 文件直接存为TXT文件。

    注意:如果“文件名”中不加入.TXT 后缀的话,Netscape 4.0以前的版本中将不会自动加*.TXT 后

    缀,也就是说下载后的文件并不标识为TXT文件。对于已经下载的文件,可以从浏览器的“File”菜单中选择“Ope

    n page”,打开硬盘上的HTML文件后,选择“FILE”菜单中的“SAVE AS”,将其另存为文本文件。用

    IE转换文件的过程与上相类似。缺点:不能进行批量转换,一次只能转换一个文件;由于对生成该HTML文档编辑器的兼

    容性问题,转换后的文档经常有许多地方不能正确转化,特别是容易出现换行错误,阅读起来非常别扭:一是在不该折行的地

    方折了行,如一个单词占了一行;二是在该折行的地方不折行,形成一条需要用水平卷滚条往右拉动很长才能读完的行。

    (二)用HTMASC进行HTML到TXT文件的转换

    运行HTMASC(笔者使用的是HTMASC32,版本2.2),在 “FILE” 菜单中选定“Ope

    n”打开单个要转换的HTML文件,再选定“CONVERT”或在“FILE” 菜单中选择“Multiple Co

    nvert… …”,选定相应的目录和文件即可进行转换(用相应的图标选择亦可)。见图1、图2。

    选项Options简单说明:Word Wrap:使单词自动换行;Show Lights:显示配置灯(灯

    绿表示选中该项 ); Configure Lights:对HTMASC 进行简单配置;Hints:是否随鼠标的

    移动而在鼠标下方显示图标的有关信息;Links: 是否在转换文件中保存链接信息;SD:是否将转换文件保存在原文

    件路径下;ST:显示标题;COMP:在转换文件中略去空行)。建议一般应用选中以上几项。也可以直接在Option

    s菜单中选择More… …,指定Output directory(输出文件路径)及上述设置。见图3。

    缺点:对中文的支持不够好,在转换中英文混排的HTML文档中,会出现错误,如图4。如果对同一个文件进行两

    次转换,甚至会出现同一位置的汉字的转换结果会不同的情况;对有些空格符识别不好,会出现像图5中一样的乱字符;编辑

    功能太差,没有替换功能。

    优点:转换速度快;可以进行批量文件转换;对英文HTML文件的兼容性最好。

    (三)使用WORD 97对HTML文档进行转换

    大家知道,WORD 97可以编辑HTML文档,那么为什么不使用WORD97直接对HTML进行编辑、

    打印呢?使用WORD97在转换HTML文档时有以下几个缺点:一是转换速度太慢;二是不能进行批量转换;三是对生成

    该HTML文档编辑器的兼容性不好,对非Microsoft编辑器生成的HTML文档识别不好。如对一文件的转换:

    HTMASC转换内容为:De(德 virtues)

    WORD 97转换为:De(µ? virtues)

    由上可见,对HTML文件转换,以HTMASC 兼容性、适应性最好,且能实现批量转换,转换速度快,是

    首选HTML文件转换工具。在转换中英文混排HTML文件时,先用HTMASC 尝试一下,如果转换结果不理想,再采

    用能正确观看该文件的浏览器进行转换。

    二、用WORD 进行粗略编辑

    为什么不用NOTEPAD 等对文本文件进行编辑?因为大多数文本编辑软件编辑功能很差,比如NOTEP

    AD甚至连字符串替换功能都没有,而且NOTEPAD 不能编辑大的文件。文本文件编辑器中UltraEdit—32

    ,功能非常强大。但因为我们的目的是将文档双面打印出来,而UltraEdit—32目前还不支持双面打印,所以我们

    没有选用它。使用WORD进行粗略编辑,其主要意图在于:(1)对照原文,检查转换过程中有无错误;(2)去掉无意义

    的乱字符;(3)去掉如“返回”、“上页”、“下页”、“BACK"、“HOME"等仅用于指示链接的文字;(4)按

    照自己意愿对文档进行简单排版(如对页面进行设置),以便打印。(5)如果需要原文中的图片,在文档的相应位置插入相

    应图片。

    通常,我们为了节约纸张,对要打印的转换后的文档的页面设置与通常使用的模板Normal.dot中所设

    置的不一样,比如我们将页面边距设得小一些,选择小的字号。有两种方法,可以使我们不必每编辑一个文件都对文件的以上

    参数进行设置。

    一种方法是利用WORD 模板,在“文件”菜单中选择“新建”,在随后出现选单中选择新建模板,新建一模板文

    件(与编辑一WORD 文档的过程相似),在页面设置中定义好相应参数,如在“字符数/行数”定义每页行数、字体类型

    和大小;在“纸张大小”中定义纸张;在“页边距”中定义文字距页边的距离。定义完后,以类似NORMAL1.DOT等

    的文件名保存后,退出WORD。将Normal.dot更名,如更名为Normal-dot.bak,再将NORMA

    L1.DOT 复制或更名为NORMAL.DOT,再启动WORD 后可以直接在一新DOC文件中“插入”要编辑的文

    本文件,即可获得所需要格式的DOC文档了。这种方法的缺点:如果你用的机器是和别人公用的,在使用完毕后,需要将文

    档模板改回。

    另一种方法是编辑一符合自己要求的空白文档,存为TEMP.DOC,要编辑文本文档时,先打开该文档,然

    后插入要排版的文本文件,另存为一文件名,如和文本文件名相同的WORD文档,关闭之。再从文件菜单底部所列的最近使

    用文件中找到TEMP.DOC ,再如上重复编辑另一文件即可。值得一提的是,笔者在用WORD直接编辑HTMASC

    转换的TXT文件的过程中,发现如图5中的乱字符(应转换为空格)在字体定义为宋体和黑体时可以在编辑中显现出来,而

    用楷体和仿宋体却直接显现为空格。所以在上述的文件中或模板中插入文本文件后,可以用CTRL+A将所有文本选中,定

    义字体为仿宋体或楷体,可以省去对如图5中的乱字符的查找替换。

    三、用WORD双面打印文档

    要实现多页数的双面打印,打印机应支持连续进纸,否则一张张送纸,实在浪费时间。照上述步骤编辑完后,从

    “文件”菜单中选择“打印”或用快捷键CTRL+P,调出打印对话窗口,右下角“打印”框中先选择“偶数页面”,打印

    完毕后,最好放置一段时间如10分钟左右,(目的是让纸张充分冷却下来,不然的话很容易夹纸。)然后将整叠打印的纸张

    (已打印面朝上)放回打印机,再打印奇数页,打印完后将整叠打印文件翻过来即为顺序正确的文件。如果先打印奇数页,再

    打印偶数页,打印完毕将整叠纸张翻过来后,其顺序为2/1,4/3,6/5… …,需要一张张调整页数的反正。

    需要强调的是在模板或用作模板作用的TEMP文件的设置中一定要加上页码,这样在打印完毕整理时才可保证顺序

    不乱。一般情况下,首先打印偶数页的情况下,用激光打印机不会出什么问题,打印完后,大体检查一下即可。打印另一面(

    通常是奇数页)的时候,由于纸张已从打印机中走过一遍,很容易变形导致卡纸或相粘导致将一页的内容打印到两页上,如果

    打印页数较少,打错了可以重来。如果打印页数较多,在打印过程中出现上述两种错误一定要及时关闭打印机电源,将打错的

    页数取出。然后WIN95“开始”菜单中选择“设置”选择“打印机”,右击你使用的打印机图标,选择“清除打印作业”

    。以上工作做完后,从WORD 中重新按上面步骤打印去除错误页之后的偶数页面,此时应在打印对话窗口中的“打印范围

    ”中选择“页码范围”,并填入如“18-”,表示打印18页以后的内容,见图6。注意千万不要忘记在该对话窗口中右下

    角“打印”框中选中“偶数页面”!!!

    通过以上三个步骤,一份符合自己心意的文档就打印出来了。

    展开全文
  • Java导出Word文档的实现

    千次阅读 热门讨论 2020-10-18 16:17:13
    在日常的开发工作中,我们时常会遇到导出Word文档报表的需求,比如公司的财务报表、医院的患者统计报表、电商平台的销售报表等等。 导出Word方式多种多样,通常有以下几种方式: 1. 使用第三方Java工具类库Hutool...

     

    前言

    在日常的开发工作中,我们时常会遇到导出Word文档报表的需求,比如公司的财务报表、医院的患者统计报表、电商平台的销售报表等等。

    导出Word方式多种多样,通常有以下几种方式:

        1. 使用第三方Java工具类库Hutool的Word工具类,参考网址为https://www.hutool.cn/docs/#/poi/Word生成-Word07Writer;

        2. 利用Apache POI和FreeMarker模板引擎;

        3. 第三方报表工具。

    上面的几种方式虽然可以实现Word文档的导出,但有以下缺点

        第一种方式操作简单,但也只能生成简单的Word文档,无法生成有表格的Word文档;

        第二种方式可以生成复杂的Word文档,但是还要进行Word转xml,xml转ftl的双重转换,不适合内容经常变更的Word文档;

        第三种方式有时候不适合对格式要求严格的文档。

    那么,有没有既简单又高效的导出Word的方法呢?答案是肯定有的。接下来我就来介绍一种用Java语言实现的,通过XDocReportFreeMarker模板引擎生成Word文档的方法。

     

    准备环境

    开发语言:

    Java7及以上的版本。

    开发工具:

    Eclipse/Idea。

    第三方依赖库:

    XDocReport、POI、Freemarker。

    模板语言:

    FreeMarker。

    Word编辑器:

    Microsoft 365或其他版本较高的Word编辑器。

     

    示例Word模板

                         

    制作模板

    Word模板如上图,可以看到,结构比较简单,包括两个部分,第一部分是纯文字和数字,第二部分主要是表格。我们在实际的开发过程中生成的报表几乎都是动态生成的,所以模板中的数字和表格里的数据都要替换成我们后台的实际数据。

    替换Word模板中的动态变量,我们需要掌握两个知识点:

        1.Word文档中的Word域,word域是引导Word在文档中自动插入文字、图形、页码或其他信息的一组代码。在这里我们可以把         Word域理解成标识符,这个标识符表示Word文档中要被替换的内容;

        2.FreeMarker模板下的变量表达式,比如用${city}替换Word示例模板中的北京市。

    了解了以上两个概念后,我们就可以动手编辑Word模板了,步骤如下:

    1. 首先在Word模板中选中要替换的文本,在这儿拿标题中的"北京市"为例,然后键盘使用 Ctrl + F9 组合键将其设置为域,此时文本会被"{}"包围,接着鼠标右键选择【编辑域(E)...】:

    2. 在弹出的对话框中,类别选择“邮件合并”,域名选择 "MergeField",域属性中的域名填入模版表达式${city},点击【确定】按钮:

    3. 编辑后的效果如下:

    4. 掌握替换文本的方法后,我们可以把Word模板第一部分需要替换的内容都替换成模板变量:

    Word模板中表格数据的处理

    表格中的数据实质上就是对集合的遍历。

    表格数据的处理其实和上面对文本内容的处理是类似的,只不过要在Word模板中加上集合的变量,Java代码中也要有对集合进行特对的处理(这个在后面的代码展示部分会说)。

    具体操作步骤如下:

    1. 选定表格中要替换的文本,然后键盘使用 Ctrl + F9 组合键将其设置为域,接着鼠标右键选择【编辑域(E)...】:

    2. 在弹出的对话框中,类别选择“邮件合并”,域名选择 "MergeField",域属性中的域名填入模版表达式${goods.num},点击【确定】按钮;

    3. 重复步骤2,替换表格中的其他文本内容:

    后台代码

    添加依赖到pom.xml文件

    <dependency>
        <groupId>org.apache.poi</groupId>
        <artifactId>poi</artifactId>
        <version>4.1.1</version>
    </dependency>
    <dependency>
        <groupId>org.apache.poi</groupId>
        <artifactId>poi-ooxml</artifactId>
        <version>4.1.1</version>
    </dependency>
    <dependency>
        <groupId>org.jxls</groupId>
        <artifactId>jxls</artifactId>
        <version>2.6.0</version>
        <exclusions>
            <exclusion>
                <groupId>ch.qos.logback</groupId>
                <artifactId>logback-core</artifactId>
            </exclusion>
        </exclusions>
    </dependency>
    <dependency>
        <groupId>org.jxls</groupId>
        <artifactId>jxls-poi</artifactId>
        <version>1.2.0</version>
    </dependency>
    <dependency>
        <groupId>fr.opensagres.xdocreport</groupId>
        <artifactId>fr.opensagres.xdocreport.core</artifactId>
        <version>2.0.2</version>
    </dependency>
    <dependency>
        <groupId>fr.opensagres.xdocreport</groupId>
        <artifactId>fr.opensagres.xdocreport.document</artifactId>
        <version>2.0.2</version>
    </dependency>
    <dependency>
        <groupId>fr.opensagres.xdocreport</groupId>
        <artifactId>fr.opensagres.xdocreport.template</artifactId>
        <version>2.0.2</version>
    </dependency>
    <dependency>
        <groupId>fr.opensagres.xdocreport</groupId>
        <artifactId>fr.opensagres.xdocreport.document.docx</artifactId>
        <version>2.0.2</version>
    </dependency>
    <dependency>
        <groupId>fr.opensagres.xdocreport</groupId>
        <artifactId>fr.opensagres.xdocreport.template.freemarker</artifactId>
        <version>2.0.2</version>
    </dependency>
    <dependency>
        <groupId>org.freemarker</groupId>
        <artifactId>freemarker</artifactId>
        <version>2.3.23</version>
    </dependency>
    <dependency>
        <groupId>commons-io</groupId>
        <artifactId>commons-io</artifactId>
        <version>2.5</version>
    </dependency>

    编写Java代码

    package com.tzsj.test;
    
    import java.io.File;
    import java.io.FileOutputStream;
    import java.io.IOException;
    import java.io.InputStream;
    import java.util.ArrayList;
    import java.util.List;
    import org.junit.Test;
    import org.springframework.stereotype.Controller;
    import org.springframework.web.bind.annotation.RequestMapping;
    import fr.opensagres.xdocreport.core.XDocReportException;
    import fr.opensagres.xdocreport.document.IXDocReport;
    import fr.opensagres.xdocreport.document.registry.XDocReportRegistry;
    import fr.opensagres.xdocreport.template.IContext;
    import fr.opensagres.xdocreport.template.TemplateEngineKind;
    import fr.opensagres.xdocreport.template.formatter.FieldsMetadata;
    import io.renren.entity.Goods;
    
    @Controller
    @RequestMapping("/word")
    public class WordTest {
    	@Test
    	public void test() throws IOException, XDocReportException {
    		generateWord();
    	}
    	
    	public void generateWord() throws IOException, XDocReportException {
    		//获取Word模板,模板存放路径在项目的resources目录下
    	    InputStream ins = this.getClass().getResourceAsStream("/模板.docx");
            //注册xdocreport实例并加载FreeMarker模板引擎
            IXDocReport report = XDocReportRegistry.getRegistry().loadReport(ins,     
                                   TemplateEngineKind.Freemarker);
            //创建xdocreport上下文对象
            IContext context = report.createContext();
            
            //创建要替换的文本变量
            context.put("city", "北京市");
            context.put("startDate", "2020-09-17");
            context.put("endDate", "2020-10-16");
            context.put("totCnt", 3638763);
            context.put("totAmt", "6521");
            context.put("onCnt", 2874036);
            context.put("onAmt", "4768");
            context.put("offCnt", 764727);
            context.put("offAmt", "1753");
            context.put("typeCnt", 36);
            
            List<Goods> goodsList = new ArrayList<Goods>();
            Goods goods1 = new Goods();
            goods1.setNum(1);
            goods1.setType("臭美毁肤");
            goods1.setSv(675512);
            goods1.setSa("589");
            Goods goods2 = new Goods();
            goods2.setNum(2);
            goods2.setType("女装");
            goods2.setSv(602145);
            goods2.setSa("651");
            Goods goods3 = new Goods();
            goods3.setNum(3);
            goods3.setType("手机");
            goods3.setSv(587737);
            goods3.setSa("866");
            Goods goods4 = new Goods();
            goods4.setNum(4);
            goods4.setType("家具家装");
            goods4.setSv(551193);
            goods4.setSa("783");
            Goods goods5 = new Goods();
            goods5.setNum(5);
            goods5.setType("食物饮品");
            goods5.setSv(528604);
            goods5.setSa("405");
            goodsList.add(goods1);
            goodsList.add(goods2);
            goodsList.add(goods3);
            goodsList.add(goods4);
            goodsList.add(goods5);
            context.put("goods", goodsList);
            
            //创建字段元数据
            FieldsMetadata fm = report.createFieldsMetadata();
            //Word模板中的表格数据对应的集合类型
            fm.load("goods", Goods.class, true);
           
            //输出到本地目录
            FileOutputStream out = new FileOutputStream(new File("D://商品销售报表.docx"));
            report.process(context, out);
    	}
    
    }
    

    Word模板中生成序号

    给表格数据添加序号是通过后台代码生成的,比如上面的"goods1.setNum(1)"这段代码,其实也可以在Word模板中设置对应的域变量来实现序号的填充。

    语法如下:

    @before-row[#list sequence as item]
        item?index
    @after-row[/#list]

    在表格中添加上面的表达式,XDocReport就会自动解析并生成序号,表格中的其他字段也需要进行相应的改动:

     

    提示:

    1. 序号的表达式要拆成三个域,如下图,要把这三部分分别设置成域;

         设置完成的结果参考上面表格中的序号表达式,表达式中"item?index+1"是因为序号是从0开始的,所以要加1

    2. 表格中除序号的列需要改成item.xxx而不是之前的goods.xxx:

    3. 生成效果如下:

    建议:序号最好在后台生成,用序号表达式生成的序号列会占用比较大的空间,对资源有所浪费。

    补充

    1. JavaWeb项目中通常是通过浏览器下载的方式来下载Word文档,此时只需要把之前下载到本地的代码改成浏览器端下载的代码即可:

    //输出到本地目录
    //FileOutputStream out = new FileOutputStream(new File("D://商品销售报表.docx"));
    //report.process(context, out);
    
    //浏览器端下载
    response.setCharacterEncoding("utf-8");  
    response.setContentType("application/msword");  
    String fileName = "商品销售报表.docx";  
    response.setHeader("Content-Disposition", "attachment;filename="  
    				    .concat(String.valueOf(URLEncoder.encode(fileName, "UTF-8"))));  
    report.process(context, response.getOutputStream());

    2. Word模板中的表格的长度最好充满Word文档的左右两边,否则如果表格下面还有其他文本内容,下面的文本内容会自动填充到表格的缝隙处,而且会对下面的文本内容进行覆盖。

     

    加餐

    其实,导出Word模板,上面的模板和代码已经够用了,但也有少数模板需要添加图片和图形(比如饼状图)。

     

    制作图片

    图片的生成不使用编辑域,使用模板图片和Word的书签功能,而且需要在元数据中加入图片类型的代码,以下为具体步骤:

    1. 在Word模版中需要插入图片的位置插入一张模版图片,然后鼠标单击模板图片插入一个书签,设置书签名称,比如img1, 最后点击【添加】按钮:

     2. 如果需要插入多个图片,就在需要插入图片的位置插入多个模板图片并插入书签设置对应的书签名称即可,后台代码如下: 

    package com.tzsj.test;
    
    import java.io.File;
    import java.io.FileOutputStream;
    import java.io.IOException;
    import java.io.InputStream;
    import org.junit.Test;
    import fr.opensagres.xdocreport.core.XDocReportException;
    import fr.opensagres.xdocreport.document.IXDocReport;
    import fr.opensagres.xdocreport.document.registry.XDocReportRegistry;
    import fr.opensagres.xdocreport.template.IContext;
    import fr.opensagres.xdocreport.template.TemplateEngineKind;
    import fr.opensagres.xdocreport.template.formatter.FieldsMetadata;
    
    public class ImgTest {
    
    	@Test
    	public void test() throws IOException, XDocReportException {
    		generateWordForImg();
    	}
    	
    	
    	public void generateWordForImg() throws IOException, XDocReportException {
    		//获取Word模板,模板存放路径在项目的resources目录下
    	    InputStream ins = this.getClass().getResourceAsStream("/图片.docx");
            //注册xdocreport实例并加载FreeMarker模板引擎
            IXDocReport report = XDocReportRegistry.getRegistry().loadReport(ins, 
                                   TemplateEngineKind.Freemarker);
            //创建xdocreport上下文对象
            IContext context = report.createContext();
            
            FieldsMetadata fm = report.createFieldsMetadata();
            //元数据中加入图片
            fm.addFieldAsImage("img1");
            fm.addFieldAsImage("img2");
            
            //获取图片
            InputStream img1 = this.getClass().getResourceAsStream("/11.jpg");
            InputStream img2 = this.getClass().getResourceAsStream("/33.jpg");
            
            //把图片添加到上下文对象
            context.put("img1", img1);
            context.put("img2", img2);
            
            //输出到本地目录
            FileOutputStream out = new FileOutputStream(new File("D://图片报表.docx"));
            report.process(context, out);
    	}
    
    }
    

     3. 导出效果如下:

     

    制作图形

    要在Word文档中生成柱状图、饼状图等图形,需要在项目中引入第三方绘图工具,在这里使用xchart来演示在Word中生成饼状图图形。

    生成饼状图和生成图片的方法很类似,具体步骤如下:

    1. 在Word模版中需要插入图片的位置插入一张模版图片,然后鼠标单击模板图片插入一个书签,设置书签名称,比如chart,最后点击【添加】按钮:

    2. 编写代码:

    2.1 在pom.xml文件中添加xchart的依赖:

    <dependency>
    	<groupId>org.knowm.xchart</groupId>
    	<artifactId>xchart</artifactId>
    	<version>3.5.4</version>
    </dependency>

    2.2 后台代码:

    package com.tzsj.test;
    
    import java.io.ByteArrayOutputStream;
    import java.io.File;
    import java.io.FileOutputStream;
    import java.io.IOException;
    import java.io.InputStream;
    import org.junit.Test;
    import org.knowm.xchart.BitmapEncoder;
    import org.knowm.xchart.PieChart;
    import org.knowm.xchart.PieChartBuilder;
    import fr.opensagres.xdocreport.core.XDocReportException;
    import fr.opensagres.xdocreport.document.IXDocReport;
    import fr.opensagres.xdocreport.document.images.ByteArrayImageProvider;
    import fr.opensagres.xdocreport.document.registry.XDocReportRegistry;
    import fr.opensagres.xdocreport.template.IContext;
    import fr.opensagres.xdocreport.template.TemplateEngineKind;
    import fr.opensagres.xdocreport.template.formatter.FieldsMetadata;
    
    public class ChartTest {
    
    	@Test
    	public void test() throws IOException, XDocReportException {
    		generateWordForChart();
    	}
    	
    	
    	public void generateWordForChart() throws IOException, XDocReportException {
    		//获取Word模板,模板存放路径在项目的resources目录下
    	    InputStream ins = this.getClass().getResourceAsStream("/饼图.docx");
            //注册xdocreport实例并加载FreeMarker模板引擎
            IXDocReport report = XDocReportRegistry.getRegistry().loadReport(ins,                 
                                     TemplateEngineKind.Freemarker);
            
            //创建xdocreport上下文对象
            IContext context = report.createContext();
            
            FieldsMetadata fm = report.createFieldsMetadata();
            //元数据中加入图片
            fm.addFieldAsImage("chart");
            
            PieChart chart = new PieChartBuilder().width(800).height(620)
                                    .title("销售饼图").build();
            
            //给饼图设置对应的值
            chart.addSeries("臭美毁肤", 589);
            chart.addSeries("女装", 651);
            chart.addSeries("手机", 866);
            chart.addSeries("家居家装", 783);
            chart.addSeries("食物饮品", 405);
            
            //生成饼图
            ByteArrayOutputStream baos = new ByteArrayOutputStream();
            BitmapEncoder.saveBitmap(chart, baos, BitmapEncoder.BitmapFormat.JPG);
            
            //把饼图添加到上下文对象
            context.put("chart", new ByteArrayImageProvider(baos.toByteArray()));
            
            //输出到本地目录
            FileOutputStream out = new FileOutputStream(new File("D://饼图报表.docx"));
            report.process(context, out);
    	}
    
    
    }
    

    3. 导出效果如下:

    总结

    这就是用Java语言实现,结合XDocReportFreeMarker模板引擎生成Word文档的方法。希望能给致力于开发的小伙伴带来一丝丝帮助。

    如果您在浏览过程中遇到什么问题,请在下方评论区给我留言。

    本人入驻的其他平台:

    • 微信公众号弹指时间 。
    • 网易音乐人弹指时间

     

    展开全文
  • word文档快捷键

    2007-12-31 19:06:00
    Alt+F4 关闭退出文件 Ctrl+N 基于NORMAL模板新建文档 Ctrl+O、Ctrl+F12、Alt+Ctrl+F2打开已有的文档或模板 Ctrl+P、Ctrl+Shift+F12 打印活动文档 Ctrl+F2、Alt+Ctrl+I 按打印效果显示 Ctrl+S、Shift+F12、Alt+Sh
  • WORD文档里面表格下面太多空白怎么接起来方法一方法二参考地址 方法一 选中该表格后,右键点表格属性,勾选行那里的允许跨页断行。 方法二 可能是由于表格宽度不够引起的,内容被自动隐藏了。可以通过修改行距的方式...
  • Word 2003 长篇文档排版技巧

    千次阅读 2012-09-03 08:38:11
    简介 市场部经常要出各种分析报告,一写就是洋洋洒洒几...制作目录也是出力不讨好的事,尽管小王知道Word中有插入目录的功能,可是尝试了几次就弃之不用了,原因是系统总是提示有错误。现在只能手工输入目录,加班加点
  • 使用Jacob输出word文档

    2011-11-30 10:37:55
    使用Jacob输出word文档   1.下载:http://sourceforge.net/projects/jacob-project/ 下载 jacob-1.15-M3.zip,下方已提供附件下载。 2.在项目应用中引入jar文件jacob.jar,并复制 jacob-1.15-M3-x86.dll 到...
  • 书签是定位用的,比如说,在编辑或阅读一篇较长WORD文档时,想在某一处或几处留下标记,以便以后查找、修改,便可以该处插入一书签。 具体步骤如下: 1.添加书签 选定要为其指定书签的内容,或单击要插入书签的...
  • word技巧

    千次阅读 2018-03-01 21:40:22
    word 高效经典教程(整理版)目录一分钟驾驭word 高效经典教程(整理版)... 6A、基础知识... 61、度量单位... 62、WORD中文字字号与磅的对应关系... 63、字体文件格式...... 96、Word文档超级链接知多...
  • 关于本文的补充:具体介绍基于Hierarchical ...1.BOG词袋模型下的文本向量 -discrete representation 2.word2vec词向量 - Distributedrepresentation 2.1神经网络语言模型-Neural Network Language Mode 2....
  • 一、什么是word embedding word embedding是指把一个词映射到成一个实值向量空间的过程。 二、word embedding的分类 基于频率的word embedding(Frequency-...假设语料库中一共有D个文档,单词库为V dim(V) = N 表示
  • Word排版练习题》由会员分享,可在线阅读,更多相关《Word排版练习题(6页珍藏版)》请在人人文库网上搜索。1、Word排版练习题【例3-11】:将以下素材按要求排版。(1)、将标题字体设置为华文行楷,字形设置为常规,...
  • 文章目录基于深度学习的文本分类2part 1:文本表示方法 3:word2vec(一) 主要内容(二)word2vec例子(1)使用gensim库(2)word2vec API(3)训练集文本处理与模型训练(4)模型查看与使用part 2:TextCNN(一)利用训练...
  • word编辑技巧

    千次阅读 2010-05-10 18:04:00
    1.2 编辑排版技巧(1)1.2.1 页面设置快速进行调整要对Word进行页面调整,通常大家采用的...1.2.2 Word中巧选文本内容Word文件中进行编辑操作时,经常需选定部分文件内容或全部内容进行处理,请问有没有快捷的方法进
  • word2010,最显著的变化就是“文件”按钮代替了word2007中的office按钮,使用户更容易从旧的版本word2003或者word2000等老的版本中适应过来。另外,word2010和word2007一样,都取消了传统的菜单模式,取而代之的是...
  • Word距离”拷贝文件有妙招(转)... 我们在Word中编辑文章,尤其是文章的时候,常常需要对文档中相距远的两个章节做文字和图形之间的移动或者复制,甚至是调整文件结构,这个时候如果将文章分拆为两个窗口,...
  • 文字的编辑与修饰任务1:创建一个文档 1、启动并认识WORD 2、输入文本 3、保存文档4、为文档设置密码 5、关闭文档和新建文档 6、退出Word任务2:修改文档中的文字1、打开过去保存的文档:打开按钮2、文字的选定操作...
  • WORD经典实用!

    千次阅读 2016-07-21 17:30:31
    WORD经典实用!全面!
  • 文章目录学习目标一、词向量1.1Skip-grams原理和网络结构1.2 Skip-grams训练1.2.1 Word pairs and “phases”1.2.2 对高频词抽样1.2.3 Negative sampling1.3 Hierarchical Softmax1.3.1 霍夫曼树1.3.2 Hierarchical ...
  • Word技巧

    2012-12-13 17:23:21
    如何用Word编辑参考文献  每个需要写毕业论文的朋友都会发现,修改文献是一件非常...将光标定位于word文档中将要插入参考文献的位置,按“插入/引用/脚注和尾注”。出现一菜单,选择“尾注”,“文档结尾”,编号格
  • Task5 基于深度学习的文本分类2 在上一章节,我们通过FastText快速实现了基于深度学习的文本分类模型,但是这个模型并不是最优的。在本章我们将继续深入。 基于深度学习的文本分类 本章将继续学习基于深度学习的文本...
  • word上机练习

    2011-08-13 01:43:49
    1.新建一个空白文档,然后录入以下内容(”鼠标…拖曳”)到你的文档中,并用“W-1.doc”为文件名,将其保存在E:\LS1文件夹中。   鼠标是一种手持式屏幕坐标定位装置,用来控制屏幕上光标移动位置,并向主机输入...
  • Word常用操作

    2012-02-02 14:02:17
    Word文档内部超链接四个方法 我们经常需要在一个文档内部创建超级链接,来实现阅读中的跳转,其实这有3种方法可以选择。  1. 拖放式编辑法:首先保存文档,然后选择特定的词、句或图像作为超级链接的目标,按下...
  • word关于书签的使用

    2010-03-24 10:58:00
    word关于书签的使用 在WORD中,简单的来说,书签是用于定位的,在编辑或阅读一篇较长WORD文档时,想在某一处或几处留下标记,以便以后查找、修改,便可以该处插入一书签(书签仅显示在屏幕上,不会打印出来)。...
  • word2vec

    2018-04-18 14:56:05
    词的向量表示:word2vec 如何表达一个单词 过去人们使用分类词典(taxonomic resources,比如WordNet)来表达一个词的意义,这是人们在实践中建立起来的,很难再去获得更多有意义的价值。 分类词典的问题: 1...
  • WORD 编辑

    千次阅读 2011-09-05 14:34:53
    方法二、选中需要的网页内容并按“Ctrl+C” 键复制,打开记事本等纯文本编辑工具,按“Ctrl+V”键将内容粘贴到这些文本编辑器中,然后再复制并粘贴到Word中。 ctrl+alt+f可以输入脚注 这个对于经常写论文的朋友...
  • 把文字替换成图片 首先把...说明:“^c”的意思就是指令WordXP以剪贴板中的内容替换“查找内容”框中的内 容。按此原理,“^c”还可替换包括回车符在内的任何可以复制到剪贴板的可视内容,甚至Excel表格。三招去掉页眉
  • Word 2003域应用完全手册

    千次阅读 2014-01-24 19:50:08
     简单地讲,域就是引导Word文档中自动插入文字、图形、页码或其他信息的一组代码 。每个域都有一个唯一的名字,它具有的功能与Excel中的函数非常相似。下面以Seq和Dat e域为例,说明有关域的一些基本概念。 ...
  • 使用gensim训练word2vec 本DEMO只使用部分数据,使用全部数据预训练的词向量地址: 链接: https://pan.baidu.com/s/1ewlck3zwXVQuAzraZ26Euw 提取码: qbpr Task5 基于深度学习的文本分类2 在上一章节,我们通过...

空空如也

空空如也

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

word选定较长文档内容