Web平台下JAVA生成WORD文件的方法目前有以下三种:
一、 是jacob。 但是局限于windows平台,往往许多JAVA程序运行于其他操作系统,在此不讨论该方案。
二、 是POI。 但是它的excel处理还凑合, word模块还局限于读取word的文本内容,写word文件的功能就更弱;还有一个要命的地方,处理doc格式和处理docx格式的类几乎完全不同,要分开针对不同的格式写不同的代码,这就意味着用户上传的docx格式文件如果使用了doc的扩展名,程序马上异常终止,但是如果项目的预算有限,也是只能考虑POI了。
OI对word文件操作的代码:
package org.apache.poi.xwpf.usermodel;
import java.io.FileOutputStream;
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);
//BORDERS
p2.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();
}
}
三、 是使用PageOffice 组件生成。这种效果(个人认为)是目前最好的方法,提供的接口和对象都简洁高效,开发效率很高。不仅支持从一个空白的document生成文件,还可以使用现有的word模板做数据填充,还可以把多个word模板插入到一个word模板中不同的位置来组合生成文件,例如做一个试卷生成系统,甚至还可以插入图片和Excel文件到word模板中的指定位置去生成一个复合型的文档报表,功能异常强大。但用这个产品也有一个缺点,就是这个是一个收费的产品,需要购买,但是只要项目预算充足,这是一个值得选择的方案。下面列举几个生成文件的效果代码:
1) 从空白生成文件的代码:
WordDocument doc = new WordDocument();
//设置内容标题
//创建DataRegion对象,PO_title为自动添加的书签名称,书签名称需以“PO_”为前缀,切书签名称不能重复
//三个参数分别为要新插入书签的名称、新书签的插入位置、相关联的书签名称(“[home]”代表Word文档的第一个位置)
DataRegion title = doc.createDataRegion("PO_title", DataRegionInsertType.After, "[home]");
//给DataRegion对象赋值
title.setValue("JAVA中编程实例\n");
//设置字体:粗细、大小、字体名称、是否是斜体
title.getFont().setBold(true);
title.getFont().setSize(20);
title.getFont().setName("黑体");
title.getFont().setItalic(false);
//定义段落对象
ParagraphFormat titlePara = title.getParagraphFormat();
//设置段落对齐方式
titlePara.setAlignment(WdParagraphAlignment.wdAlignParagraphCenter);
//设置段落行间距
titlePara.setLineSpacingRule(WdLineSpacing.wdLineSpaceMultiple);
//设置内容
//第一段
//创建DataRegion对象,PO_body为自动添加的书签名称
DataRegion body = doc.createDataRegion("PO_body", DataRegionInsertType.After, "PO_title");
//设置字体:粗细、是否是斜体、大小、字体名称、字体颜色
body.getFont().setBold(true);
body.getFont().setItalic(true);
body.getFont().setSize(10);
//设置中文字体名称
body.getFont().setName("楷体");
//设置英文字体名称
body.getFont().setNameAscii("Times New Roman");
body.getFont().setColor(Color.red);
//给DataRegion对象赋值
body.setValue("首先,我向大家介绍一下套接字的概念。\n");
//创建ParagraphFormat对象
ParagraphFormat bodyPara = body.getParagraphFormat();
//设置段落的行间距、对齐方式、首行缩进
bodyPara.setLineSpacingRule(WdLineSpacing.wdLineSpaceAtLeast);
bodyPara.setAlignment(WdParagraphAlignment.wdAlignParagraphLeft);
bodyPara.setFirstLineIndent(21);
2) 在一个word模板的文件中插入一个图片、word和Excel文档的代码:
WordDocument doc = new WordDocument();
//插入图片
DataRegion body4 = doc.createDataRegion("PO_body4", DataRegionInsertType.After, "PO_body3");// PO_body3是word模板中已存在的一个书签
body4.setValue("[image]doc/logo.png[/image]");
//body4.Value = "[word]doc/1.doc[/word]";//嵌入其他Word文件
//body4.Value = "[excel]doc/1.xls[/excel]";//嵌入其他Excel文件
ParagraphFormat bodyPara4 = body4.getParagraphFormat();
bodyPara4.setAlignment(WdParagraphAlignment.wdAlignParagraphCenter);
3) 操作word中的表格代码:
WordDocument doc = new WordDocument();
//打开数据区域
DataRegion dataRegion = doc.openDataRegion("PO_regTable");
//打开table,openTable(index)方法中的index代表Word文档中table位置的索引,从1开始
Table table = dataRegion.openTable(1);
//给table中的单元格赋值, openCellRC(int,int)中的参数分别代表第几行、第几列,从1开始
table.openCellRC(3, 1).setValue("A公司");
table.openCellRC(3, 2).setValue("开发部");
table.openCellRC(3, 3).setValue("李清");
//插入一行,insertRowAfter方法中的参数代表第几行,从1开始
table.insertRowAfter(3);
table.openCellRC(4, 1).setValue("B公司");
table.openCellRC(4, 2).setValue("销售部");
table.openCellRC(4, 3).setValue("张三");
4) 给word添加一个水印,对于实现这个效果来说,PageOffice确实已经做到简单到极致,如果用POI那个方案,抱歉本人没有找到相关的资料,但 PageOffice的代码只用下面一句:
WordDocument doc =new WordDocument();
//添加水印 ,设置水印的内容
doc.getWaterMark().setText("北京某某公司");
很简单吧。。。
采用这个方案的缺点上面已经说过了,优点有以下几点:不限制于Windows平台;接口和对象的设计就是针对Office文件生成专门优化设计的,调用代码简单,写起来比较舒服可读性强;编程的工作量更小,如果开发中也利用了Word模板,那开发量可以更低;生成的文件是地地道道的Word格式,生成的文件效果比较完美;也不需要像POI那样必须对doc和docx格式分别写代码;最后一点:服务器端不需要安装Office,不使用服务器端资源,所以不需要处理服务器端文件生成时的并发问题,也就是很多用户同时访问系统生成文件时服务器的压力问题。请注意这点,采用这个方案的话,文件是在客户端生成的,调用的是客户端的资源,完全符合分布式计算的思想。服务器端压力越小,系统就更稳定,这也是为什么个人认为这是一种推荐方案。另外PageOffice除了能导入导出Word、Excel外,还能在线显示、编辑、打印生成的文档,而POI只能生成文档,没有在线功能。测试发现PageOffice的在线功能也是目前市场上做的最好最稳定可靠的一款。个人认为,如果预算不是很紧张的话,应当毫不犹豫上PageOffice。
分享到:
相关推荐
在Java开发中,生成Word文档是一项常见的需求,例如在报告生成、数据导出或合同制作等场景。...实际应用中,根据项目特性和需求选择合适的库,并灵活运用其提供的功能,就能实现Java生成Word文档的“完美解决方案”。
"Java通过word模板配置书签生成word"是一个技术方案,它利用了Java的API来处理Microsoft Word文档,特别是Apache POI库,这是一种强大的工具,允许开发者在Java程序中创建、修改和展示MS Office格式的文件。...
### Java生成Word文档技术解析与实现 在现代企业级应用中,动态生成Word文档的需求日益增多,尤其是在报表生成、文档自动生成等领域。Java作为一种广泛使用的编程语言,提供了多种方法来根据Word模板生成Word文档,...
通过Java生成Word文档有多种方式,Apache POI是最常用且功能全面的选择,而tm-extractors则提供了一种更简洁的替代方案,适用于需求相对简单的情况。根据具体项目的需求选择合适的工具,可以使开发过程更加高效和...
这个“JAVA生成WORD工具类”提供了一种解决方案,使得开发者可以通过代码动态地生成Word文档,避免手动操作的繁琐和错误。下面将详细介绍这个工具类的工作原理和可能的应用场景。 首先,Java生成Word文档通常涉及到...
总的来说,RtfTemplate是一个强大的工具,它简化了Java生成Word文档的过程,使得开发者可以专注于数据处理和文档内容,而不是底层的文件操作。通过熟练掌握RtfTemplate的使用,可以大大提高开发效率,提升项目的质量...
Java 动态生成Word文件是一项常见的技术需求,尤其在企业级应用中,如报告生成、合同制作等场景。本Demo提供了这样一个解决方案,结合了二维码生成的功能,使得文件内容更加丰富和交互。 首先,我们来了解一下Java...
接下来,我们需要了解如何在Java代码中使用iText来生成Word文件。以下是一个简单的步骤概述: 1. **导入库**:在你的Java文件中,你需要导入必要的iText类。例如: ```java import com.lowagie.text.Document; ...
4. **生成Word文件**:使用Apache POI,打开Word模板文件,然后遍历模板中的每一段内容,如果遇到Freemarker的占位符,就用数据模型中的对应值替换。完成后,保存生成的Word文件。 5. **处理复杂结构**:在某些情况...
Java生成Word文档是一种常见的需求,特别是在企业级应用中,例如报告生成、数据导出等。在Java中,我们可以使用各种库来实现这个功能,比如Apache POI,它是一个开源项目,提供了API来处理Microsoft Office格式的...
### Java生成Word文档代码详解 #### 一、引言 在日常工作中,有时我们需要通过程序自动生成Word文档,尤其是在报表生成、数据导出等场景下。利用Java来生成Word文档不仅可以提高工作效率,还能确保文档的一致性和...
Java 生成复杂 Word 文档解决方案 ...Java 生成复杂 Word 文档的解决方案有很多应用场景,例如生成标准的 Word 文档、生成复杂的 Word 文档、生成大量的 Word 文档等。这些应用场景都可以使用本解决方案来实现。
在IT行业中,尤其是在Java开发领域,批量生成Word文档是一项常见的需求,特别是在大数据处理、报告生成或自动化办公场景中。PageOffice是一款强大的Java组件,专为处理Office文档提供解决方案,包括创建、编辑、转换...
Java使用Jacob库通过模板生成Word文档是一个常见的技术实践,尤其在企业级应用中,这种技术常用于批量生成报告、合同等文档。Jacob全称为Java Advanced COM Bridge,它为Java提供了与COM组件交互的能力,让我们可以...
使用FreeMarker生成Word文档,首先需要准备一个`.ftl`模板文件,定义好文档的结构和占位符,然后在Java代码中解析模板并替换占位符为实际数据。 三、生成Word文档步骤 1. 添加依赖:在项目中引入FreeMarker和用于...
**XDocReport**是一个基于OpenOffice和LibreOffice的Java库,它允许开发者通过FreeMarker模板直接生成Word(.docx)和OpenDocument(.odt)文档。FreeMarker是一个强大的模板语言,能够方便地处理动态数据。 要使用...
【Java生成复杂Word文档的完美解决方案】 在Java开发中,生成复杂的Word文档一直是一个挑战,尤其是在满足严格的格式和打印需求时。传统的解决方案如Apache POI和iText在处理大量表格、图片以及复杂的文档布局时,...