java操作word(精)
docx4j操作word

Docx4j操作word目录1.Docx4j介绍 (1)1.1.Docx4j介绍 (1)2.Docx4j操作 (1)2.1.初始读取word (2)2.2.标签替换 (2)2.3.chart图表内容替换 (4)2.4.插入图片 (9)3.文档的一些操作 (10)3.1.合并word (10)3.2.word转换成pdf (11)1.Docx4j介绍1.1.Docx4j介绍docx4j是一个用于创建和操作Microsoft Open XML (Word docx, Powerpoint pptx, 和Excel xlsx)文件的Java类库。
/trac/docx4j官方主页。
2.Docx4j操作2.1.初始读取word2.2.标签替换在操作word的时候,多数情况的下是通过标签进行替换相关的内容。
标签在word中可以定义一个位置,或者标示一个段落内容。
在一个模板中定义好标签,在插入-》书签:然后定义好名称。
在java的代码中对标签进行遍历,得到该名称,并替换成相关的内容。
找到相应的位置然后替换,相应的文本,需要注意的是替换相关的内容的格式。
2.3.chart图表内容替换chart图的替换有两种方法,一种是word里面的插入的图表,这时在进行更改值的时候,需要更改图标的内容,然后再更新excel的相关内容。
【没有找到更新一个自动更新另一个的方法。
】另一种使用jfreechart生成一个图片,然后以图片的形式插入进入。
2.4.插入图片可以使用标签的形式插入图片。
通过书签找到要插入的位置,然后按照下面方法进行插入。
Byte[] 内为图片的内容。
3.文档的一些操作3.1.合并word合并word,使用企业版的jar,企业版需要付费,不然在合并的时候会出现一个黄色的一段话,可以在合并之后,在遍历word去掉就可以了。
企业版的下载地址/m/index.php/products?_ga=1.209329106.1555965705.1478829970 3.2.word转换成pdfword转换成PDF,其他的方法转换都有乱码问题、chart无法转换等。
如何通过java给word模板当中的内容进行换行

