利⽤Freemarker模板⽣成doc或者docx⽂档(转载整理)可以直接看主要代码实现
doc作为模板⽂件⽣成指定格式的doc⽂件
实现逻辑
1、把作为模板的doc⽂件另存为xml⽂件
2、凡是需要填充的数据⽤${xxxx}替代
3、利⽤Template类将数据填充到模板并⽣成⽂件
代码:
/**
* 将数据以特定模板格式输出到word⽂档(⽬前仅⽀持输出doc⽂件,只能通过代码修改⽂字内容)
* @param data 输⼊模板数据
* @param templatePath 模板存放路径
* @param templateName 模板名称(l,由doc/docx⽂档转换⽽成)
* @param exFilePath 输出⽂件路径
* @param exFileName 输出⽂件名称(XXX.doc)
* @return
*/
public static boolean createDoc(Map<String,Object> data,String templatePath,String templateName,String exFilePath,String exFileName) {
boolean result = false;
Writer out = null;
URL basePath = ClassLoader().getResource("");//获取类⽂件所在根⽬录,注意是编译后的class⽂件⽬录
try {
Configuration configuration = new Configuration();
configuration.setDefaultEncoding("UTF-8");
configuration.setDirectoryForTemplateLoading(new Path() + templatePath));
Template t = Template(templateName); //获取模板⽂件
File file = new Path() + exFilePath);//⽣成⽣成⽂件所在⽬录
if (!ists() && !file.isDirectory()) {
file.mkdirs();
}
File outFile = new Path() + exFilePath + separator + exFileName); //导出⽂件⽣成
out = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(outFile)));
t.process(data, out); //将填充数据填⼊模板⽂件并输出到⽬标⽂件
result = true;
} catch (Exception e) {
e.printStackTrace();
} finally{
try {
out.close();
} catch (IOException e) {
e.printStackTrace();
}
}
return result;
}
docx作为模板⽂件⽣成⾃定义格式的doc/docx⽂件
实现逻辑
1、把doc/docx⽂档修改为ZIP格式(直接修改后缀)
2、取出
l(主要内容)
[Content_Types].xml、\word_l.rels(图⽚配置)
l(页眉)
……
3、根据需要替换的内容修改以上⽂件,具体见替换⽂件说明
4、以zip⽂件的形式处理模板⽂件(doc/docx) ,遍历该zip,将zip内除了media⽬录下的⽂件(图⽚另外处理)和替换⽂件(步骤3内⽂件)的每个⽂件输出到指定⽂件(doc/docx,以zip流的形式输⼊)
String xmlDocumentXmlRelsComment = FreemarkerContent(dataMap, xmlDocumentXmlRels, templatePath); ByteArrayInputStream documentXmlRelsInput = new Bytes());//替换的xml
ZipOutputStream zipout = new ZipOutputStream(new FileOutputStream("D:/workplace/springBootW
orkplace/myDemo/target/classes/templates/out.docx")); ZipFile zipFile = new ZipFile("D:/workplace/springBootWorkplace/myDemo/target/classes/templates/docTemplates.docx");//以zip⽂件的形式处理docx⽂件Enumeration<? extends ZipEntry> zipEntrys = ies();//遍历zip⽂件内的所有⽂件
int len = -1;
byte[] buffer = new byte[1024];
dom4j读取xmlwhile (zipEntrys.hasMoreElements()) {
ZipEntry next = Element();//以枚举⽅式获取⽂件
InputStream is = InputStream(next);//⽤于⽂件输出
zipout.putNextEntry(new Name()));//开始写⼊,设置⽂件名称
if (documentXmlRelsInput != null) {
while ((len = ad(buffer)) != -1) {
zipout.write(buffer, 0, len);
documentXmlRelsInput.close();
}else{
while ((len = is.read(buffer)) != -1) {
zipout.write(buffer, 0, len);
}
}
is.close();
}
zipout.close();
zipFile.close();
5、将替换⽂件和图⽚⽂件(word/media)以zip流形式输⼊到指定⽂件
6、关闭流
word转换zip后替换⽂件说明
1、\l
⽤来存在word⽂档的主要数据信息
2、\word_l.rels
⽤来存在word⽂档的主要数据配置 包括图⽚的指向
<Relationship Id="rId7" Type="/officeDocument/2006/relationships/image" Target="media/image1.jpeg"/>
rId7:唯⼀标识,image1.jpeg:图⽚名称
与对应的l
<wp:docPr id="2" name="图⽚ 2" descr="D:\阿⾥⼯作\装修\装修\北欧1\1.jpg"/>
id:唯⼀标识,name:标识,descr:图⽚路径
<a:blip r:embed="rId7">
r:embed对应ls的Id
<w:p w:rsidR="00EC2516" w:rsidRPr="00EC2516" w:rsidRDefault="00EC2516" w:rsidP="00EC2516">
<w:r w:rsidRPr="00EC2516">
<w:rPr>
<w:noProof/>
</w:rPr>
<w:drawing>
<wp:inline distT="0" distB="0" distL="0" distR="0">
<wp:extent cx="5274310" cy="7024797"/>
<wp:effectExtent l="0" t="0" r="2540" b="5080"/>
<wp:docPr id="2" name="图⽚ 2" descr="D:\阿⾥⼯作\装修\装修\北欧1\1.jpg"/>
<wp:cNvGraphicFramePr>
<a:graphicFrameLocks xmlns:a="/drawingml/2006/main" noChangeAspect="1"></a:graphicFrameLocks>        </wp:cNvGraphicFramePr>
<a:graphic xmlns:a="/drawingml/2006/main">
<a:graphicData uri="/drawingml/2006/picture">
<pic:pic xmlns:pic="/drawingml/2006/picture">
<pic:nvPicPr>
<pic:cNvPr id="0" name="Picture 2" descr="D:\阿⾥⼯作\装修\装修\北欧1\1.jpg"/>
<pic:cNvPicPr>
<a:picLocks noChangeAspect="1" noChangeArrowheads="1"/>
</pic:cNvPicPr>
</pic:nvPicPr>
<pic:blipFill>
<a:blip r:embed="rId7">
<a:extLst>
<a:ext uri="{28A0092B-C50C-407E-A947-70E740481C1C}">
<a14:useLocalDpi xmlns:a14="schemas.microsoft/office/drawing/2010/main" val="0"></a14:useLocalDpi>
</a:ext>
</a:extLst>
</a:blip>
<a:srcRect/>
<a:stretch>
<a:fillRect/>
</a:stretch>
</pic:blipFill>
<pic:spPr bwMode="auto">
<a:xfrm>
<a:off x="0" y="0"/>
<a:ext cx="5274310" cy="7024797"/>
</a:xfrm>
<a:prstGeom prst="rect">
<a:avLst/>
</a:prstGeom>
<a:noFill/>
<a:ln>
<a:noFill/>
</a:ln>
</pic:spPr>
</pic:pic>
</a:graphicData>
</a:graphic>
</wp:inline>
</w:drawing>
</w:r>
</w:p>
3、\l
⽤来配置docx⽂档的页眉⽂件
页眉:Word⽂档模板测试ymdhis
<w:p w:rsidR="00DF53B8" w:rsidRDefault="00DF53B8" w:rsidP="00DF53B8">    <w:pPr>
<w:pStyle w:val="a3"/>
</w:pPr>
<w:r>
<w:t>Word</w:t>
</w:r>
<w:r>
<w:t>⽂档模板测试</w:t>
</w:r>
<w:r w:rsidR="00CC7E39">
<w:t>ymdhis</w:t>
</w:r>
</w:p>
4、[Content_Types].xml
⽤来配置 docx⽂档中所插⼊图⽚的类型 如 png、jpeg、jpg等
,XX的格式要与插⼊⽂件的格式⼀致,每种类别加⼀条记录
<Default Extension="jpeg" ContentType="image/jpeg"/>
代码
<dependency>
<groupId>org.freemarker</groupId>
<artifactId>freemarker</artifactId>
<version>2.3.23</version>
</dependency>
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
<version>3.1.0</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>org.dom4j</groupId>
<artifactId>dom4j</artifactId>
<version>2.1.1</version>
</dependency>
/**
* 获取当前⽇期的字符串(毫秒) 如
* @return
*/
public static String getCurrentTime_yyyyMMddHHmmssSSS(){
SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMddHHmmssSSS");    return sdf.format(new Date());
}

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。