如何能让Java生成复杂Word文档(1)

合集下载

java使用POI操作XWPFDocument生成Word实战(一)

java使用POI操作XWPFDocument生成Word实战(一)

java使⽤POI操作XWPFDocument⽣成Word实战(⼀)注:我使⽤的word 2016功能简介:(1)使⽤jsoup解析html得到我⽤来⽣成word的⽂本(这个你们可以忽略)(2)⽣成word、设置页边距、设置页脚(页码),设置页码(⽂本)⼀、解析htmlDocument 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());run.setTextPosition(35);//设置⾏间距if(e.tagName().equals("titlename")){paragraph.setAlignment(ParagraphAlignment.CENTER);//对齐⽅式run.setBold(true);//加粗run.setColor("000000");//设置颜⾊--⼗六进制run.setFontFamily("宋体");//字体run.setFontSize(24);//字体⼤⼩}else if(e.tagName().equals("h1")){addCustomHeadingStyle(docxDocument, "标题 1", 1);paragraph.setStyle("标题 1");run.setBold(true);run.setColor("000000");run.setFontFamily("宋体");run.setFontSize(20);}else if(e.tagName().equals("h2")){addCustomHeadingStyle(docxDocument, "标题 2", 2);paragraph.setStyle("标题 2");run.setBold(true);run.setColor("000000");run.setFontFamily("宋体");run.setFontSize(18);}else if(e.tagName().equals("h3")){addCustomHeadingStyle(docxDocument, "标题 3", 3);paragraph.setStyle("标题 3");run.setBold(true);run.setColor("000000");run.setFontFamily("宋体");run.setFontSize(16);}else if(e.tagName().equals("p")){//内容paragraph.setAlignment(ParagraphAlignment.BOTH);//对齐⽅式paragraph.setIndentationFirstLine(WordUtil.ONE_UNIT);//⾸⾏缩进:567==1厘⽶run.setBold(false);run.setColor("001A35");run.setFontFamily("宋体");run.setFontSize(14);//run.addCarriageReturn();//回车键}else if(e.tagName().equals("break")){paragraph.setPageBreak(true);//段前分页(ctrl+enter)}四、设置页边距/*** 设置页边距 (word中1厘⽶约等于567)* @param document* @param left* @param top* @param right* @param bottom*/public static void setDocumentMargin(XWPFDocument document, String left,String top, String right, String bottom) {CTSectPr sectPr = document.getDocument().getBody().addNewSectPr();CTPageMar ctpagemar = sectPr.addNewPgMar();if (StringUtils.isNotBlank(left)) {ctpagemar.setLeft(new BigInteger(left));}if (StringUtils.isNotBlank(top)) {ctpagemar.setTop(new BigInteger(top));}if (StringUtils.isNotBlank(right)) {ctpagemar.setRight(new BigInteger(right));}if (StringUtils.isNotBlank(bottom)) {ctpagemar.setBottom(new BigInteger(bottom));}}五、创建页眉/*** 创建默认页眉** @param docx XWPFDocument⽂档对象* @param text 页眉⽂本* @return返回⽂档帮助类对象,可⽤于⽅法链调⽤* @throws XmlException XML异常* @throws IOException IO异常* @throws InvalidFormatException ⾮法格式异常* @throws FileNotFoundException 找不到⽂件异常*/public static void createDefaultHeader(final XWPFDocument docx, final String text){CTP ctp = CTP.Factory.newInstance();XWPFParagraph paragraph = new XWPFParagraph(ctp, docx);ctp.addNewR().addNewT().setStringValue(text);ctp.addNewR().addNewT().setSpace(SpaceAttribute.Space.PRESERVE);CTSectPr sectPr = docx.getDocument().getBody().isSetSectPr() ? docx.getDocument().getBody().getSectPr() : docx.getDocument().getBody().addNewSectPr(); XWPFHeaderFooterPolicy policy = new XWPFHeaderFooterPolicy(docx, sectPr);XWPFHeader header = policy.createHeader(STHdrFtr.DEFAULT, new XWPFParagraph[] { paragraph });header.setXWPFDocument(docx);}}六、创建页脚/*** 创建默认的页脚(该页脚主要只居中显⽰页码)** @param docx* XWPFDocument⽂档对象* @return返回⽂档帮助类对象,可⽤于⽅法链调⽤* @throws XmlException* XML异常* @throws IOException* IO异常*/public static void createDefaultFooter(final XWPFDocument docx) {// TODO 设置页码起始值CTP pageNo = CTP.Factory.newInstance();XWPFParagraph footer = new XWPFParagraph(pageNo, docx);CTPPr begin = pageNo.addNewPPr();begin.addNewPStyle().setVal(STYLE_FOOTER);begin.addNewJc().setVal(STJc.CENTER);pageNo.addNewR().addNewFldChar().setFldCharType(STFldCharType.BEGIN);pageNo.addNewR().addNewInstrText().setStringValue("PAGE \\* MERGEFORMAT");pageNo.addNewR().addNewFldChar().setFldCharType(STFldCharType.SEPARATE);CTR end = pageNo.addNewR();CTRPr endRPr = end.addNewRPr();endRPr.addNewNoProof();endRPr.addNewLang().setVal(LANG_ZH_CN);end.addNewFldChar().setFldCharType(STFldCharType.END);CTSectPr sectPr = docx.getDocument().getBody().isSetSectPr() ? docx.getDocument().getBody().getSectPr() : docx.getDocument().getBody().addNewSectPr(); XWPFHeaderFooterPolicy policy = new XWPFHeaderFooterPolicy(docx, sectPr);policy.createFooter(STHdrFtr.DEFAULT, new XWPFParagraph[] { footer });}七、⾃定义标题样式(这个在我另⼀篇word基础中也有提及)* 增加⾃定义标题样式。