如何通过java给word模板当中的内容进⾏换⾏代码⽰例/*** 换⾏⽅法* @param wordPath word模板的地址* @param wordOutPath 换⾏后输出word的新地址*/public static void wordNewLine(String wordPath,String wordOutPath){//获取⽂档docXWPFDocument doc = null;try {doc = new XWPFDocument(new FileInputStream(wordPath));} catch (IOException e) {e.printStackTrace();}//遍历所有表格for(XWPFTable table : doc.getTables()) {for(XWPFTableRow row : table.getRows()) {for(XWPFTableCell cell : row.getTableCells()) {//单元格 : 直接cell.setText()只会把⽂字加在原有的后⾯,删除不了⽂字addBreakInCell(cell);}}}try {doc.write(new FileOutputStream(wordOutPath));} catch (IOException e) {e.printStackTrace();}}/*** 匹配单元格内容\n 替换为换⾏* @param cell*/private static void addBreakInCell(XWPFTableCell cell) {if (cell.getText() != null && cell.getText().contains("\n")) {for (XWPFParagraph paragraph : cell.getParagraphs()) {paragraph.setAlignment(ParagraphAlignment.LEFT);for (XWPFRun run : paragraph.getRuns()) {if (run.getText(0) != null && run.getText(0).contains("\n")) {String[] lines = run.getText(0).split("\n");if (lines.length > 0) {// set first line into XWPFRunrun.setText(lines[0], 0);for (int i = 1; i < lines.length; i++) {// add break and insert new textrun.addBreak();run.setText(lines[i]);}}}}}}}这⾥需要注意⼀点⽹络上⾯我测试了/n ,/r,/n/r,包括/r/n都不能完美实现换⾏,所以最后通过addBreak这个函数实现了函数的换⾏。
Java使用模板导出word文档

Java使⽤模板导出word⽂档Java使⽤模板导出word⽂档需要导⼊freemark的jar包1. 使⽤word模板,在需要填值的地⽅使⽤字符串代替,是因为word转换为xml⽂件时查找不到要填⼊内容的位置。
尽量不要在写字符串的时候就加上${},xml⽂件会让它和字符串分离。
⽐如:姓名| name2. 填充完之后,把word⽂件另存为xml⽂件,然后使⽤notepad 等编辑软件打开,打开之后代码很多,也很乱,根本看不懂,其实也不⽤看懂哈,搜索找到你要替换的位置的字符串,⽐如name,然后加上${},变成${name}这样,然后就可以保存了,之后把保存的⽂件名后缀替换为.ftl。
模板就ok了。
3. 有个注意事项,这⾥的值⼀定不可以为空,否则会报错,freemark有判断为空的语句,这⾥⽰例⼀个,根据个⼈需求,意思是判断name是否为空,trim之后的lenth是否⼤于0:<#if name?default("")?trim?length gt 0><w:t>${name}</w:t></#if>4. 如果在本地的话可以直接下载下来,但是想要在通过前端下载的话那就需要先将⽂件下载到本地,当作临时⽂件,然后在下载⽂件。
接下来上代码,⽰例:public void downloadCharge(String name, HttpServletRequest request, HttpServletResponse response) {Map<String, Object> map = new HashMap<>();map.put("name", name);Configuration configuration = new Configuration();configuration.setDefaultEncoding("utf-8");try { //模板存放位置InputStream inputStream = this.getClass().getResourceAsStream("/template/report/XXX.ftl");Template t = new Template(null, new InputStreamReader(inputStream));String filePath = "tempFile/";//导出⽂件名String fileName = "XXX.doc";//⽂件名和路径不分开写的话createNewFile()会报错File outFile = new File(filePath + fileName);if (!outFile.getParentFile().exists()) {outFile.getParentFile().mkdirs();}if (!outFile.exists()) {outFile.createNewFile();}Writer out = null;FileOutputStream fos = null;fos = new FileOutputStream(outFile);OutputStreamWriter oWriter = new OutputStreamWriter(fos, "UTF-8");//这个地⽅对流的编码不可或缺,使⽤main()单独调⽤时,应该可以,但是如果是web请求导出时导出后word⽂档就会打不开,并且包XML⽂件错误。
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向word模板中填充数据(总结)
![[原创]java向word模板中填充数据(总结)](https://img.taocdn.com/s3/m/fd6e32cd59f5f61fb7360b4c2e3f5727a5e924de.png)
[原创]java向word模板中填充数据(总结) 使⽤过PageOffice动态⽣成word⽂档的⼈都知道,PageOffice可以给word⽂档的指定位置进⾏填充,这⾥我们所说的指定位置在PageOffice的专业术语⾥⾯有两个概念,⼀个叫做数据区域(DataRegion),另⼀个叫做数据标签(DataTag)。
⼀、概念 数据区域:是Word⽂档中具有 "PO_" 前缀命名的书签所定位的⽂档区域。
简单来说,数据区域就是⼀种特殊的Word书签对象,便于定位Word⽂档中的内容。
数据标签:是任意的有效字符组成的特殊样式的字符串(如“【时间】”、“{姓名}”、“${name}”等等)作为标记,理论上这样的字符串(⽐如:“性别”、“地址”、“aa”、“bbcc”)也可以当做数据标签,但是不推荐使⽤,因为这样的标签不能从视觉上直观的看出word⽂档中包含了哪些数据标签。
⼆、使⽤ 数据区域⾥⾯可以填充些的内容:⽂本、图⽚、Word⽂件、Excel⽂件。
WordDocument doc = new WordDocument();//填充⽂本DataRegion dataRegion1 = doc.openDataRegion("PO_userName");dataRegion1.setValue("张三");//还可以给填充的⽂本设置字体,颜⾊,粗体等样式dataRegion1.getFont().setColor(Color.blue);dataRegion1.getFont().setSize(24);dataRegion1.getFont().setName("⾪书");dataRegion1.getFont().setBold(true);//填充图⽚doc.openDataRegion("PO_deptName").setValue("[image]img/123.jpg[/image]");//填充word⽂件doc.openDataRegion("PO_deptName").setValue("[word]doc/aabb.doc[/word]");//填充excel⽂件doc.openDataRegion("PO_deptName").setValue("[excel]doc/bbcc.xls[/excel]"); 数据标签中可以填充的内容:⽂本。
Java 设置Word表格自适应的3种情况

Java 设置Word中的表格自适应的3种方式概述在Word创建表格时,可设置表格“自动调整”,有3种情况,通过Java程序设置可调用相应的方法来实现,即:①. 根据内容调整表格AutoFitBehaviorType.Auto_Fit_To_Contents②. 根据窗口调整表格AutoFitBehaviorType.Auto_Fit_To_Window③. 固定列宽AutoFitBehaviorType.Fixed_Column_Widths程序中需要使用Word类库工具(Free Spire.Doc for Java 免费版)导入方法:方法1.可下载导入jar文件方法2.创建Maven程序在pom.xml配置Maven仓库路径并指定Free Spire.Doc for Java 的Maven依赖。
完成配置后,如果使用的是IDEA,点击“Import Changes”导入;如果使用的是Eclipse,点击“保存”即可自动下载导入。
<repositories><repository><id>com.e-iceblue</id><url>/repository/maven-public/</url></repository></repositories><dependencies><dependency><groupId> e-iceblue </groupId><artifactId>spire.doc.free</artifactId><version>2.7.3</version></dependency></dependencies>Java示例import com.spire.doc.*;public class TableAutoFit {public static void main(String[] args) {//加载Word文档Document doc = new Document();doc.loadFromFile("test.docx");//获取sectionSection section = doc.getSections().get(0);//获取表格Table table = section.getTables().get(0);//设置表格列宽适应内容table.autoFit(AutoFitBehaviorType.Auto_Fit_To_Contents);//设置表格列宽适应窗体//table.autoFit(AutoFitBehaviorType.Auto_Fit_To_Window);//设置表格固定列宽//table.autoFit(AutoFitBehaviorType.Fixed_Column_Widths);//保存文档doc.saveToFile("TableAutoFit2.docx",FileFormat.Docx_2013); doc.dispose();}}设置效果:1.适应内容2.适应窗体3.固定列宽。
Java 获取Word文本样式(字体、字号、颜色、背景、行距等)
Java 读取Word文本/段落格式属性本文介绍通过Java后端程序代码来读取Word文本和段落格式的方法。
本次测试环境如下:●Word版本:2013●编译环境:IntelliJ IDEA2018●Work库:free spire.doc.jar 3.9.0●JDK版本:1.8.0通过textrange.getCharacterFormat()方法读取文本字符串格式,通过paragraph.getFormat()读取段落格式,读取具体文字及段落属性时,可支持读取字体、字号、文字颜色、文字背景、文字是否加粗或倾斜、文字下划线、大小写、边框、上标下标、行距、段落缩进、对齐方式、段落边框、背景等等,下表中罗列了所有可支持读取的样式属性,供参考:读取文本格式getCharacterFormat():读取段落格式:getFormat()用于测试的Word文档:Java示例代码import com.spire.doc.*;import com.spire.doc.documents.Paragraph;import com.spire.doc.documents.TextSelection;import com.spire.doc.fields.TextRange;import java.awt.*;public class GetTextFormat {public static void main(String[] args) {//加载Word源文档Document doc = new Document();doc.loadFromFile("test.docx");//获取段落数量int count = doc.getSections().get(0).getParagraphs().getCount();System.out.println("总共含有段落数:" + count);//查找指定文本TextSelection textSelections = doc.findString("东野圭吾", false, true);//获取字体名称String fontname =textSelections.getAsOneRange().getCharacterFormat().getFontName();//获取字体大小float fontsize =textSelections.getAsOneRange().getCharacterFormat().getFontSize();System.out.println("字体名称:" + fontname +"\n"+"字体大小:"+fontsize);//获取第二段Paragraph paragraph2 = doc.getSections().get(0).getParagraphs().get(1);//获取段落行距float linespage = paragraph2.getFormat().getLineSpacing();System.out.println("段落行距:" + linespage);//遍历段落中的子对象for (int z = 0; z < paragraph2.getChildObjects().getCount(); z++){Object obj2 = paragraph2.getChildObjects().get(z);//判定是否为文本if (obj2 instanceof TextRange){TextRange textRange2 = (TextRange) obj2;//获取文本颜色Color textcolor = textRange2.getCharacterFormat().getTextColor();if (!(textcolor.getRGB() == 0)){System.out.println("文本颜色:" + textRange2.getText() + textcolor.toString());}//获取字体加粗效果boolean isbold = textRange2.getCharacterFormat().getBold();if (isbold == true){System.out.println("加粗文本:" + textRange2.getText());}//获取字体倾斜效果boolean isitalic = textRange2.getCharacterFormat().getItalic();if (isitalic == true){System.out.println("倾斜文本:" + textRange2.getText());}//获取文本背景String text = textRange2.getText();Color highlightcolor =textRange2.getCharacterFormat().getHighlightColor();//获取文本的高亮颜色(即突出显示颜色)if (!(highlightcolor.getRGB() == 0 )){System.out.println("文本高亮:" + text +highlightcolor.toString());//输出高亮的文本和颜色}Color textbackgroundcolor =textRange2.getCharacterFormat().getTextBackgroundColor();//获取文字背景(底纹)if (!(textbackgroundcolor.getRGB()==0)){System.out.println("文本背景:" + text + textbackgroundcolor.toString());//输出有背景的文本和颜色}}}}}运行程序,输入获取结果:。
Java 复制Word文档
Java 复制Word文档本文介绍在Java程序中如何复制Word文档。
复制方法均以带格式复制,代码示例将从以下要点展示:复制Word正文内容,可支持包括文本、图片、表格、超链接、书签、批注、形状、编号列表、脚注、尾注等在内的多种元素。
复制时,可复制整篇文档内容和复制指定段落内容复制Word页眉页脚,包括页眉页脚中的文本、图片、页码域等等复制Word水印效果,包括文本水印、图片水印工具:Free Spire.Doc for Java(免费版)可下载jar包,并解压将lib文件夹下的jar文件导入Java程序,或通过maven仓库下载导入。
参考如下导入效果:用于测试的两个文档如下,将左边文档内容复制到右边的文档:【示例1】复制Word正文内容1.1 复制整篇文档内容import com.spire.doc.*;public class CopyDoc {public static void main(String[] args) {//加载文档1Document doc1 = new Document();doc1.loadFromFile("test.docx");//加载文档2Document doc2 = new Document();doc2.loadFromFile("target.docx");//遍历文档1中的所有子对象for (int i = 0; i < doc1.getSections().getCount(); i++) {Section section = doc1.getSections().get(i);for( int j = 0;j< section.getBody().getChildObjects().getCount();j++){Object object = section.getBody().getChildObjects().get(j);//复制文档1中的正文内容添加到文档2doc2.getSections().get(0).getBody().getChildObjects().add(((DocumentObject) object).deepClone());}}//保存文档2doc2.saveToFile("CopyDoc.docx", FileFormat.Docx_2013);doc2.dispose();}}复制效果(这里复制的效果不含水印、页眉页脚等内容):1.2 复制指定段落内容import com.spire.doc.*;import com.spire.doc.documents.Paragraph;public class CopyPara {public static void main(String[] args) {//加载文档1Document doc1 = new Document();doc1.loadFromFile("test.docx");//获取文档1中的第三段Section section1 = doc1.getSections().get(0);Paragraph paragraph = section1.getParagraphs().get(2);//加载文档2,获取sectionDocument doc2 = new Document();doc2.loadFromFile("target.docx");Section section2 = doc2.getSections().get(0);//复制文档1中段落,添加到文档2Paragraph newparagraph = (Paragraph) paragraph.deepClone(); section2.getParagraphs().add(newparagraph);//保存文档2doc2.saveToFile("CopyPara.docx",FileFormat.Docx_2013);doc2.dispose();}}段落复制结果:【示例2】复制Word页眉页脚import com.spire.doc.*;public class CopyHeaderFooter {public static void main(String[] args) {//加载文档1Document doc1 = new Document();doc1.loadFromFile("test.docx");//获取sectionSection section1 = doc1.getSections().get(0);//获取文档1的页眉页脚HeaderFooter header = section1.getHeadersFooters().getHeader(); HeaderFooter footer = section1.getHeadersFooters().getFooter();//加载文档2Document doc2 = new Document();doc2.loadFromFile("target.docx");//遍历文档2的sectionfor (int i = 0; i< doc2.getSections().getCount();i++){Section section2 = doc2.getSections().get(i);//遍历页眉中的对象for(int j = 0 ; j< header.getChildObjects().getCount();j++){//获取页眉中的所有子对象Object object1 = header.getChildObjects().get(j);//复制文档1的页眉添加到文档2section2.getHeadersFooters().getHeader().getChildObjects().add(((DocumentObject) object1).deepClone());}//同理复制页脚for(int z = 0 ; z< footer.getChildObjects().getCount();z++){Object object2 = footer.getChildObjects().get(z);section2.getHeadersFooters().getFooter().getChildObjects().add(((DocumentObject) object2).deepClone());}}//保存文档2doc2.saveToFile("CopyHeaderFooter.docx",FileFormat.Docx_2013);doc2.dispose();}}页眉复制效果:页脚复制效果:【示例3】复制Word水印import com.spire.doc.*;public class CopyWatermark {public static void main(String[] args) {//加载文档1Document doc1 = new Document();doc1.loadFromFile("test.docx");//加载文档2Document doc2 = new Document();doc2.loadFromFile("target.docx");//获取文档1的水印效果,设置到文档2doc2.setWatermark(doc1.getWatermark());//保存文档2doc2.saveToFile("CopyWatermark.docx",FileFormat.Docx_2013);doc2.dispose();}}水印复制效果(此方法均适用于复制文本水印或图片水印):注:对于文档结构比较复制的Word,可综合以上方法来进行复制,查看复制效果。
POIXWPF操作word并操作表格
POIXWPF操作word并操作表格POIXWPF是一种用于操作Microsoft Word文档的Java库。
它提供了丰富的API,方便开发人员对Word文档进行创建、读取、修改和保存等操作。
本文将介绍如何使用POIXWPF来操作Word文档以及表格的相关操作。
一、创建Word文档在使用POIXWPF创建Word文档之前,首先需要添加POIXWPF 的依赖。
在项目中引入相关的jar包后,我们可以使用以下代码来创建一个新的Word文档:```java// 创建一个新的文档XWPFDocument document = new XWPFDocument();// 创建段落XWPFParagraph paragraph = document.createParagraph();// 在段落中添加文本XWPFRun run = paragraph.createRun();run.setText("这是一个POIXWPF创建的Word文档");// 保存文档FileOutputStream out = newFileOutputStream("path/to/document.docx");document.write(out);out.close();```以上代码首先创建了一个新的`XWPFDocument`对象,然后创建了一个段落`XWPFParagraph`,并在段落中添加了文本内容。
最后,通过`FileOutputStream`将文档保存到指定的路径下。
二、操作表格POIXWPF还提供了丰富的API来操作Word文档中的表格。
下面的示例代码演示了如何使用POIXWPF来创建一个简单的表格并填充内容:```java// 创建一个新的文档XWPFDocument document = new XWPFDocument();// 创建表格XWPFTable table = document.createTable(3, 3);// 设置表格样式CTTblPr tablePr = table.getCTTbl().getTblPr();CTTblBorders borders = tablePr.addNewTblBorders();borders.addNewTop().setVal(STBorder.SINGLE);borders.addNewBottom().setVal(STBorder.SINGLE);borders.addNewLeft().setVal(STBorder.SINGLE);borders.addNewRight().setVal(STBorder.SINGLE);// 填充表格内容for (int row = 0; row < 3; row++) {for (int col = 0; col < 3; col++) {XWPFTableCell cell = table.getRow(row).getCell(col);cell.setText("第" + (row + 1) + "行" + "第" + (col + 1) + "列");}}// 保存文档FileOutputStream out = newFileOutputStream("path/to/document.docx");document.write(out);out.close();```以上代码创建了一个3行3列的表格,并在每个单元格中填充了内容。
JAVA读取word文件
JAVA读取word文件关键词:JAVA word作者:bluerain QQ:890626471。
读取word文件有两种方法,用jacob包,可以修改生成word文件内容。
如果只读取word里的文本内容的话,可以用poi读取word文件,先到/maven2/org/textmining/tm-extractors/下载tm-extractors-0.4.jar包2。
读取word里的文本内容的示列代码import java.io.*;import org.textmining.text.extraction.WordExtractor;public class TestPoi {public TestPoi() {}public static void main(String args[]) throws Exception{try{FileInputStream in = new FileInputStream ("D:/szqxjzhbase/doc/修改后/2001-2005年/重大致灾暴雨/20050819-20/技术总结/2005年8月20日一次大暴雨过程低空急流脉动与强降水关系分析 .doc");// FileInputStream in = new FileInputStream ("D:/szqxjzhbase/技术测试/新建Microsoft Word 文档.doc");WordExtractor extractor = new WordExtractor();System.out.println(in.available());String str = extractor.extractText(in);// System.out.println("the result length is"+str.length());System.out.println(str);}catch(Exception e){e.printStackTrace();}}}3。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
JAVA操作word Java操作Microsoft Word之jacob(精) 现在我们一起来看看,用Java如何操作Microsoft Word。 jacob,官网是http://danadler.com/jacob 这是一个开源的工具。最新版本1.7 官方的解释是:The JACOB Project: A JAva-COM Bridge 这是官方对下载文件的说明: jacob.jar: a JAR file for the java classes which you must add to your CLASSPATH. The package names replace com.ms with com.jacob (for example com.ms.com.Variant maps to com.jacob.com.Variant.
jacob.dll: a small Win32 DLL which you must add to your PATH. samples: provided in Java source and compiled form to demonstrate various features of the product. In particular, a set of wrapper classes for Microsoft® ADO are provided as samples.
开发环境: 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 com.jacob.com.Dispatch; import com.jacob.com.Variant;
public class MSWordManager { // word文档 private Dispatch doc; // word运行程序对象 private ActiveXComponent word;
// 所有word文档集合 private Dispatch documents;
// 选定的范围或插入点 private Dispatch selection;
private boolean saveOnExit = true; /** *//** * * @param visible 为true表示word应用程序可见 */ public MSWordManager(boolean visible) { if (word == null) { word = new ActiveXComponent("Word.Application"); word.setProperty("Visible", new Variant(visible)); } if (documents == null) documents = word.getProperty("Documents").toDispatch(); }
/** *//** * 设置退出时参数 * * @param saveOnExit boolean true-退出时保存文件,false-退出时不保存文件 */ public void setSaveOnExit(boolean saveOnExit) { this.saveOnExit = saveOnExit; }
/** *//** * 创建一个新的word文档 * */ public void createNewDocument() { doc = Dispatch.call(documents, "Add").toDispatch(); selection = Dispatch.get(word, "Selection").toDispatch(); }
/** *//** * 打开一个已存在的文档 * * @param docPath */ public void openDocument(String docPath) { closeDocument(); doc = Dispatch.call(documents, "Open", docPath).toDispatch(); selection = Dispatch.get(word, "Selection").toDispatch(); }
/** *//** * 把选定的内容或插入点向上移动 * * @param pos 移动的距离 */ public void moveUp(int pos) { if (selection == null) selection = Dispatch.get(word, "Selection").toDispatch(); for (int i = 0; i < pos; i++) Dispatch.call(selection, "MoveUp");
} /** *//** * 把选定的内容或者插入点向下移动 * * @param pos 移动的距离 */ public void moveDown(int pos) { if (selection == null) selection = Dispatch.get(word, "Selection").toDispatch(); for (int i = 0; i < pos; i++) Dispatch.call(selection, "MoveDown"); }
/** *//** * 把选定的内容或者插入点向左移动 * * @param pos 移动的距离 */ public void moveLeft(int pos) { if (selection == null) selection = Dispatch.get(word, "Selection").toDispatch(); for (int i = 0; i < pos; i++) { Dispatch.call(selection, "MoveLeft"); } }
/** *//** * 把选定的内容或者插入点向右移动 * * @param pos 移动的距离 */ public void moveRight(int pos) { if (selection == null) selection = Dispatch.get(word, "Selection").toDispatch(); for (int i = 0; i < pos; i++) Dispatch.call(selection, "MoveRight"); }
/** *//** * 把插入点移动到文件首位置 * */ public void moveStart() { if (selection == null) selection = Dispatch.get(word, "Selection").toDispatch(); Dispatch.call(selection, "HomeKey", new Variant(6)); }
public void moveEnd() { if (selection == null) selection = Dispatch.get(word, "Selection").toDispatch(); Dispatch.call(selection, "EndKey", new Variant(6)); } /** *//** * 从选定内容或插入点开始查找文本 * * @param toFindText 要查找的文本 * @return boolean true-查找到并选中该文本,false-未查找到文本 */ public boolean find(String toFindText) { if (toFindText == null || toFindText.equals("")) return false; // 从selection所在位置开始查询 Dispatch find = word.call(selection, "Find").toDispatch(); // 设置要查找的内容 Dispatch.put(find, "Text", toFindText); // 向前查找 Dispatch.put(find, "Forward", "True"); // 设置格式 Dispatch.put(find, "Format", "True"); // 大小写匹配 Dispatch.put(find, "MatchCase", "True"); // 全字匹配 Dispatch.put(find, "MatchWholeWord", "True"); // 查找并选中 return Dispatch.call(find, "Execute").getBoolean(); }
/** *//** * 把选定选定内容设定为替换文本 * * @param toFindText 查找字符串 * @param newText 要替换的内容 * @return */ public boolean replaceText(String toFindText, String newText) { if (!find(toFindText)) return false; Dispatch.put(selection, "Text", newText); return true; }