java深度处理word
基于java处理.docx格式的word合并
基于java处理.docx格式的word合并如下实例是将 2.docx和3.docx合并,写到empty.docx中,不适⽤于.doc格式,public static void main(String[] args) {File file1 = new File("D:\\empty.docx");List<File> targetFile1 = new ArrayList<>();targetFile1.add(new File("D:\\2.docx"));targetFile1.add(new File("D:\\3.docx"));appendDocx(file1, targetFile1);}/*** 把多个docx⽂件合并成⼀个** @param outfile 输出⽂件* @param targetFile ⽬标⽂件*/public static void appendDocx(File outfile, List<File> targetFile) {try {OutputStream dest = new FileOutputStream(outfile);ArrayList<XWPFDocument> documentList = new ArrayList<>();XWPFDocument doc = null;for (int i = 0; i < targetFile.size(); i++) {FileInputStream in = new FileInputStream(targetFile.get(i).getPath());OPCPackage open = OPCPackage.open(in);XWPFDocument document = new XWPFDocument(open);documentList.add(document);}for (int i = 0; i < documentList.size(); i++) {doc = documentList.get(0);if (i != 0) {/* if (i != documentList.size() - 1) {documentList.get(i).createParagraph().setPageBreak(true);}*/appendBody(doc, documentList.get(i));}}//doc.createParagraph().setPageBreak(true);doc.write(dest);} catch (Exception e) {e.printStackTrace();}}public static void appendBody(XWPFDocument src, XWPFDocument append) throws Exception {CTBody src1Body = src.getDocument().getBody();CTBody src2Body = append.getDocument().getBody();List<XWPFPictureData> allPictures = append.getAllPictures();// 记录图⽚合并前及合并后的IDMap<String, String> map = new HashMap<>();for (XWPFPictureData picture : allPictures) {String before = append.getRelationId(picture);//将原⽂档中的图⽚加⼊到⽬标⽂档中String after = src.addPictureData(picture.getData(), Document.PICTURE_TYPE_PNG);map.put(before, after);}appendBody(src1Body, src2Body, map);}private static void appendBody(CTBody src, CTBody append, Map<String, String> map) throws Exception {XmlOptions optionsOuter = new XmlOptions();optionsOuter.setSaveOuter();String appendString = append.xmlText(optionsOuter);String srcString = src.xmlText();String prefix = srcString.substring(0, srcString.indexOf(">") + 1);String mainPart = srcString.substring(srcString.indexOf(">") + 1, stIndexOf("<"));String sufix = srcString.substring(stIndexOf("<"));String addPart = appendString.substring(appendString.indexOf(">") + 1, stIndexOf("<"));//下⾯这部分可以去掉,我加上的原因是合并的时候,有时候出现打不开的情况,对照document.xml将某些标签去掉就可以正常打开了 addPart = addPart.replaceAll("w14:paraId=\"[A-Za-z0-9]{1,10}\"", "");addPart = addPart.replaceAll("w14:textId=\"[A-Za-z0-9]{1,10}\"", "");addPart = addPart.replaceAll("w:rsidP=\"[A-Za-z0-9]{1,10}\"", "");addPart = addPart.replaceAll("w:rsidRPr=\"[A-Za-z0-9]{1,10}\"", "");addPart = addPart.replace("<w:headerReference r:id=\"rId8\" w:type=\"default\"/>",""); addPart = addPart.replace("<w:footerReference r:id=\"rId9\" w:type=\"default\"/>",""); addPart = addPart.replace("xsi:nil=\"true\"","");if (map != null && !map.isEmpty()) {//对xml字符串中图⽚ID进⾏替换for (Map.Entry<String, String> set : map.entrySet()) {addPart = addPart.replace(set.getKey(), set.getValue());}}//将两个⽂档的xml内容进⾏拼接CTBody makeBody = CTBody.Factory.parse(prefix + mainPart + addPart + sufix);src.set(makeBody);}。
JavaPOI操作word文档内容、表格
JavaPOI操作word⽂档内容、表格⼀、pom<dependency><groupId>org.apache.poi</groupId><artifactId>poi</artifactId><version>4.0.0</version></dependency><dependency><groupId>org.apache.poi</groupId><artifactId>poi-scratchpad</artifactId><version>4.0.0</version></dependency><dependency><groupId>org.apache.poi</groupId><artifactId>poi-ooxml</artifactId><version>4.0.0</version></dependency><dependency><groupId>org.apache.poi</groupId><artifactId>poi-ooxml-schemas</artifactId><version>4.0.0</version></dependency>⼆、直接上代码word模板中${content} 注意我只有在.docx⽤XWPFDocument才有效2.1/*** 获取document**/XWPFDocument document = null;try {document = new XWPFDocument(inputStream);} catch (IOException ioException) {ioException.printStackTrace();}/*** 替换段落⾥⾯的变量** @param doc 要替换的⽂档* @param params 参数*/private void replaceInPara(XWPFDocument doc, Map<String, String> params) {for (XWPFParagraph para : doc.getParagraphs()) {replaceInPara(para, params);}}/*** 替换段落⾥⾯的变量** @param para 要替换的段落* @param params 参数*/private void replaceInPara(XWPFParagraph para, Map<String, String> params) {List<XWPFRun> runs;Matcher matcher;replaceText(para);//如果para拆分的不对,则⽤这个⽅法修改成正确的if (matcher(para.getParagraphText()).find()) {runs = para.getRuns();for (int i = 0; i < runs.size(); i++) {XWPFRun run = runs.get(i);String runText = run.toString();matcher = matcher(runText);if (matcher.find()) {while ((matcher = matcher(runText)).find()) {runText = matcher.replaceFirst(String.valueOf(params.get(matcher.group(1))));}//直接调⽤XWPFRun的setText()⽅法设置⽂本时,在底层会重新创建⼀个XWPFRun,把⽂本附加在当前⽂本后⾯, para.removeRun(i);para.insertNewRun(i).setText(runText);}}}}/*** 替换⽂本内容* @param para* @return*/private List<XWPFRun> replaceText(XWPFParagraph para) {List<XWPFRun> runs = para.getRuns();String str = "";boolean flag = false;for (int i = 0; i < runs.size(); i++) {XWPFRun run = runs.get(i);String runText = run.toString();if (flag || runText.equals("${")) {str = str + runText;flag = true;para.removeRun(i);if (runText.equals("}")) {flag = false;para.insertNewRun(i).setText(str);str = "";}i--;}}return runs;}2.22.2.1XWPFTable table = document.getTableArray(0);//获取当前表格XWPFTableRow twoRow = table.getRow(2);//获取某⼀⾏XWPFTableRow nextRow = table.insertNewTableRow(3);//插⼊⼀⾏XWPFTableCell firstRowCellOne = firstRow.getCell(0);firstRowCellOne.removeParagraph(0);//删除默认段落,要不然表格内第⼀条为空⾏XWPFParagraph pIO2 =firstRowCellOne.addParagraph();XWPFRun rIO2 = pIO2.createRun();rIO2.setFontFamily("宋体");//字体rIO2.setFontSize(8);//字体⼤⼩rIO2.setBold(true);//是否加粗rIO2.setColor("FF0000");//字体颜⾊rIO2.setText("这是写⼊的内容");//rIO2.addBreak(BreakType.TEXT_WRAPPING);//软换⾏,亲测有效/*** 复制单元格和样式** @param targetRow 要复制的⾏* @param sourceRow 被复制的⾏*/public void createCellsAndCopyStyles(XWPFTableRow targetRow, XWPFTableRow sourceRow) {targetRow.getCtRow().setTrPr(sourceRow.getCtRow().getTrPr());List<XWPFTableCell> tableCells = sourceRow.getTableCells();if (CollectionUtils.isEmpty(tableCells)) {return;}for (XWPFTableCell sourceCell : tableCells) {XWPFTableCell newCell = targetRow.addNewTableCell();newCell.getCTTc().setTcPr(sourceCell.getCTTc().getTcPr());List sourceParagraphs = sourceCell.getParagraphs();if (CollectionUtils.isEmpty(sourceParagraphs)) {continue;}XWPFParagraph sourceParagraph = (XWPFParagraph) sourceParagraphs.get(0);List targetParagraphs = newCell.getParagraphs();if (CollectionUtils.isEmpty(targetParagraphs)) {XWPFParagraph p = newCell.addParagraph();p.getCTP().setPPr(sourceParagraph.getCTP().getPPr());XWPFRun run = p.getRuns().isEmpty() ? p.createRun() : p.getRuns().get(0);run.setFontFamily(sourceParagraph.getRuns().get(0).getFontFamily());} else {XWPFParagraph p = (XWPFParagraph) targetParagraphs.get(0);p.getCTP().setPPr(sourceParagraph.getCTP().getPPr());XWPFRun run = p.getRuns().isEmpty() ? p.createRun() : p.getRuns().get(0);if (sourceParagraph.getRuns().size() > 0) {run.setFontFamily(sourceParagraph.getRuns().get(0).getFontFamily());}}}}#### 2.2.3/*** 合并单元格** @param table 表格对象* @param beginRowIndex 开始⾏索引* @param endRowIndex 结束⾏索引* @param colIndex 合并列索引*/public void mergeCell(XWPFTable table, int beginRowIndex, int endRowIndex, int colIndex) { if (beginRowIndex == endRowIndex || beginRowIndex > endRowIndex) {return;}//合并⾏单元格的第⼀个单元格CTVMerge startMerge = CTVMerge.Factory.newInstance();startMerge.setVal(STMerge.RESTART);//合并⾏单元格的第⼀个单元格之后的单元格CTVMerge endMerge = CTVMerge.Factory.newInstance();endMerge.setVal(STMerge.CONTINUE);table.getRow(beginRowIndex).getCell(colIndex).getCTTc().getTcPr().setVMerge(startMerge); for (int i = beginRowIndex + 1; i <= endRowIndex; i++) {table.getRow(i).getCell(colIndex).getCTTc().getTcPr().setVMerge(endMerge);}}/*** insertRow 在word表格中指定位置插⼊⼀⾏,并将某⼀⾏的样式复制到新增⾏* @param copyrowIndex 需要复制的⾏位置* @param newrowIndex 需要新增⼀⾏的位置* */public static void insertRow(XWPFTable table, int copyrowIndex, int newrowIndex) {// 在表格中指定的位置新增⼀⾏XWPFTableRow targetRow = table.insertNewTableRow(newrowIndex);// 获取需要复制⾏对象XWPFTableRow copyRow = table.getRow(copyrowIndex);//复制⾏对象targetRow.getCtRow().setTrPr(copyRow.getCtRow().getTrPr());//或许需要复制的⾏的列List<XWPFTableCell> copyCells = copyRow.getTableCells();//复制列对象XWPFTableCell targetCell = null;for (int i = 0; i < copyCells.size(); i++) {XWPFTableCell copyCell = copyCells.get(i);targetCell = targetRow.addNewTableCell();targetCell.getCTTc().setTcPr(copyCell.getCTTc().getTcPr());if (copyCell.getParagraphs() != null && copyCell.getParagraphs().size() > 0) {targetCell.getParagraphs().get(0).getCTP().setPPr(copyCell.getParagraphs().get(0).getCTP().getPPr()); if (copyCell.getParagraphs().get(0).getRuns() != null&& copyCell.getParagraphs().get(0).getRuns().size() > 0) {XWPFRun cellR = targetCell.getParagraphs().get(0).createRun();cellR.setBold(copyCell.getParagraphs().get(0).getRuns().get(0).isBold());}}}}/*** 正则匹配字符串** @param str* @return*/private Matcher matcher(String str) {Pattern pattern = pile("\\$\\{(.+?)\\}", Pattern.CASE_INSENSITIVE);Matcher matcher = pattern.matcher(str);return matcher;}。
Java解析OFFICE(word,excel,powerpoint)以及PDF的实现方案。。。
Java解析OFFICE(word,excel,powerpoint)以及PDF的实现⽅案。
Java解析OFFICE(word,excel,powerpoint)以及PDF的实现⽅案及开发中的点滴分享 在此,先分享下写此⽂前的经历与感受,我所有的感觉浓缩到⼀个字,那就是:"坑",如果是两个字那就是"巨坑"=>因为这个需求⼀开始并不是这样⼦的,且听我漫漫道来: ⼀开始客户与我们商量的是将office和PDF上传,将此类⽂件解析成html格式,在APP端调⽤内置server直接以html"播放" 经历⼀个⽉~,两个⽉~,三个⽉~~~ 到需求开发阶段,发现这是个坑。
:按照需规的意思这个整体是当做⼀个功能来做的,技术难度也就算了,⽽且按照估算的⼯时也很难做成需规所需要的样⼦(缺陷太多!) 然后⼀周~,⼀周~,⼜⼀周~~~ 各种⽅案下来将需求做成能⽤的样⼦,然后需求确认时客户说:“我们没有要求你们能解析这些⽂档,我们只要求你们当做⼀个源⽂件上传,在APP端点击直接能选择调⽤第三⽅应⽤打开就⾏了,⽽且⼀开始我们的需求就是这样的。
” /**听完,顿时泪流满⾯( _ ),如果业务⼀开始就确认这样做,何⾄于浪费如此多的时间,花费如此多的精⼒绕⽼⼤⼀圈。
*/ 需求绕了⼀圈⼜绕回来了,作为经历过的⼈,现在总结下这需求⾥⾯⽆尽的坑: A>开源社区有很多Demo,这些Demo有很多缺陷,⽐如office⾥⾯的艺术字、图⽚、公式、颜⾊样式、视频和⾳频不能解析 B>能解析的对象,解析出来的效果不是很好,⽐如word和ppt⾃⾝的排版乱了,excel单元格⾥⾯的⾃定义格式全变成数字了~等等 C>开源社区的资料并不是很全,导致的结果是不同的⽂档类型需要⽤不同的解析⽅式去解析,⽐如word⽤docx4j解析、excel⽤poi解析带来的代码量巨⼤ D>由于代码⾃⾝的解析效果不是很好,更改后的⽅案需要在上传之前将源⽂件处理成其他的形式,如pdf需要切成图⽚,ppt需要转换成视频或是图⽚,这样⼀来需求实现的⽅式就变成半⾃动了╥﹏╥... E>word⽤docx4j解析⼀个很⼤的问题是解析的效率太低了,5MB以上的⽂件或者内容⽐较复杂的word⽂档解析⼗分耗时,解析效率太低,再⼀就是poi解析数据量⽐较⼤的Exel(⽐如>1000⾏)容易造成内存溢出,不好控制 F>⼯时太短,只有15天。
几种解析Word文档的Java类库比较
几种解析 Word文档的 Java类库比较
推荐指数:
因为之前做过EXCEL的解析,所以我首选就是POI,然而经过调查之后发现POI解析Word文档就是个坑,非常难用不说,有些功能还不支 持。试验一番之后不得不放弃了。
推荐指数:
受云服务的启发,我想到未必非要在Java中解决问题,于是想到之前写过一个Node.js的项目,其中涉及到office文档的生成,可以利用 Node.js开发一个Restful的接口,将所有模板放在这个项目里,调用接口实现模板生成。Docxtemplater相对来讲是一个很好的Node.js office 中间件。
推荐指数:
发现POI不好用之后同事推荐给我了一种基于POI的模板类库,可以根据模板自动生成文档。语法简单,而且模板可以定制。因为这次的需 求比较特殊,所以有些地方不太满足项目的需要。如果你的项目是那种从头搭建的项目的话,建议使用这个类库。
推荐指数:
FreeMarker是一种Html模板引擎工具,因为word文档也是一种固定格式的XML文档,所以可以使用FreeMarker来设定模板,并根据模板生 成。缺点是所有doc模板都必须修改为符合标准的ftl模板文档,工程量较大。
推荐指数:
JACOB是一个Java-COM的中间件,通过这个组件你可以在Java应用程序中调用COM组件和Win32程序库。然而缺点也比较明显,就是只 能在Windows环境下使用,如果是那种需要部署到Linux环境的项目就不适用了。我没有写测试小程序,不知道具体使用起来会是怎么样。
xwpfdocument使用手册
[文章标题]深度解读:探秘xwpfdocument使用手册[介绍]在本文中,我们将全面解读xwpfdocument的使用手册,帮助你更好地理解和运用这一工具,让你的文档处理变得更加高效和便捷。
[1. 简介]xwpfdocument是Apache POI库中的一部分,它提供了在Java中处理Word文档的功能。
它支持创建、读取、修改和保存Word文档,为我们的文档处理工作提供了强大的支持。
[2. 使用指南]2.1 创建文档使用xwpfdocument,我们可以轻松地创建一个新的Word文档。
我们需要创建一个XWPFDocument对象,然后添加段落、表格、图片等元素到文档中。
我们还可以设置文档的标题、作者等属性。
2.2 读取文档通过xwpfdocument,我们可以读取已存在的Word文档。
我们可以获取文档中的段落、表格、图片等内容,并对其进行操作,比如修改文本、插入新内容等。
2.3 修改文档xwpfdocument也提供了丰富的方法来修改Word文档。
我们可以对文档中的段落、表格进行编辑,比如设置样式、插入新内容等。
这使得我们可以自由地对文档进行定制化处理。
2.4 保存文档通过xwpfdocument,我们可以将修改后的文档保存到本地文件系统中,或者直接输出到流中。
这为我们的文档处理提供了便捷的保存和共享方式。
[3. 总结与回顾]通过本文的介绍,我们全面了解了xwpfdocument的使用手册。
我们学会了如何创建、读取、修改和保存Word文档,以及如何充分利用这一工具来提升我们的文档处理效率。
[4. 个人观点与理解]个人觉得,xwpfdocument是一个非常强大且实用的工具,它为Java 开发者提供了处理Word文档的便捷方式。
通过学习和掌握xwpfdocument的使用手册,我们可以更加高效地进行文档处理,为我们的工作和学习带来更多便利和效益。
[结束语]希望本文对大家有所帮助,让大家对xwpfdocument的使用手册有了更深入的了解。
Java 加密、解密Word文档
Java加密、解密Word文档对一些重要文档,我们为保证其文档内容不被泄露,常需要对文件进行加密,查看文件时,需要正确输入密码才能打开文件。
下面介绍了一种比较简单的方法给Word文件添加密码保护以及如何给已加密的Word文件取消密码保护。
使用工具:Free Spire.Doc for Java 2.0.0(免费版)Jar文件导入:方法1:通过官网下载控件包。
在程序下新建一个directory目录,并命名(本示例中命名为lib);将控件包lib文件夹下的jar(如下图1)复制到程序中新建的目录下。
复制jar文件后,鼠标右键点击jar文件,选择”Add as Library”。
完成导入(如下图2)。
图1:图2:方法2:通过maven导入。
参考导入方法。
Java代码示例【示例1】设置Word密码保护import com.spire.doc.*;public class Encrypt {public static void main(String[] args){//加载测试文档String input = "test.docx";String output= "result.docx";Document doc = new Document(input);//调用方法加密文档doc.encrypt("123");//保存加密后的文档doc.saveToFile(output);}}文件加密结果:【示例2】取消Word密码保护import com.spire.doc.*;public class Decrypt {public static void main(String[] args){//加载带密码的文件,输入原密码并解除Document doc = new Document();doc.loadFromFile("result.docx",FileFormat.Docx_2013,"123");//将解密后的文档另存doc.saveToFile("Decrypt.docx",FileFormat.Docx_2013);}}运行程序后,生成的文件将不再有密码保护。
[原创]java向word模板中填充数据(总结)
[原创]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解析world 文件 修改内容
java解析world 文件修改内容Java解析World文件是一种常见的操作,可以通过读取并修改World文档中的内容。
World文件是一种二进制文件格式,通常用于Microsoft Office中的Word软件。
在Java中,我们可以使用一些库来实现这个功能,例如Apache POI。
首先,我们需要导入Apache POI的相关依赖。
可以在Maven项目的pom.xml 文件中添加以下代码:```xml<dependency><groupId>org.apache.poi</groupId><artifactId>poi</artifactId><version>4.1.2</version></dependency>```接下来,我们可以通过以下步骤来解析并修改World文件的内容:1. 创建一个`FileInputStream`对象,用于打开World文件:```javaFileInputStream file = new FileInputStream("path/to/your/world.doc");```2. 创建一个`XWPFDocument`对象,用于表示整个解析后的文档:```javaXWPFDocument document = new XWPFDocument(file);```3. 遍历文档中的段落,并修改需要修改的内容:```javafor (XWPFParagraph paragraph : document.getParagraphs()) {String text = paragraph.getText();// 进行内容修改,例如替换指定文本text = text.replace("需要修改的内容", "替换后的内容");// 将修改后的文本重新设置回段落中paragraph.setText(text);}```4. 保存修改后的文档到新的文件中:```javaFileOutputStream outputStream = newFileOutputStream("path/to/your/modified_world.doc");document.write(outputStream);outputStream.close();```通过以上步骤,我们可以实现Java解析并修改World文件的功能。
Java实现word文档在线预览,读取office(word,excel,ppt)文件
Java实现word⽂档在线预览,读取office(word,excel,ppt)⽂件想要实现word或者其他office⽂件的在线预览,⼤部分都是⽤的两种⽅式,⼀种是使⽤openoffice转换之后再通过其他插件预览,还有⼀种⽅式就是通过POI读取内容然后预览。
⼀、使⽤openoffice⽅式实现word预览主要思路是:1.通过第三⽅⼯具openoffice,将word、excel、ppt、txt等⽂件转换为pdf⽂件2.通过swfTools将pdf⽂件转换成swf格式的⽂件3.通过FlexPaper⽂档组件在页⾯上进⾏展⽰我使⽤的⼯具版本:openof:3.4.1swfTools:1007FlexPaper:这个关系不⼤,我随便下的⼀个。
推荐使⽤1.5.1JODConverter:需要jar包,如果是maven管理直接引⽤就可以操作步骤:1.office准备下载openoffice:从过往⽂件,其他语⾔中找到中⽂版3.4.1的版本下载后,解压缩,安装然后找到安装⽬录下的program ⽂件夹在⽬录下运⾏soffice -headless -accept="socket,host=127.0.0.1,port=8100;urp;" -nofirststartwizard如果运⾏失败,可能会有提⽰,那就加上 .\ 在运⾏试⼀下这样openoffice的服务就开启了。
2.将flexpaper⽂件中的js⽂件夹(包含了flexpaper_flash_debug.js,flexpaper_flash.js,jquery.js,这三个js⽂件主要是预览swf⽂件的插件)拷贝⾄⽹站根⽬录;将FlexPaperViewer.swf拷贝⾄⽹站根⽬录下(该⽂件主要是⽤在⽹页中播放swf⽂件的播放器)项⽬结构:页⾯代码:fileUpload.jsp<%@ page language="java" contentType="text/html; charset=UTF-8"pageEncoding="UTF-8"%><!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "/TR/html4/loose.dtd"><html><head><meta http-equiv="Content-Type" content="text/html; charset=UTF-8"><title>⽂档在线预览系统</title><style>body {margin-top:100px;background:#fff;font-family: Verdana, Tahoma;}a {color:#CE4614;}#msg-box {color: #CE4614; font-size:0.9em;text-align:center;}#msg-box .logo {border-bottom:5px solid #ECE5D9;margin-bottom:20px;padding-bottom:10px;}#msg-box .title {font-size:1.4em;font-weight:bold;margin:0 0 30px 0;}#msg-box .nav {margin-top:20px;}</style></head><body><div id="msg-box"><form name="form1" method="post" enctype="multipart/form-data" action="docUploadConvertAction.jsp"><div class="title">请上传要处理的⽂件,过程可能需要⼏分钟,请稍候⽚刻。
Java 添加、修改、回复、删除Word批注
Java 添加、回复、修改(替换)、删除、读取Word批注批注是一种常用于对特定文档内容进行注解的工具或方法,起到解释说明、标记指正的作用。
在本篇文章中,将介绍如何操作Word批注的方法,包括:1. 添加批注:添加文本到批注、插入图片到批注;1.1 给指定段落添加批注1.2 给指定字符串添加批注2. 回复批注;3. 修改或替换批注:用文本替换批注中的文本内容、用文本替换批注中的图片、用图片替换批注中的图片;4. 删除批注:删除指定批注中的所有内容、删除指定批注中的指定内容5. 读取批注5.1 读取批注中的文本5.2 读取批注中的图片使用工具:Free Spire.Doc for Java (免费版)Jar文件获取及导入:方法1:通过官网获取jar包,并解压。
解压后,将lib文件夹下的Spire.Doc.jar文件导入java程序。
方法2:通过添加maven依赖导入到maven项目,参考导入步骤。
Java示例代码【示例1】给段落添加批注(文本、图片)import com.spire.doc.*;import com.spire.doc.documents.Paragraph;import ment;public class AddComment {public static void main(String[] args) {//加载测试文档Document doc = new Document("test.docx");//获取指定段落Section sec = doc.getSections().get(0);Paragraph para= sec.getParagraphs().get(3);//插入文本到批注Comment comment = para.appendComment("请在试验中将包含以下特征的实验样本记录在册,并整理好周记录报表,供后续观察取样。
java读写word文档 完美解决方案
java读写word文档完美解决方案Java读写Word文档:完美解决方案Word文档是一种广泛使用的文件格式,用于创建和编辑文本文档。
在Java编程中,读写Word文档是一个常见的需求。
本文将介绍一种完美解决方案,帮助您在Java中实现对Word文档的读写操作。
一、引入依赖要在Java中读写Word文档,我们需要使用Apache POI库。
Apache POI是一个Java类库,可用于读取和编写Microsoft Office文件格式,包括Word文档。
在您的Java项目中,您需要将以下依赖项添加到您的构建文件中,以便使用Apache POI库:```java<dependency><groupId>org.apache.poi</groupId><artifactId>poi</artifactId><version>4.1.2</version></dependency><dependency><groupId>org.apache.poi</groupId><artifactId>poi-ooxml</artifactId><version>4.1.2</version></dependency>```二、读取Word文档要读取一个Word文档,您可以使用Apache POI提供的XWPFDocument类。
以下是一个简单的示例代码,演示如何使用XWPFDocument读取Word文档:```javaimport ermodel.XWPFDocument;import org.apache.poi.xwpf.extractor.XWPFWordExtractor;import java.io.FileInputStream;import java.io.IOException;public class ReadWordDocument {public static void main(String[] args) {try {FileInputStream fis = newFileInputStream("path/to/your/word/document.docx");XWPFDocument document = new XWPFDocument(fis);XWPFWordExtractor extractor = new XWPFWordExtractor(document);String content = extractor.getText();System.out.println(content);fis.close();} catch (IOException e) {e.printStackTrace();}}}```在上面的代码中,您需要将"path/to/your/word/document.docx"替换为您实际的Word文档路径。
java操作word(内部资料)
JAVA操作wordJava操作Microsoft Word之jacob(1)现在我们一起来看看,用J1ava如何操作Microsoft Word。
jacob,官网是/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 .Variant maps to .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.6MyEclipse Enterprise Workbench Version: 7.0 Milestone-1Tomcat 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的工具。
JAVA编程导入Word文件到数据区域,实现多个word文件合并[pageoffice]
JAVA编程导入Word文件到数据区域,实现多个word文件合并[pageoffice]在开发项目时,如何通过后台编程把多个Word文档合并到一起呢,这就需要借助PageOffice开发平台中的数据区域了。
具体实现步骤如下:第一步:拷贝文件到WEB项目的“WEB-INF/lib”目录下。
拷贝PageOffice 示例中下的“WEB-INF/lib”路径中的pageoffice.cab和pageoffice.jar到新建项目的“WEB-INF/lib”目录下。
第二步:修改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 -->第三步:添加引用。
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。
Java 添加、删除Word图片以及设置Word图片格式
Java 添加、删除、格式化Word中的图片本文介绍使用Spire.Cloud.SDK for Java提供的ImagesApi接口来操作Word中的图片。
具体可通过addImage()方法添加图片、deleteImage()方法删除图片、updateImageFormat()格式化Word中的图片以及getImageFormat()获取Word中的图片格式等。
操作方法和代码示例可参考下文中的步骤。
步骤1:导入jar文件创建Maven项目程序,通过maven仓库下载导入。
以IDEA为例,新建Maven项目,在pom.xml文件中配置maven仓库路径,并指定spire.cloud.sdk的依赖,如下:<repositories><repository><id>com.e-iceblue</id><name>cloud</name><url>/repository/maven-public/</url></repository></repositories><dependencies><dependency><groupId> cloud </groupId><artifactId>spire.cloud.sdk</artifactId><version>3.5.0</version></dependency><dependency><groupId> com.google.code.gson</groupId><artifactId>gson</artifactId><version>2.8.1</version></dependency><dependency><groupId> com.squareup.okhttp</groupId><artifactId>logging-interceptor</artifactId><version>2.7.5</version></dependency><dependency><groupId> com.squareup.okhttp </groupId><artifactId>okhttp</artifactId><version>2.7.5</version></dependency><dependency><groupId> com.squareup.okio </groupId><artifactId>okio</artifactId><version>1.6.0</version></dependency><dependency><groupId> io.gsonfire</groupId><artifactId>gson-fire</artifactId><version>1.8.0</version></dependency><dependency><groupId>io.swagger</groupId><artifactId>swagger-annotations</artifactId><version>1.5.18</version></dependency><dependency><groupId> org.threeten </groupId><artifactId>threetenbp</artifactId><version>1.3.5</version></dependency></dependencies>完成配置后,点击“Import Changes” 即可导入所有需要的jar文件。
java操作word可操作书签
最近有个需求,在word模板文档上设置书签,然后从数据库中查询数据,填充到word 文档书签位置,刚拿到需求时,使劲在网上找资料。
幻想第三方jar包,帮我实现。
有Apatch 的POI,java2word,jcob等,一直让我无法实现。
POI操作word只能获取word中的书签,并不能进行操作.java2word可以实现,但是除了java2word.jar包以外,还要一个dll文件放在system32文件夹下,环境部署在linux服务器上,谁允许你放这样的文件,结果死心了.下面新建一个word2007文件告诉大家不用第三方技术怎么一一实现。
现在新建一个word,在请输入用户名处添加书签userName,请输入年龄处添加书签ageWord2007版本其实就是zip格式,将新建word后缀名改.zip,解压会发现,里面全是文件夹,打开word文件夹会有一个document.xml文件,在word所有内容,都在这xml文件中, <w:bookmarkStart w:id="0" w:name="userName"/><w:r><w:rPr><w:rFonts w:hint="eastAsia"/></w:rPr><w:t>请输入用户名</w:t></w:r><w:bookmarkEnd w:id="0"/>这是新建书签处的内容,细心的会发现,书签处内容在<w:bookmarkStart/> <w:bookmarkEnd w:id="0"/>标签之间,<w:bookmarkStart>标签中的w:id跟w:name标识书签的唯一,中间是书签处的内容,会不会可以这样呢,找到用dom或者sax解析这个xml 文档找到<w:bookmarkStart/>标签,然后找到<w:r>标签,再找到<w:r>标签里面的<w:t>标签内容,替换就Ok了呢。
用Java读取Word文档
用Java读取Word文档由于Word的编码方式比较复杂,所以Word文档不可能通过流的方式直接读取;当然如果Word可以转化成TXT文件就可以直接读取了;目前读取Word比较好的开源工具是Poi及Jacob,感觉Poi读取功能要比Jacob略逊一筹,毕竟Jacob可以直接调用Word的COM组件;但是微软产品不开放源码,所以Jacob读取Word文档也只能是摸着石头过河,一点一点破解了。
Jacob读取Word内容,由于Word内容的复杂性,读取也是非常不方便的,目前可以有"按段落读取","按书签读取"及"按照表格读取"等几种形式。
示例讲解(通过Java FileReader,Jacob两种方式读取Word内容)一.通过java流读取Word内容复制代码1.import java.io.BufferedReader;2.import java.io.FileReader;3.import java.io.IOException;4.5.public class ReadWordByStream {6.public static void main(String[] args) throws IOException {7. String rowContent = new String();8. String content = new String();9. BufferedReader in = new BufferedReader(new FileReader("d:\\test3.doc"));10. while ((rowContent = in.readLine()) != null) {11.content = content + rowContent + "\n";12. }13. System.out.println(content.getBytes());14. System.out.println(new String(content.getBytes(),"utf-8"));//因为编码方式不同,不容易解析15. in.close();16.}17.18.}二.通过Jacob读取Word内容复制代码1.import com.jacob.activeX.ActiveXComponent;2.import Thread;3.import .Dispatch;4.import .Variant;5.6.public class WordReader {7.public static void main(String args[]) {8. ComThread.InitSTA();// 初始化com的线程9. ActiveXComponent wordApp = new ActiveXComponent("Word.Application"); // 启动word10. // Set the visible property as required.11. Dispatch.put(wordApp, "Visible", new Variant(true));// //设置word可见12. Dispatch docs = wordApp.getProperty("Documents").toDispatch();//所有文档窗口13.// String inFile = "d:\\test.doc";14.// Dispatch doc = Dispatch.invoke(docs,"Open",Dispatch.Method,15.// new Object[] { inFile, new Variant(false),new Variant(false) },//参数3,false:可写,true:只读16.// new int[1]).toDispatch();//打开文档17.18. Dispatch doc = Dispatch.call(docs, "Add").toDispatch(); //创建一个新文档19. Dispatch wordContent = Dispatch.get(doc, "Content").toDispatch(); //取得word文件的内容20. Dispatch font = Dispatch.get(wordContent, "Font").toDispatch();21. Dispatch.put(font, "Bold", new Variant(true)); // 设置为粗体22.Dispatch.put(font, "Italic", new Variant(true)); // 设置为斜体23.Dispatch.put(font, "Underline", new Variant(true));24.Dispatch.put(font, "Name", new Variant("宋体"));25.Dispatch.put(font, "Size", new Variant(14));26. for(int i=0;i<10;i++){//作为一个段落27.Dispatch.call(wordContent, "InsertAfter", "current paragraph"+i+" ");28. }29. for(int j=0;j<10;j++){//作为十个段落30. Dispatch.call(wordContent, "InsertAfter", "current paragraph"+j+"\r");31.}32. Dispatch paragraphs = Dispatch.get(wordContent, "Paragraphs")33. .toDispatch(); //所有段落34. int paragraphCount = Dispatch.get(paragraphs, "Count").getInt();35. System.out.println("paragraphCount:"+paragraphCount);36.37. for (int i = 1; i <= paragraphCount; i++) {38.Dispatch paragraph = Dispatch.call(paragraphs, "Item",39.new Variant(i)).toDispatch();40.Dispatch paragraphRange = Dispatch.get(paragraph, "Range")41..toDispatch();42.String paragraphContent = Dispatch.get(paragraphRange, "Text")43..toString();44.System.out.println(paragraphContent);45.//Dispatch.call(selection, "MoveDown");46. }47. // WordReader.class.getClass().getResource("/").getPath().substring+"test.doc";48. Dispatch.call(doc, "SaveAs","d:\\wordreader.doc");49. // Close the document without saving changes50. // 0 = wdDoNotSaveChanges51. // -1 = wdSaveChanges52. // -2 = wdPromptToSaveChanges53. ComThread.Release();//释放com线程54. Dispatch.call(docs, "Close", new Variant(0));55. docs = null;56. Dispatch.call(wordApp,"Quit");57. wordApp = null;58.}59.}用Java简单的读取word文档中的数据:第一步:下载tm-extractors-0.4.jar下载地址:/browser/elated-core/trunk/lib/tm-extractors-0.4.jar?rev =46并把它放到你的classpath路径下面。
Java将数据写入word文档(.doc)
Java将数据写⼊word⽂档(.doc)Java可⽤org.apache.poi包来操作word⽂档。
org.apache.poi包可于上下载,解压后各jar作⽤如下图所⽰:可根据需求导⼊对应的jar。
⼀、HWPFDocument类的使⽤⽤HWPFDocument类将数据写到指定的word⽂档中,基本思路是这样的:- ⾸先,建⽴⼀个HWPFDocument类的实例,关联到⼀个临时的word⽂档;- 然后,通过Range类实例,将数据写⼊这个word⽂档中;- 接着,将这个临时的word⽂档通过write函数写⼊指定的word⽂档中。
- 最后,关闭所有资源。
下⾯详细说明各个步骤。
1.构造函数这⾥要说明⼀下,经过试验,暂时还没找到直接在程序中新建⼀个word⽂档并读取的⽅法,只能先创建好temp.doc,然后在程序中读取。
(⽤File-createNewFile和POIFSFileSystem.create创建出来的.doc⽂件,都不能被正确读取)另外,其实选择哪种参数传⼊都是⼀样的,毕竟HWPFDocument关联的word⽂档是⽆法写⼊的,只是当作⼀个临时⽂件。
所以,选择最为熟悉的InputStream较为合适。
参数1:InputStream。
可将word⽂档⽤FileInputStream流读取,然后传⼊HWPFDocument类。
主要⽤于读取word⽂档中的数据。
参数2:POIFSFileSystem。
POIFSFileSystem的构造函数参数可以是(File,boolean)【这样的话file必须是已经存在的】,后者为false时可读写。
这⾥可以写为HWPFDocument doc = new HWPFDocument(new POIFSFileSystem(new File("temp.doc"),false));2.Range类(1)获取Range类实例。
HWPFDocument类中有⼀系列获取Range类实例以操作word⽂档的⽅法。
通过Java往word中写入内容
1、向wor d中写入内容首先在word中设置书签,如书签名为book mark,javas cript中可以这样写va rword;wor d=new Activ eXObj ect("Word.Appli catio n");varra nge=w ord.R ange;word.Visi ble=t rue;varpa th="f ilepa th";word.Docum ents.Open(path);ran ge=wo rd.Ac tiveD ocume nt.Bo okmar ks("b ookma rk").Range;ran ge.In sertB efore("哈哈哈哈哈哈");庸-人发表于2010-07-0612:48:38Zm j一起聊2、把wo rd文件转成html文件<scrip tlang uage=javas cript>fun ction savew ord(){var oWord App=n ewAct iveXO bject("Wor d.App licat ion");var oDocu ment=oWord App.D ocume nts.O pen("C:\\d oc2ht ml\\x.doc");oD ocume nt.Sa veAs("C:\\test.htm",8)oW ordAp p.Qui t();}</s cript></H EAD><BODY>Cli ckthe"save"butt ontos aveth efile"C:\t est.d oc"to"C:\t est.h tm":<inpu ttype=butt ononc lick="save word()"val ue=sa ve></BOD Y></HTML>庸-人发表于2010-07-06 12:53:09Zmj一起聊拷贝tabl e1内的内容到wor d<s cript langu age="javas cript">fu nctio nOpen Word(){//导出wordLaye r1.st yle.b order=0;E xcelS heet=newAc tiveX Objec t('Wo rd.Ap plica tion');Ex celSh eet.A pplic ation.Visi ble=t rue;varmy doc=E xcelS heet.Docum ents.Add('',0,0);my Range=mydo c.Ran ge(0,1);m yRang e=myd oc.Ra nge(m yRang e.End-1,my Range.End);//设定起始点v arsel=Laye r1.do cumen t.bod y.cre ateTe xtRan ge();sel.moveT oElem entTe xt(ta ble1);sel.sele ct();Laye r1.do cumen t.exe cComm and('Copy');se l.mov eEnd('char acter');m yRang e.Pas te();myR ange=mydoc.Rang e(myR ange.End-1,myRa nge.E nd);myRan ge.In sertA fter("\n");Exc elShe et.Ac tiveW indow.View.Tabl eGrid lines=fals e;}</scr ipt>庸-人发表于2010-07-06 12:57:43Zmj一起聊操作excel:<%@page c%><h1>co ntent</h1><htm l><h ead><scri ptlan guage="jav ascri pt"ty pe="t ext/j avasc ript">fun ction MakeE xcel(){va ri,j,n;tr y{va rxls=newAc tiveX Objec t("Ex cel.A pplic ation");}catc h(e){aler t("要打印该表,您必须安装E xcel电子表格软件,同时浏览器须使用“Activ eX控件”,您的浏览器须允许执行控件。
java解析word文件
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
import org.apache.poi.hwpf.extractor.WordExtractor;
public class MyWordExtractor {
public static void main(String[] args) {
File file = new File("E:\\POI\\word\\JBoss3.0 下配置和部署EJB简介.doc");
public class MyWordExtractor {
public static void main(String[] args) {
File file = new File("E:\\POI\\word\\JBoss3.0 下配置和部署EJB简介.doc");
try {
String[] paragraph = wordExtractor.getParagraphText();
System.out.println("该Word文件共有"+paragraph.length+"段。");
for(int i=0;i<paragraph.length;i++){
如果有多个Word文件,而且放在不同的目录下,要提取它们的文本内容,可以实现一个递归的函数,通过深度遍历,为每一个Word文件进行提取。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
JAVA操作wordjacob(1)现在我们一起来看看,用Java如何操Word。
jacob,官网是/jacob 这是一个开源的工具。
最新版本1.7 官方的解释是:The JACOB Project: A JAva-COM Bridge开发环境:JDK 1.6MyEclipse Enterprise Workbench Version: 7.0 Milestone-1Tomcat 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 {// 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 = newActiveXComponent("Word.Application");word.setProperty("Visible", newVariant(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;}/** *//*** 全局替换文本** @param toFindText 查找字符串* @param newText 要替换的内容*/public void replaceAllText(String toFindText, String newText) {while (find(toFindText)) {Dispatch.put(selection, "Text", newText);Dispatch.call(selection, "MoveRight");}}/** *//*** 在当前插入点插入字符串** @param newText 要插入的新字符串*/public void insertText(String newText) {Dispatch.put(selection, "Text", newText);}/** *//**** @param toFindText 要查找的字符串* @param imagePath 图片路径* @return*/public boolean replaceImage(String toFindText, String imagePath) {if (!find(toFindText))return false;Dispatch.call(Dispatch.get(selection, "InLineShapes").toDispatch(),"AddPicture", imagePath);return true;}/** *//*** 全局替换图片** @param toFindText 查找字符串* @param imagePath 图片路径*/public void replaceAllImage(String toFindText, String imagePath) {while (find(toFindText)) {Dispatch.call(Dispatch.get(selection, "InLineShapes").toDispatch(),"AddPicture", imagePath);Dispatch.call(selection, "MoveRight");}}/** *//*** 在当前插入点插入图片** @param imagePath 图片路径*/public void insertImage(String imagePath) {Dispatch.call(Dispatch.get(selection, "InLineShapes").toDispatch(),"AddPicture", imagePath);}/** *//*** 合并单元格** @param tableIndex* @param fstCellRowIdx* @param fstCellColIdx* @param secCellRowIdx* @param secCellColIdx*/public void mergeCell(int tableIndex, int fstCellRowIdx, int fstCellColIdx,int secCellRowIdx, int secCellColIdx) {// 所有表格Dispatch tables = Dispatch.get(doc,"Tables").toDispatch();// 要填充的表格Dispatch table = Dispatch.call(tables, "Item", new Variant(tableIndex)).toDispatch();Dispatch fstCell = Dispatch.call(table, "Cell",newVariant(fstCellRowIdx), new Variant(fstCellColIdx)).toDispatch();Dispatch secCell = Dispatch.call(table, "Cell",newVariant(secCellRowIdx), new Variant(secCellColIdx)).toDispatch();Dispatch.call(fstCell, "Merge", secCell);}/** *//*** 在指定的单元格里填写数据** @param tableIndex* @param cellRowIdx* @param cellColIdx* @param txt*/public void putTxtToCell(int tableIndex, int cellRowIdx, int cellColIdx,String txt) {// 所有表格Dispatch tables = Dispatch.get(doc,"Tables").toDispatch();// 要填充的表格Dispatch table = Dispatch.call(tables, "Item", new Variant(tableIndex)).toDispatch();Dispatch cell = Dispatch.call(table, "Cell", new Variant(cellRowIdx),newVariant(cellColIdx)).toDispatch();Dispatch.call(cell, "Select");Dispatch.put(selection, "Text", txt);}/** *//*** 在当前文档拷贝数据** @param pos*/public void copy(String toCopyText) {moveStart();if (this.find(toCopyText)) {Dispatch textRange =Dispatch.get(selection, "Range").toDispatch();Dispatch.call(textRange, "Copy");}}/** *//*** 在当前文档粘帖剪贴板数据** @param pos*/public void paste(String pos) {moveStart();if (this.find(pos)) {Dispatch textRange =Dispatch.get(selection, "Range").toDispatch();Dispatch.call(textRange, "Paste");}}/** *//*** 在当前文档指定的位置拷贝表格* @param pos 当前文档指定的位置* @param tableIndex 被拷贝的表格在word文档中所处的位置*/public void copyTable(String pos,int tableIndex) {Dispatch tables = Dispatch.get(doc,"Tables").toDispatch();Dispatch table = Dispatch.call(tables, "Item", new Variant(tableIndex)).toDispatch();Dispatch range = Dispatch.get(table,"Range").toDispatch();Dispatch.call(range, "Copy");if (this.find(pos)) {Dispatch textRange =Dispatch.get(selection, "Range").toDispatch();Dispatch.call(textRange, "Paste");}}/** *//*** 在当前文档末尾拷贝来自另一个文档中的段落** @param anotherDocPath 另一个文档的磁盘路径* @param tableIndex 被拷贝的段落在另一格文档中的序号(从1开始)*/public void copyParagraphFromAnotherDoc(String anotherDocPath,int paragraphIndex) {Dispatch wordContent = Dispatch.get(doc, "Content").toDispatch(); // 取得当前文档的内容Dispatch.call(wordContent, "InsertAfter", "$selection$");// 插入特殊符定位插入点copyParagraphFromAnotherDoc(anotherDocPath, paragraphIndex,"$selection$");}/** *//*** 在当前文档指定的位置拷贝来自另一个文档中的段落** @param anotherDocPath 另一个文档的磁盘路径* @param tableIndex 被拷贝的段落在另一格文档中的序号(从1开始)* @param pos 当前文档指定的位置*/public void copyParagraphFromAnotherDoc(String anotherDocPath,int paragraphIndex, String pos) {Dispatch doc2 = null;try {doc2 = Dispatch.call(documents, "Open", anotherDocPath).toDispatch();Dispatch paragraphs = Dispatch.get(doc2, "Paragraphs").toDispatch();Dispatch paragraph =Dispatch.call(paragraphs, "Item",newVariant(paragraphIndex)).toDispatch();Dispatch range = Dispatch.get(paragraph, "Range").toDispatch();Dispatch.call(range, "Copy");if (this.find(pos)) {Dispatch textRange = Dispatch.get(selection, "Range").toDispatch();Dispatch.call(textRange, "Paste");}} catch (Exception e) {e.printStackTrace();} finally {if (doc2 != null) {Dispatch.call(doc2, "Close", new Variant(saveOnExit));doc2 = null;}}}/** *//*** 在当前文档指定的位置拷贝来自另一个文档中的表格** @param anotherDocPath 另一个文档的磁盘路径* @param tableIndex 被拷贝的表格在另一格文档中的序号(从1开始)* @param pos 当前文档指定的位置*/public void copyTableFromAnotherDoc(String anotherDocPath, int tableIndex,String pos) {Dispatch doc2 = null;try {doc2 = Dispatch.call(documents, "Open", anotherDocPath).toDispatch();Dispatch tables = Dispatch.get(doc2, "Tables").toDispatch();Dispatch table = Dispatch.call(tables, "Item",newVariant(tableIndex)).toDispatch();Dispatch range = Dispatch.get(table, "Range").toDispatch();Dispatch.call(range, "Copy");if (this.find(pos)) {Dispatch textRange = Dispatch.get(selection, "Range").toDispatch();Dispatch.call(textRange, "Paste");}} catch (Exception e) {e.printStackTrace();} finally {if (doc2 != null) {Dispatch.call(doc2, "Close", new Variant(saveOnExit));doc2 = null;}}}/** *//*** 在当前文档指定的位置拷贝来自另一个文档中的图片** @param anotherDocPath 另一个文档的磁盘路径* @param shapeIndex 被拷贝的图片在另一格文档中的位置* @param pos 当前文档指定的位置*/public void copyImageFromAnotherDoc(String anotherDocPath, int shapeIndex,String pos) {Dispatch doc2 = null;try {doc2 = Dispatch.call(documents, "Open",anotherDocPath).toDispatch();Dispatch shapes = Dispatch.get(doc2, "InLineShapes").toDispatch();Dispatch shape = Dispatch.call(shapes, "Item",newVariant(shapeIndex)).toDispatch();Dispatch imageRange =Dispatch.get(shape, "Range").toDispatch();Dispatch.call(imageRange, "Copy");if (this.find(pos)) {Dispatch textRange = Dispatch.get(selection, "Range").toDispatch();Dispatch.call(textRange, "Paste");}} catch (Exception e) {e.printStackTrace();} finally {if (doc2 != null) {Dispatch.call(doc2, "Close", new Variant(saveOnExit));doc2 = null;}}}Java操作Microsoft Word之jacob(2)(接上)/** *//*** 创建表格** @param pos 位置* @param cols 列数* @param rows 行数*/public void createTable(int numCols, int numRows){//(String pos, int numCols, int numRows) {// if (!find(pos)) {Dispatch tables = Dispatch.get(doc, "Tables").toDispatch();Dispatch range = Dispatch.get(selection, "Range").toDispatch();Dispatch newTable = Dispatch.call(tables, "Add", range,new Variant(numRows), new Variant(numCols)).toDispatch();Dispatch.call(selection, "MoveRight");moveEnd();// }}/** *//*** 在指定行前面增加行** @param tableIndex word文件中的第N张表(从1开始)* @param rowIndex 指定行的序号(从1开始)*/public void addTableRow(int tableIndex, int rowIndex) {// 所有表格Dispatch tables = Dispatch.get(doc, "Tables").toDispatch();// 要填充的表格Dispatch table = Dispatch.call(tables, "Item", newVariant(tableIndex)).toDispatch();// 表格的所有行Dispatch rows = Dispatch.get(table, "Rows").toDispatch();Dispatch row = Dispatch.call(rows, "Item", newVariant(rowIndex)).toDispatch();Dispatch.call(rows, "Add", new Variant(row));}/** *//*** 在第1行前增加一行** @param tableIndex word文档中的第N张表(从1开始)*/public void addFirstTableRow(int tableIndex) {// 所有表格Dispatch tables = Dispatch.get(doc, "Tables").toDispatch();// 要填充的表格Dispatch table = Dispatch.call(tables, "Item", newVariant(tableIndex)).toDispatch();// 表格的所有行Dispatch rows = Dispatch.get(table, "Rows").toDispatch();Dispatch row = Dispatch.get(rows, "First").toDispatch();Dispatch.call(rows, "Add", new Variant(row));}/** *//*** 在最后1行前增加一行** @param tableIndex* word文档中的第N张表(从1开始)*/public void addLastTableRow(int tableIndex) {// 所有表格Dispatch tables = Dispatch.get(doc, "Tables").toDispatch();// 要填充的表格Dispatch table = Dispatch.call(tables, "Item", newVariant(tableIndex)).toDispatch();// 表格的所有行Dispatch rows = Dispatch.get(table, "Rows").toDispatch();Dispatch row = Dispatch.get(rows, "Last").toDispatch();Dispatch.call(rows, "Add", new Variant(row));}/** *//*** 增加一行** @param tableIndex word文档中的第N张表(从1开始)*/public void addRow(int tableIndex) {Dispatch tables = Dispatch.get(doc, "Tables").toDispatch();// 要填充的表格Dispatch table = Dispatch.call(tables, "Item", newVariant(tableIndex)).toDispatch();// 表格的所有行Dispatch rows = Dispatch.get(table, "Rows").toDispatch();Dispatch.call(rows, "Add");}/** *//*** 增加一列** @param tableIndex word文档中的第N张表(从1开始)*/public void addCol(int tableIndex) {// 所有表格Dispatch tables = Dispatch.get(doc, "Tables").toDispatch();// 要填充的表格Dispatch table = Dispatch.call(tables, "Item", newVariant(tableIndex)).toDispatch();// 表格的所有行Dispatch cols = Dispatch.get(table,"Columns").toDispatch();Dispatch.call(cols, "Add").toDispatch();Dispatch.call(cols, "AutoFit");}/** *//*** 在指定列前面增加表格的列** @param tableIndex word文档中的第N张表(从1开始)* @param colIndex 指定列的序号 (从1开始)*/public void addTableCol(int tableIndex, int colIndex) {// 所有表格Dispatch tables = Dispatch.get(doc, "Tables").toDispatch();// 要填充的表格Dispatch table = Dispatch.call(tables, "Item", newVariant(tableIndex)).toDispatch();// 表格的所有行Dispatch cols = Dispatch.get(table,"Columns").toDispatch();System.out.println(Dispatch.get(cols, "Count"));Dispatch col = Dispatch.call(cols, "Item", newVariant(colIndex)).toDispatch();// Dispatch col = Dispatch.get(cols, "First").toDispatch();Dispatch.call(cols, "Add", col).toDispatch();Dispatch.call(cols, "AutoFit");}/** *//*** 在第1列前增加一列** @param tableIndex word文档中的第N张表(从1开始)*/public void addFirstTableCol(int tableIndex) {Dispatch tables = Dispatch.get(doc, "Tables").toDispatch();// 要填充的表格Dispatch table = Dispatch.call(tables, "Item", newVariant(tableIndex)).toDispatch();// 表格的所有行Dispatch cols = Dispatch.get(table,"Columns").toDispatch();Dispatch col = Dispatch.get(cols, "First").toDispatch();Dispatch.call(cols, "Add", col).toDispatch();Dispatch.call(cols, "AutoFit");}/** *//*** 在最后一列前增加一列** @param tableIndex word文档中的第N张表(从1开始)*/public void addLastTableCol(int tableIndex) {Dispatch tables = Dispatch.get(doc, "Tables").toDispatch();// 要填充的表格Dispatch table = Dispatch.call(tables, "Item", newVariant(tableIndex)).toDispatch();// 表格的所有行Dispatch cols = Dispatch.get(table,"Columns").toDispatch();Dispatch col = Dispatch.get(cols, "Last").toDispatch();Dispatch.call(cols, "Add", col).toDispatch();Dispatch.call(cols, "AutoFit");}/** *//*** 自动调整表格**/public void autoFitTable() {Dispatch tables = Dispatch.get(doc, "Tables").toDispatch();int count = Dispatch.get(tables, "Count").toInt();for (int i = 0; i < count; i++) {Dispatch table = Dispatch.call(tables, "Item", new Variant(i + 1)).toDispat ch();Dispatch cols = Dispatch.get(table, "Columns").toDispatch();Dispatch.call(cols, "AutoFit");}}/** *//*** 调用word里的宏以调整表格的宽度,其中宏保存在document下**/public void callWordMacro() {Dispatch tables = Dispatch.get(doc, "Tables").toDispatch();int count = Dispatch.get(tables, "Count").toInt();Variant vMacroName = newVariant("Normal.NewMacros.tableFit");Variant vParam = new Variant("param1");Variant para[] = new Variant[] { vMacroName };for (int i = 0; i < para.length; i++) {Dispatch table = Dispatch.call(tables, "Item", new Variant(i + 1)).toDispat ch();Dispatch.call(table, "Select");Dispatch.call(word, "Run", "tableFitContent");}}/** *//*** 设置当前选定内容的字体** @param boldSize* @param italicSize* @param underLineSize 下划线* @param colorSize 字体颜色* @param size 字体大小* @param name 字体名称*/public void setFont(boolean bold, boolean italic, boolean underLine,String colorSize, String size, String name) {Dispatch font = Dispatch.get(selection,"Font").toDispatch();Dispatch.put(font, "Name", new Variant(name));Dispatch.put(font, "Bold", new Variant(bold));Dispatch.put(font, "Italic", new Variant(italic));Dispatch.put(font, "Underline", new Variant(underLine));Dispatch.put(font, "Color", colorSize);Dispatch.put(font, "Size", size);}/** *//*** 文件保存或另存为** @param savePath 保存或另存为路径*/public void save(String savePath) {Dispatch.call((Dispatch)Dispatch.call(word, "WordBasic").getDispatch(),"FileSaveAs", savePath);}/** *//*** 关闭当前word文档**/public void closeDocument() {if (doc != null) {Dispatch.call(doc, "Save");Dispatch.call(doc, "Close", newVariant(saveOnExit));doc = null;}}/** *//*** 关闭全部应用**/public void close() {closeDocument();if (word != null) {Dispatch.call(word, "Quit");word = null;}selection = null;documents = null;}/** *//*** 打印当前word文档**/public void printFile() {if (doc != null) {Dispatch.call(doc, "PrintOut");}}public static void main(String args[])throws Exception {MSWordManager msWordManager = new MSWordManager(true);msWordManager.createNewDocument();msWordManager.insertText("aaaaaaaaaaaaaaaaaaaaa");msWordManager.moveEnd();msWordManager.close();}}。