java根据模板生成word文档,兼容富文本、图片

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}模板例⼦: 2. 将模板另存为mht格式的⽂件,打开该⽂件检查每个变量(${product})是否完整,有可能在${}中出现其他代码,需要删除。

3. 将mht⽂件变更⽂件类型,改成ftl为结尾的⽂件,引⼊到项⽬中 4. 修改ftl模板⽂件,在⽂件中加上图⽚资源占位符${imagesBase64String},${imagesXmlHrefString}具体位置如下图所⽰: 5. ftl⽂件中由⼏个关键配置需要引⼊到代码中:docSrcParent = word.filesdocSrcLocationPrex =nextPartId = 01D2C8DD.BC13AF60上⾯三个参数,在模板⽂件中可以找到,需要进⾏配置,如果配置错误,图⽚⽂件将不会显⽰下⾯这三个参数固定,切换模板也不会改变shapeidPrex = _x56fe__x7247__x0020typeid = #_x0000_t75spidPrex = _x0000_i 6. 模板引⼊之后进⾏代码编辑源码地址为:下载源码后需要进⾏调整下内容:1. 录⼊步骤5中的6个参数2. 修改freemark获取模板⽅式下⾯这种⽅式能获取模板,但是在项⽬打包之后⽆法获取jar包内的⽂件Configuration configuration=newConfiguration(Configuration.getVersion());configuration.setDefaultEncoding(StandardCharsets.UTF_8.toString());configuration.setDirectoryForTemplateLoading(newFile(templatePath));Template template=configuration.getTemplate("xxx.ftl");通过流的形式直接创建模板对象Configuration configuration=newConfiguration(Configuration.getVersion());configuration.setDefaultEncoding(StandardCharsets.UTF_8.toString());configuration.setDirectoryForTemplateLoading(newFile(templatePath));InputStream inputStream=newFileInputStream(newFile(templatePath+"/"+templateName)); InputStreamReader inputStreamReader=newInputStreamReader(inputStream,StandardCharsets.UTF_8); Template template=newTemplate(templateName,inputStreamReader,configuration);。

java生成word的几种方案

java生成word的几种方案

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中编辑⽂档完全⼀样。

7、补充⼀种⽅案,可以⽤类似ueditor的在线编辑器编辑word⽂档,在将html⽂件转换为xhtml⽂件,再转换为word。

JAVA不使用POI,用PageOffice动态导出Word文档

JAVA不使用POI,用PageOffice动态导出Word文档

