如何能让Java生成复杂Word文档(1)
java使用POI操作XWPFDocument生成Word实战(一)
java使⽤POI操作XWPFDocument⽣成Word实战(⼀)
注:我使⽤的word 2016
功能简介:
(1)使⽤jsoup解析html得到我⽤来⽣成word的⽂本(这个你们可以忽略)
(2)⽣成word、设置页边距、设置页脚(页码),设置页码(⽂本)
⼀、解析html
Document doc = Jsoup.parseBodyFragment(contents);
Element body = doc.body();
Elements es = body.getAllElements();
⼆、循环Elements获取我需要的html标签
boolean tag = false;
for (Element e : es) {
//跳过第⼀个(默认会把整个对象当做第⼀个)
if(!tag) {
tag = true;
continue;
}
//创建段落:⽣成word(核⼼)
createXWPFParagraph(docxDocument,e);
}
三、⽣成段落
/**
* 构建段落
* @param docxDocument
* @param e
*/
public static void createXWPFParagraph(XWPFDocument docxDocument, Element e){
XWPFParagraph paragraph = docxDocument.createParagraph();
XWPFRun run = paragraph.createRun();
run.setText(e.text());
java如何生成word文档_使用Java生成word文档(附源码)
java如何生成word文档_使用Java生成word文档(附源
码)
当我们使用Java生成word文档时,通常首先会想到iText和POI,这是因为我们习惯了使用这两种方法操作Excel,自然而然的也想使用这种生成word文档。但是当我们需要动态生成word时,通常不仅要能够显示word中的内容,还要能够很好的保持word中的复杂样式。这时如果再使用IText和POI去操作,就好比程序员去搬砖一样痛苦。
这时候,我们应该考虑使用FreeMarker的模板技术快速实现这个复杂的功能,让程序员在喝咖啡的过程中就把问题解决。实现思路是这样的:先创建一个word文档,按照需求在word中填好一个模板,然后把对应的数据换成变量${},然后将文档保存为xml文档格式,使用文档编辑器打开这个xml格式的文档,去掉多余的xml符号,使用Freemarker读取这个文档然后替换掉变量,输出word文档即可。
具体过程如下:
1.创建带有格式的word文档,将该需要动态展示的数据使用变量符替换。
2.将刚刚创建的word文档另存为xml格式。
3.编辑这个XMl文档去掉多余的xml标记,如图中蓝色部分
4.从官网最新的开发包,将freemarker.jar拷贝到自己的开发项目中。
5.新建DocUtil类,实现根据Doc模板生成word文件的方法package com.favccxx.secret.util;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileOutputStream;
Java完美生成word的解决方案
POI读word文档还行,写文档实在不敢恭维,复杂的样式很难控制不提,想象一下一个20多页,嵌套很多表格和图像的word文档靠POI来写代码输出,对程序员来说比去山西挖煤还惨,况且文档格式还经常变化。
iText操作Excel还行。对于复杂的大量的word也是噩梦。
直接通过JSP输出样式基本不达标,而且要打印出来就更是惨不忍睹。
Word从2003开始支持XML格式,用XML还做就很简单了。
大致的思路是先用office2003或者2007编辑好word的样式,然后另存为xml,将xml翻译为FreeMarker模板,最后用java来解析FreeMarker模板并输出Doc。经测试这样方式生成的word 文档完全符合office标准,样式、内容控制非常便利,打印也不会变形,生成的文档和office 中编辑文档完全一样。
看看实际效果:
首先用office【版本要2003以上,以下的不支持xml格式】编辑文档的样式,图中红线的部分就是我要输出的部分:
将编辑好的文档另存为XML
再用Firstobject free XML editor【Firstobject free XML editor的使用见这里】将xml中我们需要填数据的地方打上FreeMarker标记【FreeMarker的语法见这里】
最后生成的文档样式
主要程序代码:
view sourceprint?01 package com.havenliu.document;
02
03 import java.io.BufferedWriter;
04 import java.io.File;
JAVA动态生成word和pdf
java生成word的几种方案
1、Jacob是Java-COM Bridge的缩写,它在Java与微软的COM组件之间构建一座桥梁。
使用Jacob自带的DLL动态链接库,并通过JNI的方式实现了在Java平台上对COM程序的调用。DLL动态链接库的生成需要windows平台的支持。
2、Apache POI包括一系列的API,它们可以操作基于MicroSoft OLE 2 Compound
Document Format的各种格式文件,可以通过这些API在Java中读写Excel、Word 等文件。他的excel处理很强大,对于word还局限于读取,目前只能实现一些简单文件的操作,不能设置样式。
3、Java2word是一个在java程序中调用MS Office Word 文档的组件(类库)。该组件提
供了一组简单的接口,以便java程序调用他的服务操作Word 文档。
这些服务包括:打开文档、新建文档、查找文字、替换文字,插入文字、插入图片、插入表格,在书签处插入文字、插入图片、插入表格等。填充数据到表格中读取表格数据,1.1版增强的功能:指定文本样式,指定表格样式。如此,则可动态排版word 文档。
4、iText操作Excel还行。对于复杂的大量的word也是噩梦。用法很简单, 但是功能很少, 不
能设置打印方向等问题。
5、JSP输出样式基本不达标,而且要打印出来就更是惨不忍睹。
6、用XML做就很简单了。Word从2003开始支持XML格式,大致的思路是先用office2003
或者2007编辑好word的样式,然后另存为xml,将xml翻译为FreeMarker模板,最后用java来解析FreeMarker模板并输出Doc。经测试这样方式生成的word文档完全符合office标准,样式、内容控制非常便利,打印也不会变形,生成的文档和office中编辑文档完全一样。
java深度处理word
JAVA操作word
jacob(1)
现在我们一起来看看,用Java如何操Word。
jacob,官网是/jacob 这是一个开源的工具。最新版本1.7 官方的解释是:The JACOB Project: A JAva-COM Bridge
开发环境:
JDK 1.6
MyEclipse Enterprise Workbench Version: 7.0 Milestone-1
Tomcat 5.5.27
现在MyEclipse中新建一个项目jacob,将jacob的jar包放到该项目的类库中。
我的jacob版本是1.14.3 。
下面这一步非常重要,就是拷贝jacob目录中jacob-1.14.3-x86.dll文件到系统环境变量目录中一般情况就放在当前jdk中bin目录下。
。
这里有一个MSWordManager 类,是jacob官方发布的工具类,里面有大多数Java操作MS Office的工具。
package com.test;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.Statement;
import java.util.ArrayList;
import java.util.List;
import com.jacob.activeX.ActiveXComponent;
import .Dispatch;
import .Variant;
public class MSWordManager {
java根据模板生成word文档,兼容富文本、图片
java根据模板⽣成word⽂档,兼容富⽂本、图⽚
Java⾃动⽣成带图⽚、富⽂本、表格等的word⽂档
使⽤技术 freemark+jsoup ⽣成mht格式的伪word⽂档,已经应⽤项⽬中,确实是可⾏的,⽆论是富⽂本中是图⽚还是表格,都能在word中展现出来
使⽤jsoup解析富⽂本框,将其中的图⽚进⾏Base64位转码,
使⽤freemark替换模板的占位符,将变量以及图⽚资源放⼊模板中在输出⽂件
maven地址
<!--freemarker-->
<!--
<dependency>
<groupId>org.freemarker</groupId>
<artifactId>freemarker</artifactId>
<version>2.3.23</version>
</dependency>
<!--JavaHTMLParser-->
<!--
<dependency>
<groupId>org.jsoup</groupId>
<artifactId>jsoup</artifactId>
<version>1.10.2</version>
</dependency>
制作word的freemark模板
1. 先将wrod的格式内容定义好,如果需要插⼊参数的地⽅以${xxx}为表⽰,例:${product}
利用JavaApachePOI生成Word文档示例代码
利⽤JavaApachePOI⽣成Word⽂档⽰例代码
最近公司做的项⽬需要实现导出Word⽂档的功能,⽹上关于POI⽣成Word⽂档的例⼦很少,找了半天才在官⽹⾥找到个Demo,有了Demo⼀切就好办了。
/* ====================================================================
Licensed to the Apache Software Foundation (ASF) under one or more
contributor license agreements. See the NOTICE file distributed with
this work for additional information regarding copyright ownership.
The ASF licenses this file to You under the Apache License, Version 2.0
(the "License"); you may not use this file except in compliance with
the License. You may obtain a copy of the License at
/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
java 根据word模板生成word文件
java 根据word模板生成word
文件
Java可以使用Apache POI库来生成Word文件,并且也可以使用freemarker等模板引擎来实现根据Word模板生成Word 文件的功能。
下面是一个简单的示例代码,可以帮助您快速入门。
模板制作:offer,wps都行,我使用wps进行操作
第一步制作模板
CTRL+f9生成域------》鼠标右键编辑域------》选择邮件合并-----》在域代码后面加上英文${跟代码内的一致}。
这样模板就创建好了。
首先需要引入POI和freemarker的依赖:
fr.opensagres.xdocreport
fr.opensagres.xdocreport.core
ifactId>
2.0.2
fr.opensagres.xdocreport
fr.opensagres.xdocreport.document< /artifactId>
2.0.2
fr.opensagres.xdocreport
fr.opensagres.xdocreport.template< /artifactId>
2.0.2
fr.opensagres.xdocreport
fr.opensagres.xdocreport.document.
docx
2.0.2
fr.opensagres.xdocreport
fr.opensagres.xdocreport.template.
freemarker
2.0.2
接下来是一个简单的示例代码:
public class WordGenerator {
Java模板动态生成word文件的方法步骤
Java模板动态⽣成word⽂件的⽅法步骤
最近项⽬中需要根据模板⽣成word⽂档,模板⽂件也是word⽂档。当时思考⼀下想⽤POI API来做,但是觉得⽤起来相对复杂。后来⼜找了⼀种⽅式,使⽤freemarker模板⽣成word⽂件,经过尝试觉得还是相对简单易⾏的。
使⽤freemarker模板⽣成word⽂档主要有这么⼏个步骤
1、创建word模板:因为我项⽬中⽤到的模板本⾝是word,所以我就直接编辑word⽂档转成freemarker(.ftl)格式的。
2、将改word⽂件另存为xml格式,注意使⽤另存为,不是直接修改扩展名。
3、将xml⽂件的扩展名改为ftl
4、编写java代码完成导出
使⽤到的jar:freemarker.jar (2.3.28) ,其中Configuration对象不推荐直接new Configuration(),仔细看Configuration.class⽂件会发现,推荐的是 Configuration(Version incompatibleImprovements) 这个构造⽅法,具体这个构造⽅法⾥⾯传的就是Version版本类,⽽且版本号不能低于2.3.0
闲⾔碎语不再讲,直接上代码
public static void exportDoc() {
String picturePath = "D:/image.png";
Map<String, Object> dataMap = new HashMap<String, Object>();
Java生成复杂Word文档
完美解决方案:Java生成复杂Word文档
【IT168 技术】客户要求用程序生成标准的word文档,要能打印,而且不能变形,以前用过很多解决方案,都在客户严格要求下牺牲的无比惨烈。
POI读word文档还行,写文档实在不敢恭维,复杂的样式很难控制不提,想象一下一个20多页,嵌套很多表格和图像的word文档靠POI来写代码输出,对程序员来说比去山西挖煤还惨,况且文档格式还经常变化。
iText操作Excel还行。对于复杂的大量的word也是噩梦。
直接通过JSP输出样式基本不达标,而且要打印出来就更是惨不忍睹。
Word从2003开始支持XML格式,用XML还做就很简单了。
大致的思路是先用office2003或者2007编辑好word的样式,然后另存为xml,将xml 翻译为FreeMarker模板,最后用java来解析FreeMarker模板并输出Doc。经测试这样方式生成的word文档完全符合office标准,样式、内容控制非常便利,打印也不会变形,生成的文档和office中编辑文档完全一样。
看看实际效果
首先用office【版本要2003以上,以下的不支持xml格式】编辑文档的样式,图中红线的部分就是我要输出的部分:
将编辑好的文档另存为XML
再用Firstobject free XML editor将xml中我们需要填数据的地方打上FreeMarker 标记
最后生成的文档样式
主要程序代码:
package com.havenliu.document;
import java.io.BufferedWriter;
Java利用poi生成word(包含插入图片,动态表格,行合并)
/** * 替换表格对象方法 * @param document docx解析对象 * @param textMap 需要替换的信息集合 * @param mapList 需要动态生成的内容 */ public static void changeTable(CustomXWPFDocument document, Map<String, Object> textMap, List<Object> mapList,int[] placeList){
insertTable(table, null,list,2); List<Integer[]> indexList = startEnd(list); for (int c=0;c<indexList.size();c++){
/** * 替换段落文本 * @param document docx解析对象 * @param textMap 需要替换的信息集合 */ public static void changeText(CustomXWPFDocument document, Map<String, Object> textMap){
mapList.add(list01); mapList.add(list02);
//需要动态改变表格的位置;第一个表格的位置为0 int[] placeList = {1,4};
Java如何实现读取txt文件内容并生成Word文档
Java如何实现读取txt⽂件内容并⽣成Word⽂档
⽬录
导⼊Jar包
1. Maven仓库下载导⼊
2. ⼿动导⼊
读取txt⽣成Word
注意事项
本⽂将以Java程序代码为例介绍如何读取txt⽂件中的内容,⽣成Word⽂档。在编辑代码前,可参考如下代码环境进⾏配置:IntelliJ IDEA
Free Spire.Doc for Java
Txt⽂档
导⼊Jar包
两种⽅法可在Java程序中导⼊jar⽂件
1. Maven仓库下载导⼊
在pom.xml中配置如下:
<repositories>
<repository>
<id>com.e-iceblue</id>
<url>https:///repository/maven-public/</url>
</repository>
</repositories>
<dependencies>
<dependency>
<groupId>e-iceblue</groupId>
<artifactId>spire.doc.free</artifactId>
<version>3.9.0</version>
</dependency>
</dependencies>
2. ⼿动导⼊
需先下载jar包到本地,解压,找到lib路径下的jar⽂件。然后在Java程序中打开“Project Structure”窗⼝,然后执⾏如下步骤导⼊:
JAVA生成word的解决方案
第1章编码思路
关于用OpenOffice的场景更多是将word中的内容另存为(转化)html。我的应用场景是将在线编辑器的内容保存为word格式,系细览转换为word、pdf的一种需求。
1.下载Openoffice(/index.html ),类似于windows office的一个套件,并额外支
持服务的运行方式,可理解为数据库
2.下载Jodconverter( /opensource/jodconverter),类似于jdbc
3.按照OpenOffice,并启动服务:soffice -headless -accept="socket,port=8100;urp;"
4.引入jodconverter的jar包,并编码
public class OpenOfficeService {
private Logger logger = Logger.getLogger(this.getClass());
OpenOfficeConnection con = null;
public void convert(File sourceFile, File _targetFile) {
try {
if (con == null) {
con = new SocketOpenOfficeConnection(ip, port);
}
con.connect();
DocumentConverter converter = new OpenOfficeDocumentConverter(con);
converter.convert(sourceFile, _targetFile);
java使用模板生成word文件
java使⽤模板⽣成word⽂件springboot项⽬,模板放在了templates下⾯,后⾯要根据模板⽣成word
1、⽣成⼀个word模板,如图:
注:{{code}}的是需填写的参数
下⾯是⽣成本地的
pom⽂件
<dependency>
<groupId>cn.afterturn</groupId>
<artifactId>easypoi-base</artifactId>
<version>4.1.0</version>
</dependency>
<dependency>
<groupId>org.jfree</groupId>
<artifactId>jcommon</artifactId>
<version>1.0.24</version>
</dependency>
<dependency>
<groupId>org.jfree</groupId>
<artifactId>jfreechart</artifactId>
<version>1.5.0</version>
</dependency>
/**
* @Version 1.0.0
* @Description
*/
public class WordUtil {
/**
* ⽣成word
java生成word文档
java⽣成word⽂档
这是⼯具类代码
package common.util;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStreamWriter;
import java.io.Writer;
import java.util.Map;
import sun.misc.BASE64Encoder;
import freemarker.template.Configuration;
import freemarker.template.Template;
import freemarker.template.TemplateException;
import freemarker.template.TemplateExceptionHandler;
public class DocUtil {
private Configuration configure=null;
public DocUtil(){
configure=new Configuration();
configure.setDefaultEncoding("utf-8");
JAVA+根据WORD模板生成WORD+文档
/** * * @author kdl */ import java.util.ArrayList; import java.util.HashMap; import java.util.Iterator;
import com.jacob.activeX.ActiveXComponent; import com.jacob.com.Dispatch; import com.jacob.com.Variant;
for(int i = 0;i < count;i ++) {
Dispatch.call(selection,"MoveLeft"); } }
/** * 把选定内容或插入点向右移动 * @param selection Dispatch 要移动的内容 * @param count int 移动的距离 */ public void moveRight(Dispatch selection,int count) {
/** * 全局替换 * @param selection Dispatch 选定内容或起始插入点 * @param oldText String 要替换的文本 * @param newText String 替换为文本 */ public void replaceAll(Dispatch selection,String oldText,Object replaceObj) {
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
先用office2003或者2007编辑好word的样式,然后另存为xml,将xml翻译为FreeMarker 模板,最后用java来解析FreeMarker模板并输出Doc。经测试这样方式生成的word文档完全符合office标准,样式、内容控制非常便利,打印也不会变形,生成的文档和office中编辑文档完全一样。
AD:客户要求用程序生成标准的word文档,要能打印,而且不能变形,以前用过很多解决方案,都在客户严格要求下牺牲的无比惨烈。
POI读word文档还行,写文档实在不敢恭维,复杂的样式很难控制不提,想象一下一个20多页,嵌套很多表格和图像的word文档靠POI来写代码输出,对程序员来说比去山西挖煤还惨,况且文档格式还经常变化。
iText操作Excel还行。对于复杂的大量的word也是噩梦。
直接通过JSP输出样式基本不达标,而且要打印出来就更是惨不忍睹。
Word从2003开始支持XML格式,用XML还做就很简单了。
大致的思路是先用office2003或者2007编辑好word的样式,然后另存为xml,将xml 翻译为FreeMarker模板,最后用java来解析FreeMarker模板并输出Doc。经测试这样方式生成的word文档完全符合office标准,样式、内容控制非常便利,打印也不会变形,生成的文档和office中编辑文档完全一样。
看看实际效果
首先用office【版本要2003以上,以下的不支持xml格式】编辑文档的样式,图中红线的部分就是我要输出的部分:
将编辑好的文档另存为XML
再用Firstobject free XML editor将xml中我们需要填数据的地方打上FreeMarker标记
最后生成的文档样式
主要程序代码:
package com.havenliu.document;
2import java.io.BufferedWriter;
3import java.io.File;
4import java.io.FileNotFoundException;
5import java.io.FileOutputStream;
6import java.io.IOException;
7import java.io.OutputStreamWriter;
8import java.io.Writer;
9import java.util.ArrayList;
10import java.util.HashMap;
11import java.util.List;
12import java.util.Map;
13import freemarker.template.Configuration;
14import freemarker.template.Template;
15import freemarker.template.TemplateException;
16public class DocumentHandler {
17private Configuration configuration = null;
18public DocumentHandler() {
19configuration = new Configuration();
20configuration.setDefaultEncoding("utf-8");
21}
22public void createDoc() {
23//要填入模本的数据文件
24Map dataMap=new HashMap();
25getData(dataMap);
26//设置模本装置方法和路径,FreeMarker支持多种模板装载方法。可以重servlet,classpath,数据库装载,
27//这里我们的模板是放在com.havenliu.document.template包下面
28configuration.setClassForTemplateLoading(this.getClass(),
"/com/havenliu/document/template");
29Template t=null;
30try {
31//test.ftl为要装载的模板
32t = configuration.getTemplate("test.ftl");
33} catch (IOException e) {
34 e.printStackTrace();
35}
36//输出文档路径及名称
37File outFile = new File("D:/temp/outFile.doc");
38Writer out = null;
39try {
40out = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(outFile)));
41} catch (FileNotFoundException e1) {
42e1.printStackTrace();
43}
44try {
45t.process(dataMap, out);
46} catch (TemplateException e) {
47 e.printStackTrace();
48} catch (IOException e) {
49 e.printStackTrace();
50}
51}
52/**
53* 注意dataMap里存放的数据Key值要与模板中的参数相对应54* @param dataMap
55*/
56private void getData(Map dataMap)
57{
58dataMap.put("author", "张三");
59dataMap.put("remark", "这是测试备注信息");
60List
61_table1=new ArrayList();
62Table1 t1=new Table1();
63t1.setDate("2010-10-1");
64t1.setText("制定10月开发计划内容。");
65_table1.add(t1);
66Table1 t2=new Table1();
67t2.setDate("2010-10-2");
68t2.setText("开会讨论开发计划");
69_table1.add(t2);
70dataMap.put("table1", _table1);
71List
72_table2=new ArrayList();
73for(int i=0;i<5;i++)
74{
75Table2 _t2=new Table2();
76_t2.setDetail("测试开发计划"+i);
77_t2.setPerson("张三——"+i);
78_t2.setBegindate("2010-10-1");
79_t2.setFinishdate("2010-10-31");
80_t2.setRemark("备注信息");
81_table2.add(_t2);
82}
83dataMap.put("table2", _table2);
84}
85}