ava使用jacob操作word文档
java调用com组件操作word使用总结(jacob)
简单描述
在此处输入简单摘要
特别声明:使用java-com技术可以完成任何VBA可以完成的office文档操作;
一、准备工作
先了解一下概念,JACOB 就是 JAVA-COM Bridge的缩写,提供自动化的访问com的功能,也是通过JNI功能访问windows平台下的com组件或者win32系统库的。这是一个开始于1999年的开源项目的成果,有很多使用者对该项目进行了修改,做出了自己的贡献。
Jacob下载地址:
http://sourceforge.net/project/showfiles.php?group_id=109543&package_id=118368
我在这里下载了Jacob1.14.3和jacob1.9的版本两个版本
这里下载的是目前最新的Jacob1.14.3的Release版。
另外java操作word方式还有(个人认为通过jacob最好,自己可以扩展,网上除poi之外几乎全是java-com技术实现的):
(1):Apache POI - Java API To Access Microsoft Format Files(http://poi.apache.org/);对word处理不够强处理Excel功能可以,但是全是通过java完成的,不需 要com组件支持;
(2):java2word 是一个在java程序中调用 MS Office Word 文档的组件(类库)。该组件提供了一组简单的接口,以便java程序调用他的服务操作Word 文档。(好象也是用的java-com技术);
(3)web开发语言操作word的功能最好还是用第三方的控件, 看看这个SOAOFFICE,还可以使用js 写VBA呢http://www.kehansoft.com/soaoffice/doclist.asp
二、安装Jacob
Jacob的安装非常的简单,我们解开下载的jacob_1.9.zip,在文件夹中找到jacob.dll和jacob.jar两个文件,如果是Jacob1.14.3则是jacob-1.14.3-x86.dll(32位,机和jacob-1.14.3-x64.dll(64位)和jacob.jar两个文件。Jacob.dll直接放到系统的system32文件夹下就行了,连注册都不用的(或者拷贝到jdk或者jre的bin目录下也行,当前测试文件所在的目录也行,就是只要在java.library.path中就可以)。而jacob.jar设置到classpath中去就可以了,或者在IDE开发环境的工程中设置扩展库也一样的,我是这样使用的将jacob-1.14.3-x86.dll或复制到%Tomcat5%\bin目录下将jacob.jar复制到%Tomcot5%\Share\lib目录下,我使用过程中感觉放到这里是一个最终解决办法,当你放哪都有问题的时候。我这样用之后再没有出过因为系统不一样出现的各种各样的问题,当然你作的是web的项目。
注意使用jacob一写要安装word,我装的word2003,如果是操作word2007就不用jacob了(好像这方面的API)。
对jacob.dll几种配置方法 (网上看到):
2008-07-31 11:59:49
1、把jacob.dll文件,复制到 windows\system32 目录下。(注:我用的时候这个方法不能运行)
2、 把jacob.dll放入 Java\jdk1.5.0_06\jre\bin目录下.把jacob.jar放入 Java\jdk1.5.0_0\jre\lib\ext
目录下.可以正常运行。
3、把jacob.dll放入 \glc\src目录下.把jacob.jar放入WEB-INF\lib目录下,也是可以正常运行。
三、使用(以下是我改写的一个word操作类,希望有兴趣的朋友完善,记得发给我一份)
0001 | //注意java操作word关键是定位操作对象; |
0003 | import com.jacob.activeX.ActiveXComponent; |
0005 | import com.jacob.com.Dispatch; |
0007 | import com.jacob.com.Variant; |
0017 | public class WordBean { |
0021 | private Dispatch doc; |
0025 | private ActiveXComponent word; |
0029 | private Dispatch documents; |
0033 | private Dispatch selection; |
0035 | private boolean saveOnExit = true ; |
0037 | public WordBean() throws Exception{ |
0041 | word = new ActiveXComponent( "Word.Application" ); |
0043 | word.setProperty( "Visible" , new Variant( false )); //不可见打开word |
0045 | word.setProperty( "AutomationSecurity" , new Variant( 3 )); //禁用宏 |
0049 | if (documents == null ) |
0051 | documents = word.getProperty( "Documents" ).toDispatch(); |
0063 | * boolean true-退出时保存文件,false-退出时不保存文件 |
0067 | public void setSaveOnExit( boolean saveOnExit) { |
0069 | this .saveOnExit = saveOnExit; |
0081 | public void createNewDocument() { |
0083 | doc = Dispatch.call(documents, "Add" ).toDispatch(); |
0085 | selection = Dispatch.get(word, "Selection" ).toDispatch(); |
0099 | public void openDocument(String docPath) { |
0103 | doc = Dispatch.call(documents, "Open" , docPath).toDispatch(); |
0105 | selection = Dispatch.get(word, "Selection" ).toDispatch(); |
0113 | * @param docPath-文件全名 |
0119 | public void openDocumentOnlyRead(String docPath, String pwd) throws Exception { |
0123 | // doc = Dispatch.invoke(documents, "Open", Dispatch.Method, |
0125 | // new Object[]{docPath, new Variant(false), new Variant(true), new Variant(true), pwd}, |
0127 | // new int[1]).toDispatch();//打开word文件 |
0129 | doc = Dispatch.callN(documents, "Open" , new Object[]{docPath, new Variant( false ), |
0131 | new Variant( true ), new Variant( true ), pwd, "" , new Variant( false )}).toDispatch(); |
0133 | selection = Dispatch.get(word, "Selection" ).toDispatch(); |
0137 | public void openDocument(String docPath, String pwd) throws Exception { |
0141 | doc = Dispatch.callN(documents, "Open" , new Object[]{docPath, new Variant( false ), |
0143 | new Variant( false ), new Variant( true ), pwd}).toDispatch(); |
0145 | selection = Dispatch.get(word, "Selection" ).toDispatch(); |
0161 | public void moveUp( int pos) { |
0163 | if (selection == null ) |
0165 | selection = Dispatch.get(word, "Selection" ).toDispatch(); |
0167 | for ( int i = 0 ; i < pos; i++) |
0169 | Dispatch.call(selection, "MoveUp" ); |
0185 | public void moveDown( int pos) { |
0187 | if (selection == null ) |
0189 | selection = Dispatch.get(word, "Selection" ).toDispatch(); |
0191 | for ( int i = 0 ; i < pos; i++) |
0193 | Dispatch.call(selection, "MoveDown" ); |
0209 | public void moveLeft( int pos) { |
0211 | if (selection == null ) |
0213 | selection = Dispatch.get(word, "Selection" ).toDispatch(); |
0215 | for ( int i = 0 ; i < pos; i++) { |
0217 | Dispatch.call(selection, "MoveLeft" ); |
0235 | public void moveRight( int pos) { |
0237 | if (selection == null ) |
0239 | selection = Dispatch.get(word, "Selection" ).toDispatch(); |
0241 | for ( int i = 0 ; i < pos; i++) |
0243 | Dispatch.call(selection, "MoveRight" ); |
0255 | public void moveStart() { |
0257 | if (selection == null ) |
0259 | selection = Dispatch.get(word, "Selection" ).toDispatch(); |
0261 | Dispatch.call(selection, "HomeKey" , new Variant( 6 )); |
0275 | * @return boolean true-查找到并选中该文本,false-未查找到文本 |
0279 | @SuppressWarnings ( "static-access" ) |
0281 | public boolean find(String toFindText) { |
0283 | if (toFindText == null || toFindText.equals( "" )) |
0287 | // 从selection所在位置开始查询 |
0289 | Dispatch find = word.call(selection, "Find" ).toDispatch(); |
0293 | Dispatch.put(find, "Text" , toFindText); |
0297 | Dispatch.put(find, "Forward" , "True" ); |
0301 | Dispatch.put(find, "Format" , "True" ); |
0305 | Dispatch.put(find, "MatchCase" , "True" ); |
0309 | Dispatch.put(find, "MatchWholeWord" , "True" ); |
0313 | return Dispatch.call(find, "Execute" ).getBoolean(); |
0335 | public boolean replaceText(String toFindText, String newText) { |
0337 | if (!find(toFindText)) |
0341 | Dispatch.put(selection, "Text" , newText); |
0363 | public void replaceAllText(String toFindText, String newText) { |
0365 | while (find(toFindText)) { |
0367 | Dispatch.put(selection, "Text" , newText); |
0369 | Dispatch.call(selection, "MoveRight" ); |
0387 | public void insertText(String newText) { |
0389 | Dispatch.put(selection, "Text" , newText); |
0409 | public boolean replaceImage(String toFindText, String imagePath) { |
0411 | if (!find(toFindText)) |
0415 | Dispatch.call(Dispatch.get(selection, "InLineShapes" ).toDispatch(), |
0417 | "AddPicture" , imagePath); |
0439 | public void replaceAllImage(String toFindText, String imagePath) { |
0441 | while (find(toFindText)) { |
0443 | Dispatch.call(Dispatch.get(selection, "InLineShapes" ).toDispatch(), |
0445 | "AddPicture" , imagePath); |
0447 | Dispatch.call(selection, "MoveRight" ); |
0465 | public void insertImage(String imagePath) { |
0467 | Dispatch.call(Dispatch.get(selection, "InLineShapes" ).toDispatch(), |
0469 | "AddPicture" , imagePath); |
0481 | * @param fstCellRowIdx |
0483 | * @param fstCellColIdx |
0485 | * @param secCellRowIdx |
0487 | * @param secCellColIdx |
0491 | public void mergeCell( int tableIndex, int fstCellRowIdx, int fstCellColIdx, |
0493 | int secCellRowIdx, int secCellColIdx) { |
0497 | Dispatch tables = Dispatch.get(doc, "Tables" ).toDispatch(); |
0501 | Dispatch table = Dispatch.call(tables, "Item" , new Variant(tableIndex)) |
0505 | Dispatch fstCell = Dispatch.call(table, "Cell" , |
0507 | new Variant(fstCellRowIdx), new Variant(fstCellColIdx)) |
0511 | Dispatch secCell = Dispatch.call(table, "Cell" , |
0513 | new Variant(secCellRowIdx), new Variant(secCellColIdx)) |
0517 | Dispatch.call(fstCell, "Merge" , secCell); |
0537 | public void putTxtToCell( int tableIndex, int cellRowIdx, int cellColIdx, |
0543 | Dispatch tables = Dispatch.get(doc, "Tables" ).toDispatch(); |
0547 | Dispatch table = Dispatch.call(tables, "Item" , new Variant(tableIndex)) |
0551 | Dispatch cell = Dispatch.call(table, "Cell" , new Variant(cellRowIdx), |
0553 | new Variant(cellColIdx)).toDispatch(); |
0555 | Dispatch.call(cell, "Select" ); |
0557 | Dispatch.put(selection, "Text" , txt); |
0577 | public String getTxtFromCell( int tableIndex, int cellRowIdx, int cellColIdx) { |
0581 | Dispatch tables = Dispatch.get(doc, "Tables" ).toDispatch(); |
0585 | Dispatch table = Dispatch.call(tables, "Item" , new Variant(tableIndex)) |
0589 | Dispatch cell = Dispatch.call(table, "Cell" , new Variant(cellRowIdx), |
0591 | new Variant(cellColIdx)).toDispatch(); |
0593 | Dispatch.call(cell, "Select" ); |
0597 | ret = Dispatch.get(selection, "Text" ).toString(); |
0599 | ret = ret.substring( 0 , ret.length()- 1 ); //去掉最后的回车符; |
0613 | public void pasteExcelSheet(String pos) { |
0617 | if ( this .find(pos)) { |
0619 | Dispatch textRange = Dispatch.get(selection, "Range" ).toDispatch(); |
0621 | Dispatch.call(textRange, "Paste" ); |
0639 | * 被拷贝的表格在word文档中所处的位置 |
0643 | public void copyTable(String pos, int tableIndex) { |
0647 | Dispatch tables = Dispatch.get(doc, "Tables" ).toDispatch(); |
0651 | Dispatch table = Dispatch.call(tables, "Item" , new Variant(tableIndex)) |
0655 | Dispatch range = Dispatch.get(table, "Range" ).toDispatch(); |
0657 | Dispatch.call(range, "Copy" ); |
0659 | if ( this .find(pos)) { |
0661 | Dispatch textRange = Dispatch.get(selection, "Range" ).toDispatch(); |
0663 | Dispatch.call(textRange, "Paste" ); |
0671 | * 在当前文档指定的位置拷贝来自另一个文档中的表格 |
0675 | * @param anotherDocPath |
0689 | public void copyTableFromAnotherDoc(String anotherDocPath, int tableIndex, |
0693 | Dispatch doc2 = null ; |
0697 | doc2 = Dispatch.call(documents, "Open" , anotherDocPath) |
0703 | Dispatch tables = Dispatch.get(doc2, "Tables" ).toDispatch(); |
0707 | Dispatch table = Dispatch.call(tables, "Item" , |
0709 | new Variant(tableIndex)).toDispatch(); |
0711 | Dispatch range = Dispatch.get(table, "Range" ).toDispatch(); |
0713 | Dispatch.call(range, "Copy" ); |
0715 | if ( this .find(pos)) { |
0717 | Dispatch textRange = Dispatch.get(selection, "Range" ) |
0721 | Dispatch.call(textRange, "Paste" ); |
0725 | } catch (Exception e) { |
0733 | Dispatch.call(doc2, "Close" , new Variant(saveOnExit)); |
0745 | * 在当前文档指定的位置拷贝来自另一个文档中的图片 |
0749 | * @param anotherDocPath 另一个文档的磁盘路径 |
0751 | * @param shapeIndex 被拷贝的图片在另一格文档中的位置 |
0753 | * @param pos 当前文档指定的位置 |
0757 | public void copyImageFromAnotherDoc(String anotherDocPath, int shapeIndex, |
0761 | Dispatch doc2 = null ; |
0765 | doc2 = Dispatch.call(documents, "Open" , anotherDocPath) |
0769 | Dispatch shapes = Dispatch.get(doc2, "InLineShapes" ).toDispatch(); |
0771 | Dispatch shape = Dispatch.call(shapes, "Item" , |
0773 | new Variant(shapeIndex)).toDispatch(); |
0775 | Dispatch imageRange = Dispatch.get(shape, "Range" ).toDispatch(); |
0777 | Dispatch.call(imageRange, "Copy" ); |
0779 | if ( this .find(pos)) { |
0781 | Dispatch textRange = Dispatch.get(selection, "Range" ) |
0785 | Dispatch.call(textRange, "Paste" ); |
0789 | } catch (Exception e) { |
0797 | Dispatch.call(doc2, "Close" , new Variant(saveOnExit)); |
0827 | public void createTable(String pos, int numCols, int numRows) { |
0831 | Dispatch tables = Dispatch.get(doc, "Tables" ).toDispatch(); |
0833 | Dispatch range = Dispatch.get(selection, "Range" ).toDispatch(); |
0835 | @SuppressWarnings ( "unused" ) |
0837 | Dispatch newTable = Dispatch.call(tables, "Add" , range, |
0839 | new Variant(numRows), new Variant(numCols)).toDispatch(); |
0841 | Dispatch.call(selection, "MoveRight" ); |
0845 | Dispatch tables = Dispatch.get(doc, "Tables" ).toDispatch(); |
0847 | Dispatch range = Dispatch.get(selection, "Range" ).toDispatch(); |
0849 | @SuppressWarnings ( "unused" ) |
0851 | Dispatch newTable = Dispatch.call(tables, "Add" , range, |
0853 | new Variant(numRows), new Variant(numCols)).toDispatch(); |
0855 | Dispatch.call(selection, "MoveRight" ); |
0877 | public void addTableRow( int tableIndex, int rowIndex) { |
0881 | Dispatch tables = Dispatch.get(doc, "Tables" ).toDispatch(); |
0885 | Dispatch table = Dispatch.call(tables, "Item" , new Variant(tableIndex)) |
0891 | Dispatch rows = Dispatch.get(table, "Rows" ).toDispatch(); |
0893 | Dispatch row = Dispatch.call(rows, "Item" , new Variant(rowIndex)) |
0897 | Dispatch.call(rows, "Add" , new Variant(row)); |
0913 | public void addFirstTableRow( int tableIndex) { |
0917 | Dispatch tables = Dispatch.get(doc, "Tables" ).toDispatch(); |
0921 | Dispatch table = Dispatch.call(tables, "Item" , new Variant(tableIndex)) |
0927 | Dispatch rows = Dispatch.get(table, "Rows" ).toDispatch(); |
0929 | Dispatch row = Dispatch.get(rows, "First" ).toDispatch(); |
0931 | Dispatch.call(rows, "Add" , new Variant(row)); |
0947 | public void addLastTableRow( int tableIndex) { |
0951 | Dispatch tables = Dispatch.get(doc, "Tables" ).toDispatch(); |
0955 | Dispatch table = Dispatch.call(tables, "Item" , new Variant(tableIndex)) |
0961 | Dispatch rows = Dispatch.get(table, "Rows" ).toDispatch(); |
0963 | Dispatch row = Dispatch.get(rows, "Last" ).toDispatch(); |
0965 | Dispatch.call(rows, "Add" , new Variant(row)); |
0981 | public void addRow( int tableIndex) { |
0983 | Dispatch tables = Dispatch.get(doc, "Tables" ).toDispatch(); |
0987 | Dispatch table = Dispatch.call(tables, "Item" , new Variant(tableIndex)) |
0993 | Dispatch rows = Dispatch.get(table, "Rows" ).toDispatch(); |
0995 | Dispatch.call(rows, "Add" ); |
1011 | public void addCol( int tableIndex) { |
1015 | Dispatch tables = Dispatch.get(doc, "Tables" ).toDispatch(); |
1019 | Dispatch table = Dispatch.call(tables, "Item" , new Variant(tableIndex)) |
1025 | Dispatch cols = Dispatch.get(table, "Columns" ).toDispatch(); |
1027 | Dispatch.call(cols, "Add" ).toDispatch(); |
1029 | Dispatch.call(cols, "AutoFit" ); |
1049 | public void addTableCol( int tableIndex, int colIndex) { |
1053 | Dispatch tables = Dispatch.get(doc, "Tables" ).toDispatch(); |
1057 | Dispatch table = Dispatch.call(tables, "Item" , new Variant(tableIndex)) |
1063 | Dispatch cols = Dispatch.get(table, "Columns" ).toDispatch(); |
1065 | System.out.println(Dispatch.get(cols, "Count" )); |
1067 | Dispatch col = Dispatch.call(cols, "Item" , new Variant(colIndex)) |
1071 | // Dispatch col = Dispatch.get(cols, "First").toDispatch(); |
1073 | Dispatch.call(cols, "Add" , col).toDispatch(); |
1075 | Dispatch.call(cols, "AutoFit" ); |
1091 | public void addFirstTableCol( int tableIndex) { |
1093 | Dispatch tables = Dispatch.get(doc, "Tables" ).toDispatch(); |
1097 | Dispatch table = Dispatch.call(tables, "Item" , new Variant(tableIndex)) |
1103 | Dispatch cols = Dispatch.get(table, "Columns" ).toDispatch(); |
1105 | Dispatch col = Dispatch.get(cols, "First" ).toDispatch(); |
1107 | Dispatch.call(cols, "Add" , col).toDispatch(); |
1109 | Dispatch.call(cols, "AutoFit" ); |
1125 | public void addLastTableCol( int tableIndex) { |
1127 | Dispatch tables = Dispatch.get(doc, "Tables" ).toDispatch(); |
1131 | Dispatch table = Dispatch.call(tables, "Item" , new Variant(tableIndex)) |
1137 | Dispatch cols = Dispatch.get(table, "Columns" ).toDispatch(); |
1139 | Dispatch col = Dispatch.get(cols, "Last" ).toDispatch(); |
1141 | Dispatch.call(cols, "Add" , col).toDispatch(); |
1143 | Dispatch.call(cols, "AutoFit" ); |
1155 | @SuppressWarnings ( "deprecation" ) |
1157 | public void autoFitTable() { |
1159 | Dispatch tables = Dispatch.get(doc, "Tables" ).toDispatch(); |
1161 | int count = Dispatch.get(tables, "Count" ).toInt(); |
1163 | for ( int i = 0 ; i < count; i++) { |
1165 | Dispatch table = Dispatch.call(tables, "Item" , new Variant(i + 1 )) |
1169 | Dispatch cols = Dispatch.get(table, "Columns" ).toDispatch(); |
1171 | Dispatch.call(cols, "AutoFit" ); |
1179 | * 调用word里的宏以调整表格的宽度,其中宏保存在document下 |
1185 | @SuppressWarnings ( "deprecation" ) |
1187 | public void callWordMacro() { |
1189 | Dispatch tables = Dispatch.get(doc, "Tables" ).toDispatch(); |
1191 | int count = Dispatch.get(tables, "Count" ).toInt(); |
1193 | Variant vMacroName = new Variant( "Normal.NewMacros.tableFit" ); |
1195 | @SuppressWarnings ( "unused" ) |
1197 | Variant vParam = new Variant( "param1" ); |
1199 | @SuppressWarnings ( "unused" ) |
1201 | Variant para[] = new Variant[] { vMacroName }; |
1203 | for ( int i = 0 ; i < count; i++) { |
1205 | Dispatch table = Dispatch.call(tables, "Item" , new Variant(i + 1 )) |
1209 | Dispatch.call(table, "Select" ); |
1211 | Dispatch.call(word, "Run" , "tableFitContent" ); |
1227 | * @param underLineSize |
1245 | public void setFont( boolean bold, boolean italic, boolean underLine, |
1247 | String colorSize, String size, String name) { |
1249 | Dispatch font = Dispatch.get(selection, "Font" ).toDispatch(); |
1251 | Dispatch.put(font, "Name" , new Variant(name)); |
1253 | Dispatch.put(font, "Bold" , new Variant(bold)); |
1255 | Dispatch.put(font, "Italic" , new Variant(italic)); |
1257 | Dispatch.put(font, "Underline" , new Variant(underLine)); |
1259 | Dispatch.put(font, "Color" , colorSize); |
1261 | Dispatch.put(font, "Size" , size); |
1279 | public void setTableCellSelected( int tableIndex, int cellRowIdx, int cellColIdx){ |
1281 | Dispatch tables = Dispatch.get(doc, "Tables" ).toDispatch(); |
1283 | Dispatch table = Dispatch.call(tables, "Item" , new Variant(tableIndex)) |
1287 | Dispatch cell = Dispatch.call(table, "Cell" , new Variant(cellRowIdx), |
1289 | new Variant(cellColIdx)).toDispatch(); |
1291 | Dispatch.call(cell, "Select" ); |
1297 | * 设置选定单元格的垂直对起方式, 请使用setTableCellSelected选中一个单元格 |
1299 | * @param align 0-顶端, 1-居中, 3-底端 |
1303 | public void setCellVerticalAlign( int verticalAlign){ |
1305 | Dispatch cells = Dispatch.get(selection, "Cells" ).toDispatch(); |
1307 | Dispatch.put(cells, "VerticalAlignment" , new Variant(verticalAlign)); |
1313 | * 设置当前文档中所有表格水平居中方式及其它一些格式,用在将word文件转化为html中,针对申报表 |
1317 | @SuppressWarnings ( "deprecation" ) |
1319 | public void setApplyTableFormat(){ |
1321 | Dispatch tables = Dispatch.get(doc, "Tables" ).toDispatch(); |
1323 | int tabCount = Integer.valueOf(Dispatch.get(tables, "Count" ).toString()); //System.out.println(tabCount); |
1325 | System.out.println( "*******************************************************" ); |
1327 | for ( int i= 1 ; i<=tabCount; i++){ |
1329 | Dispatch table = Dispatch.call(tables, "Item" , new Variant(i)).toDispatch(); |
1331 | Dispatch rows = Dispatch.get(table, "Rows" ).toDispatch(); |
1335 | Dispatch.put(rows, "Alignment" , new Variant( 2 )); //1-居中,2-Right |
1341 | Dispatch.put(rows, "Alignment" , new Variant( 1 )); //1-居中 |
1343 | Dispatch.call(table, "AutoFitBehavior" , new Variant( 1 )); //设置自动调整表格方式,1-根据窗口自动调整 |
1345 | Dispatch.put(table, "PreferredWidthType" , new Variant( 1 )); |
1347 | Dispatch.put(table, "PreferredWidth" , new Variant( 700 )); |
1349 | System.out.println(Dispatch.get(rows, "HeightRule" ).toString()); |
1351 | Dispatch.put(rows, "HeightRule" , new Variant( 1 )); //0-自动wdRowHeightAuto,1-最小值wdRowHeightAtLeast, 2-固定wdRowHeightExactly |
1353 | Dispatch.put(rows, "Height" , new Variant( 0.04 * 28.35 )); |
1355 | //int oldAlign = Integer.valueOf(Dispatch.get(rows, "Alignment").toString()); |
1357 | //System.out.println("Algin:" + oldAlign); |
1371 | * 0-左对齐, 1-右对齐, 2-右对齐, 3-两端对齐, 4-分散对齐 |
1373 | * @param lineSpaceingRule |
1375 | * @param lineUnitBefore |
1377 | * @param lineUnitAfter |
1379 | * @param characterUnitFirstLineIndent |
1383 | public void setParagraphsProperties( int alignment, int lineSpaceingRule, |
1385 | int lineUnitBefore, int lineUnitAfter, int characterUnitFirstLineIndent){ |
1387 | Dispatch paragraphs = Dispatch.get(selection, "Paragraphs" ).toDispatch(); |
1389 | Dispatch.put(paragraphs, "Alignment" , new Variant(alignment)); //对齐方式 |
1391 | Dispatch.put(paragraphs, "LineSpacingRule" , new Variant(lineSpaceingRule)); //行距 |
1393 | Dispatch.put(paragraphs, "LineUnitBefore" , new Variant(lineUnitBefore)); //段前 |
1395 | Dispatch.put(paragraphs, "LineUnitAfter" , new Variant(lineUnitAfter)); //段后 |
1397 | Dispatch.put(paragraphs, "CharacterUnitFirstLineIndent" , |
1399 | new Variant(characterUnitFirstLineIndent)); //首行缩进字符数 |
1405 | * 打印当前段落格式, 使用前,请先选中段落 |
1409 | public void getParagraphsProperties(){ |
1411 | Dispatch paragraphs = Dispatch.get(selection, "Paragraphs" ).toDispatch(); |
1413 | String val = Dispatch.get(paragraphs, "LineSpacingRule" ).toString(); //行距 |
1415 | System.out.println( "行距:" + val); |
1417 | val = Dispatch.get(paragraphs, "Alignment" ).toString(); //对齐方式 |
1419 | System.out.println( "对齐方式:" + val); //0-左对齐, 1-右对齐, 2-右对齐, 3-两端对齐, 4-分散对齐 |
1421 | val = Dispatch.get(paragraphs, "LineUnitBefore" ).toString(); //段前行数 |
1423 | System.out.println( "段前行数:" + val); |
1425 | val = Dispatch.get(paragraphs, "LineUnitAfter" ).toString(); //段后行数 |
1427 | System.out.println( "段后行数:" + val); |
1429 | val = Dispatch.get(paragraphs, "FirstLineIndent" ).toString(); //首行缩进 |
1431 | System.out.println( "首行缩进:" + val); |
1433 | val = Dispatch.get(paragraphs, "CharacterUnitFirstLineIndent" ).toString(); //首行缩进字符数 |
1435 | System.out.println( "首行缩进字符数:" + val); |
1451 | public void save(String savePath) { |
1453 | Dispatch.call(Dispatch.call(word, "WordBasic" ).getDispatch(), |
1455 | "FileSaveAs" , savePath); |
1471 | public void saveAsHtml(String htmlPath){ |
1473 | Dispatch.invoke(doc, "SaveAs" , Dispatch.Method, |
1475 | new Object[]{htmlPath, new Variant( 8 )}, new int [ 1 ]); |
1483 | *@param val 0不保存修改 -1 保存修改 -2 提示是否保存修改 |
1487 | public void closeDocument( int val) { |
1489 | Dispatch.call(doc, "Close" , new Variant(val)); |
1503 | public void closeDocument() { |
1507 | Dispatch.call(doc, "Save" ); |
1509 | Dispatch.call(doc, "Close" , new Variant(saveOnExit)); |
1517 | public void closeDocumentWithoutSave(){ |
1521 | Dispatch.call(doc, "Close" , new Variant( false )); |
1537 | public void close() { |
1543 | Dispatch.call(word, "Quit" ); |
1563 | public void printFile() { |
1567 | Dispatch.call(doc, "PrintOut" ); |
1575 | * 保护当前档,如果不存在, 使用expression.Protect(Type, NoReset, Password) |
1581 | * WdProtectionType 可以是下列 WdProtectionType 常量之一: |
1583 | * 1-wdAllowOnlyComments, 2-wdAllowOnlyFormFields, 0-wdAllowOnlyRevisions, |
1585 | * -1-wdNoProtection, 3-wdAllowOnlyReading |
1591 | public void protectedWord(String pwd){ |
1593 | String protectionType = Dispatch.get(doc, "ProtectionType" ).toString(); |
1595 | if (protectionType.equals( "-1" )){ |
1597 | Dispatch.call(doc, "Protect" , new Variant( 3 ), new Variant( true ), pwd); |
1609 | * WdProtectionType 常量之一(Long 类型,只读): |
1611 | * 1-wdAllowOnlyComments,2-wdAllowOnlyFormFields、 |
1613 | * 0-wdAllowOnlyRevisions,-1-wdNoProtection, 3-wdAllowOnlyReading |
1619 | public void unProtectedWord(String pwd){ |
1621 | String protectionType = Dispatch.get(doc, "ProtectionType" ).toString(); |
1623 | if (protectionType.equals( "3" )){ |
1625 | Dispatch.call(doc, "Unprotect" , pwd); |
1637 | * 1-msoAutomationSecurityByUI 使用“安全”对话框指定的安全设置。 |
1639 | * 2-msoAutomationSecurityForceDisable 在程序打开的所有文件中禁用所有宏,而不显示任何安全提醒。 |
1641 | * 3-msoAutomationSecurityLow 启用所有宏,这是启动应用程序时的默认值。 |
1645 | public void setAutomationSecurity( int value){ |
1647 | word.setProperty( "AutomationSecurity" , new Variant(value)); |
1653 | * 读取文档中第paragraphsIndex段文字的内容; |
1655 | * @param paragraphsIndex |
1661 | public String getParagraphs( int paragraphsIndex){ |
1665 | Dispatch paragraphs = Dispatch.get(doc, "Paragraphs" ).toDispatch(); // 所有段落 |
1667 | int paragraphCount = Dispatch.get(paragraphs, "Count" ).getInt(); // 一共的段落数 |
1669 | Dispatch paragraph = null ; |
1671 | Dispatch range = null ; |
1673 | if (paragraphCount > paragraphsIndex && 0 < paragraphsIndex){ |
1675 | paragraph = Dispatch.call(paragraphs, "Item" , new Variant(paragraphsIndex)).toDispatch(); |
1677 | range = Dispatch.get(paragraph, "Range" ).toDispatch(); |
1679 | ret = Dispatch.get(range, "Text" ).toString(); |
1687 | public static void main(String[] args) throws Exception{ |
1689 | WordBean word = new WordBean(); |
1691 | word.createNewDocument(); |
1693 | word.createTable( "" , 5 , 5 ); |
1695 | word.mergeCell( 1 , 1 , 1 , 1 , 5 ); |
1697 | word.mergeCell( 1 , 2 , 1 , 2 , 5 ); |
1699 | word.mergeCell( 1 , 3 , 1 , 3 , 5 ); |
1701 | word.putTxtToCell( 1 , 1 , 1 , "主题" ); |
1703 | word.putTxtToCell( 1 , 2 , 1 , "时间" ); |
1705 | word.putTxtToCell( 1 , 3 , 1 , "人员" ); |
1707 | word.putTxtToCell( 1 , 4 , 2 , "说话了" ); |
1709 | word.save( "c:\\jacobTest.doc" ); |
1711 | System.out.print( "请打开c:\\jacobTest.doc查看是否有写word成功!" ); |
四.使用错误分析:
1.由于应用程序配置不正确,不能启用dll文件;
解决:版本不对,换另一个版本试一下.
2.
1 | ERROR [http-8080-Processor25] - Servlet.service() for servlet FileUploaded threw exception |
3 | java.lang.UnsatisfiedLinkError: no jacob-1.14.3-x86 in java.library.path |
5 | at java.lang.ClassLoader.loadLibrary(Unknown Source) |
7 | at java.lang.Runtime.loadLibrary0(Unknown Source) |
9 | at java.lang.System.loadLibrary(Unknown Source) |
将dll文件复制到tomcat\bin目录下重新启动tomcat5.5
3.使用过程中(将项目发布到Tomcat5下运行时)提示
1 | java.lang.UnsatisfiedLinkError: |
3 | Native Library D:\Program Files\Apache Software Foundation\Tomcat 5.5\bin\jacob-1.14.3-x86.dll |
5 | already loaded in another classloader |
解决:将%Tomcat 5.5%\webapps\XXXX\WEB-INF\lib\下的jacob.jar包剪切到%Tomcat 5.5%\shared\lib目录下(或删除).
五.自己改写WordBean类:
1.改写前你要知道VBA,熟悉怎样用VBA操作word;
2.将VBA操作改到java代码;要知道com.jacob.com.Dispatch可容纳任何VBA中的集合对象;
如:Dispatch paragraphs = Dispatch.get(doc, "Paragraphs").toDispatch(); // 将Paragraphs 集合对象赋给Dispatch对象;
3.使用VBA对象属性:
如:int paragraphCount = Dispatch.get(paragraphs, "Count").getInt(); //调用Dispatch.get()方法获取Paragraphs 集合对象的Count属性;
4.调用VBA对象方法:
在VBA帮助中我们找到Document 对象Close方法是这样声明的:
expression.Close(SaveChanges, OriginalFormat, RouteDocument)
expression 必需。该表达式返回以上的一个对象。
SaveChanges Variant 类型,可选。指定保存文档的操作。可以是下列 WdSaveOptions 常量之一:wdDoNotSaveChanges、wdPromptToSaveChanges 或 wdSaveChanges。
OriginalFormat Variant 类型,可选。指定保存文档的格式。可以是下列 WdOriginalFormat 常量之一:wdOriginalDocumentFormat、wdPromptUser 或 wdWordDocument。
RouteDocument Variant 类型,可选。如果该属性值为 True,则将文档发送给下一个收件人。如果文档没有附加传送名单,则忽略该参数。
因些我们可在WordBean添加一个这样的方法关闭文档:
1 | public void closeDocument( int val) { |
3 | Dispatch doc = Dispatch.call(documents, "Open" , docPath).toDispatch(); //doc是Document对象,调用 |
5 | Dispatch.call(doc, "Close" , new Variant(val)); // val 0不保存修改 -1 保存修改 -2 提示是否保存修改,对应VBA中Document 对象Close方法的SaveChanges参数 |
你会注意到Dispatch类重载了很多call方法,这与VBA中方法基本相似有很多参数是缺省的:
你可还会注意到Dispatch还有个invoke方法其实它和call差不多也是调用VBA对象方法的,只参数的形式不同(我目前这样认为)
Dispatch还有很多方法调用都是为配合调用VBA对象的方法,我还没有时间深入的看,等都明白再补上这部分说明;
参考(自己Gooogle一下):
JAVA 深度控制 WORD;
Aspose.Words for Java 发布-操作word的工具
Java/Office2007 以往java程序员要访问office文档,往往要借助各种各样的com组件,jni是难以避免的,因为office文档(word、excel、ppt)是二进制存储的。但是在许多系统中都要用到office文档,这个java程序员带来了一定的麻烦。 随着office2007的出现,文档存储支持OpenXML,使得java程序读写office文档不用必须借助第三方控件。以word2007为例,文档存储为*.docx文件,这实际上是一个压缩文件,通过java的ZIPjar包、TAR jar包,都可以访问,可以使用100%纯java代码完成对word2007文件的读取、写入操作。 比较详细的一个例子如下:http://www.infoq.com/articles/cracking-office-2007-with-java,有兴趣的可以去参考一下。 另外,office文档操作也有很多其他方法,比如POI、j-Interop等第三方工具包。