JAVA不使用POI,用PageOffice动态导出Word文档很多情况下,软件开发者需要从数据库读取数据,然后将数据动态填充到手工预先准备好的Word模板文档里,这对于大批量生成拥有相同格式排版的正式文件非常有用,这个功能应用PageOffice的基本动态填充功能即可实现。

但若是用户想动态生成一个没有固定模版的公文时,换句话说,没有办法事先准备一个固定格式的模板时,就需要开发人员在后台用代码实现Word文档的从零到图文并茂的动态生成功能了。

这里的“零”指的是Word空白文档。

那如何实现Word文档的从无到有呢,下面我就把自己实现这一功能的过程介绍一下。

例如,我想打开一个Word文档,里面的内容为:标题(粗体、黑体、字体大小为20、居中显示)、第一段内容(内容(略)、字体倾斜、字体大小为10、中文“楷体”、英文“Times New Roman”、红色、最小行间距、左对齐、首行缩进)、第二段内容(内容(略)、字体大小为12、黑体、1.5倍行间距、左对齐、首行缩进、插入图片)、第三段内容(内容(略)、字体大小为14、华文彩云、2倍行间距、左对齐、首行缩进)第一步:请先安装PageOffice的服务器端的安装程序,之后在WEB项目下的“WebRoot/WEB-INF/lib”路径中添加pageoffice.cab和pageoffice.jar(在网站的“下载中心”中可下载相应的压缩包,解压之后直接将pageoffice.cab和pageoffice.jar文件拷贝到该目录下就可以了)文件。

第二步:修改WEB项目的配置文件,将如下代码添加到配置文件中:<!-- PageOffice Begin --><servlet><servlet-name>poserver</servlet-name><servlet-class>com.zhuozhengsoft .pageoffice.poserver.Server</servlet-class></servlet><servlet-mapping><servlet-name>poserver</servlet-name><url-pattern>/poserver.do</url-pattern></servlet-mapping><servlet-mapping><servlet-name>poserver</servlet-name><url-pattern>/pageoffice.cab</url-pattern></servlet-mapping><servlet-mapping><servlet-name>poserver</servlet-name><url-pattern>/popdf.cab</url-pattern></servlet-mapping><servlet-mapping><servlet-name>poserver</servlet-name><url-pattern>/sealsetup.exe</url-pattern></servlet-mapping><servlet><servlet-name>adminseal</servlet-name><servlet-class>com.zhuozhengsoft.pageoffice.poserver.AdminSeal </servlet-class></servlet><servlet-mapping><servlet-name>adminseal</servlet-name><url-pattern>/adminseal.do</url-pattern></servlet-mapping><servlet-mapping><servlet-name>adminseal</servlet-name><url-pattern>/loginseal.do</url-pattern></servlet-mapping><servlet-mapping><servlet-name>adminseal</servlet-name><url-pattern>/sealimage.do</url-pattern></servlet-mapping><mime-mapping><extension>mht</extension><mime-type>message/rfc822</mime-type></mime-mapping><context-param><param-name>adminseal-password</param-name><param-value>123456</param-value></context-param><!-- PageOffice End -->第三步:在WEB项目的WebRoot目录下添加文件夹存放word模板文件,在此命名为“doc”,将要打开的空白Word文件拷贝到该文件夹下,我要打开的Word文件为“test.doc”。

java 写docx xwpfdocument 大纲

java 写docx xwpfdocument 大纲

java 写docx xwpfdocument 大纲一、**了解Java和XWPFC库**首先,我们需要了解Java的基本语法以及XWPFC库的使用方法。

XWPFC库是一个用于处理Microsoft Word文件的Java库,它可以生成和解析docx文件。

二、**设置开发环境**接下来,我们需要设置Java开发环境,包括安装Java开发工具包(JDK)和集成开发环境(IDE),如Eclipse或NetBeans。

此外,我们还需要安装XWPFC库的Java包装。

三、**创建大纲文档**使用XWPFC库,我们可以使用Java编写docx文件的大纲。

首先,我们需要创建一个XwpDocument对象,这是所有文档操作的起点。

然后,我们可以使用XwpParagraph和XwpList等对象来创建大纲中的段落和列表。

四、**添加内容**在创建大纲后,我们可以向其中添加内容。

这包括文本、图片、表格等。

