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) { |
0727 |
e.printStackTrace(); |
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) { |
0791 |
e.printStackTrace(); |
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" ); |
0869 |
* word文件中的第N张表(从1开始) |
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)); |
0909 |
* word文档中的第N张表(从1开始) |
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)); |
0943 |
* word文档中的第N张表(从1开始) |
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)); |
0977 |
* word文档中的第N张表(从1开始) |
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" ); |
1007 |
* word文档中的第N张表(从1开始) |
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" ); |
1041 |
* word文档中的第N张表(从1开始) |
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" ); |
1087 |
* word文档中的第N张表(从1开始) |
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" ); |
1121 |
* word文档中的第N张表(从1开始) |
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等第三方工具包。