可以使用Java的字符串操作和文件读写功能来实现这一点。

五、**保存文档**最后,我们需要将文档保存为docx文件。

可以使用XWPFC库提供的save方法来完成这一操作。

保存的文件可以以.docx为扩展名进行查看。

六、**示例代码**以下是一个简单的Java代码示例,用于创建一个包含大纲和内容的docx文件:```javaimport com.syncleus.ftglabs.xwpf.*;import com.syncleus.ftglabs.xwpf.model.*;import java.io.*;public class DocxCreator {public static void main(String[] args) {try {// 创建XwpDocument对象XwpDocument doc = new XwpDocument();// 添加标题XwpParagraph title =doc.getDocument().getParagraphs().add();title.setString("这是一个大纲");// 添加段落XwpParagraph para =doc.getDocument().getParagraphs().add();para.setString("这是第一个段落");// 保存文件doc.save("大纲.docx");} catch (Exception e) {e.printStackTrace();}}}```以上代码创建了一个简单的docx文件,包含一个标题和一个段落。

利用JavaApachePOI生成Word文档示例代码

利用JavaApachePOI生成Word文档示例代码

利⽤JavaApachePOI⽣成Word⽂档⽰例代码最近公司做的项⽬需要实现导出Word⽂档的功能,⽹上关于POI⽣成Word⽂档的例⼦很少,找了半天才在官⽹⾥找到个Demo,有了Demo⼀切就好办了。

/* ====================================================================Licensed to the Apache Software Foundation (ASF) under one or morecontributor license agreements. See the NOTICE file distributed withthis 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 withthe License. You may obtain a copy of the License at/licenses/LICENSE-2.0Unless required by applicable law or agreed to in writing, softwaredistributed under the License is distributed on an "AS IS" BASIS,WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.See the License for the specific language governing permissions andlimitations under the License.==================================================================== */package ermodel;import java.io.FileOutputStream;/*** A simple WOrdprocessingML document created by POI XWPF API** @author Yegor Kozlov*/public class SimpleDocument {public static void main(String[] args) throws Exception {XWPFDocument doc = new XWPFDocument();XWPFParagraph p1 = doc.createParagraph();p1.setAlignment(ParagraphAlignment.CENTER);p1.setBorderBottom(Borders.DOUBLE);p1.setBorderTop(Borders.DOUBLE);p1.setBorderRight(Borders.DOUBLE);p1.setBorderLeft(Borders.DOUBLE);p1.setBorderBetween(Borders.SINGLE);p1.setVerticalAlignment(TextAlignment.TOP);XWPFRun r1 = p1.createRun();r1.setBold(true);r1.setText("The quick brown fox");r1.setBold(true);r1.setFontFamily("Courier");r1.setUnderline(UnderlinePatterns.DOT_DOT_DASH);r1.setTextPosition(100);XWPFParagraph p2 = doc.createParagraph();p2.setAlignment(ParagraphAlignment.RIGHT);//BORDERSp2.setBorderBottom(Borders.DOUBLE);p2.setBorderTop(Borders.DOUBLE);p2.setBorderRight(Borders.DOUBLE);p2.setBorderLeft(Borders.DOUBLE);p2.setBorderBetween(Borders.SINGLE);XWPFRun r2 = p2.createRun();r2.setText("jumped over the lazy dog");r2.setStrike(true);r2.setFontSize(20);XWPFRun r3 = p2.createRun();r3.setText("and went away");r3.setStrike(true);r3.setFontSize(20);r3.setSubscript(VerticalAlign.SUPERSCRIPT);XWPFParagraph p3 = doc.createParagraph();p3.setWordWrap(true);p3.setPageBreak(true);//p3.setAlignment(ParagraphAlignment.DISTRIBUTE);p3.setAlignment(ParagraphAlignment.BOTH);p3.setSpacingLineRule(LineSpacingRule.EXACT);p3.setIndentationFirstLine(600);XWPFRun r4 = p3.createRun();r4.setTextPosition(20);r4.setText("To be, or not to be: that is the question: "+ "Whether 'tis nobler in the mind to suffer "+ "The slings and arrows of outrageous fortune, "+ "Or to take arms against a sea of troubles, "+ "And by opposing end them? To die: to sleep; ");r4.addBreak(BreakType.PAGE);r4.setText("No more; and by a sleep to say we end "+ "The heart-ache and the thousand natural shocks "+ "That flesh is heir to, 'tis a consummation "+ "Devoutly to be wish'd. To die, to sleep; "+ "To sleep: perchance to dream: ay, there's the rub; "+ ".......");r4.setItalic(true);//This would imply that this break shall be treated as a simple line break, and break the line after that word: XWPFRun r5 = p3.createRun();r5.setTextPosition(-10);r5.setText("For in that sleep of death what dreams may come");r5.addCarriageReturn();r5.setText("When we have shuffled off this mortal coil,"+ "Must give us pause: there's the respect"+ "That makes calamity of so long life;");r5.addBreak();r5.setText("For who would bear the whips and scorns of time,"+ "The oppressor's wrong, the proud man's contumely,");r5.addBreak(BreakClear.ALL);r5.setText("The pangs of despised love, the law's delay,"+ "The insolence of office and the spurns" + ".......");FileOutputStream out = new FileOutputStream("simple.docx");doc.write(out);out.close();}}以上就是本⽂的全部内容,希望对⼤家的学习有所帮助,也希望⼤家多多⽀持。

java 根据word模板生成word文件

java 根据word模板生成word文件

java 根据word模板生成word文件Java可以使用Apache POI库来生成Word文件,并且也可以使用freemarker等模板引擎来实现根据Word模板生成Word 文件的功能。

下面是一个简单的示例代码,可以帮助您快速入门。

模板制作:offer,wps都行,我使用wps进行操作第一步制作模板CTRL+f9生成域------》鼠标右键编辑域------》选择邮件合并-----》在域代码后面加上英文${跟代码内的一致}。

这样模板就创建好了。

首先需要引入POI和freemarker的依赖:<!-- Apache POI --><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>接下来是一个简单的示例代码:public class WordGenerator {public static void main(String[] args) throws IOException, TemplateException {// 读取Word模板try {= null;//wordInputStream in = new (new File("模板文件.docx"));//注册xdocreport实例并加载FreeMarker模板引擎IXDocReport r = XDocReportRegistry.getRegistry().loadReport(in, TemplateEngineKind.Freemarker);// 生成Word文件//创建xdocreport上下文对象IContext context =r.createContext();//将需要替换的数据数据添加到上下文中//其中key为word模板中的域名,value是需要替换的值User user = new User("zhangsan", 18, "福建泉州");context.put("uesrname",user.getUsername());context.put("age", user.getAge()); context.put("address",user.getAddress());out = new (newFile("D://xxx.docx"));//处理word文档并输出r.process(context, out);} catch (IOException e) {e.printStackTrace();} finally {if (in != null) {try {in.close();} catch (IOException e) {e.printStackTrace();}}if (out != null) {try {out.close();} catch (IOException e) {e.printStackTrace();}}}}}在这个示例代码中,我们读取了名为模板文件.docx的Word 模板,然后准备了一些数据,利用Freemarker模板引擎将数据填充到模板中,最后生成了一个名为xxx.docx的Word文件。

Java如何实现读取txt文件内容并生成Word文档

Java如何实现读取txt文件内容并生成Word文档

Java如何实现读取txt⽂件内容并⽣成Word⽂档⽬录导⼊Jar包1. Maven仓库下载导⼊2. ⼿动导⼊读取txt⽣成Word注意事项本⽂将以Java程序代码为例介绍如何读取txt⽂件中的内容,⽣成Word⽂档。

在编辑代码前,可参考如下代码环境进⾏配置:IntelliJ IDEAFree Spire.Doc for JavaTxt⽂档导⼊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”窗⼝,然后执⾏如下步骤导⼊:找到本地路径下的jar⽂件,添加到列表,然后导⼊:读取txt⽣成Word代码⼤致步骤如下:1. 实例化Document类的对象。

然后通过Document.addSection()⽅法和Section.addParagraph()⽅法添加节和段落。

2. 读取txt⽂件:创建InputStreamReader类的对象,构造⽅法中传递输⼊流和指定的编码表名称。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 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&lt;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}。

相关文档
最新文档