转载

JACOB的复制表格与添加空行

在网上复制粘贴代码习惯了,所以没有合适的方法的时候自己都懒得动脑子。

没想到昨天半天谷歌没找到的解决方法今天早上换个思路几分钟就搞定了。

jacob是一个操作文档的组件,这个就不赘述了,想知道的同学可以去百度和谷歌。

这是网上的jacob操作word的一个复制表格的方法

  1. /**  
  2.      * 在当前文档指定的位置拷贝表格  
  3.      *   
  4.      * @param pos  
  5.      *            当前文档指定的位置  
  6.      * @param tableIndex  
  7.      *            被拷贝的表格在word文档中所处的位置  
  8.      */ 
  9.     public void copyTable(String pos, int tableIndex) {  
  10.         Dispatch tables = Dispatch.get(doc, "Tables").toDispatch();  
  11.         Dispatch table = Dispatch.call(tables, "Item"new Variant(tableIndex))  
  12.                 .toDispatch();  
  13.         Dispatch range = Dispatch.get(table, "Range").toDispatch();  
  14.         Dispatch.call(range, "Copy");  
  15.         if (this.find(pos)) {  
  16.             Dispatch textRange = Dispatch.get(selection, "Range").toDispatch();  
  17.             Dispatch.call(textRange, "Paste");  
  18.         }  
  19.     } 

可是如果是要复制多个表格,并且是在生成过程中复制的话就遇到难题了。

因为如果要使用上面这个方法的话,需要一个标签提供表格copy时的坐标。

  1. public void insertText(String newText) {    
  2.             Dispatch.put(selection, "Text", newText);    
  3.         }  

insertText这个方法,据实验和本人猜测,是在最后生成的时候才写入的。

而不是立即实现。

所以使用

  1. /**  
  2.      * 从选定内容或插入点开始查找文本  
  3.      *   
  4.      * @param toFindText  
  5.      *            要查找的文本  
  6.      * @return boolean true-查找到并选中该文本,false-未查找到文本  
  7.      */ 
  8.     public boolean find(String toFindText) {  
  9.         if (toFindText == null || toFindText.equals(""))  
  10.             return false;  
  11.         // 从selection所在位置开始查询  
  12.         Dispatch find = word.call(selection, "Find").toDispatch();  
  13.         // 设置要查找的内容  
  14.         Dispatch.put(find, "Text", toFindText);  
  15.         // 向前查找  
  16.         Dispatch.put(find, "Forward""True");  
  17.         // 设置格式  
  18.         Dispatch.put(find, "Format""True");  
  19.         // 大小写匹配  
  20.         Dispatch.put(find, "MatchCase""True");  
  21.         // 全字匹配  
  22.         Dispatch.put(find, "MatchWholeWord""True");  
  23.         // 查找并选中  
  24.         return Dispatch.call(find, "Execute").getBoolean();  
  25.     } 

find方法寻找刚才插入的标识文字始终是false,那么理所当然,

copyTable(String pos, int tableIndex)这个方法是无用的。

所以昨天纠结了一下午。

今天早上突然福临心至。把copy这个方法的代码实现看了下。

我擦,我突然发现,无须用什么标签来替换插入表格,直接寻找到光标插入点不就行了。

稍微修改了下,其实就是删除了几行代码,就变成以下代码

  1. /**  
  2.      * 在当前插入点拷贝表格  
  3.      *   
  4.      * @param tableIndex  
  5.      *            被拷贝的表格在word文档中所处的位置  
  6.      */ 
  7.     public void copyTable(int tableIndex) {  
  8.         Dispatch tables = Dispatch.get(doc, "Tables").toDispatch();  
  9.         Dispatch table = Dispatch.call(tables, "Item"new Variant(tableIndex))  
  10.                 .toDispatch();  
  11.         Dispatch range = Dispatch.get(table, "Range").toDispatch();  
  12.         Dispatch.call(range, "Copy");  
  13.         Dispatch.call(selection, "Paste");  
  14.     } 

so,在插入上一个表格之后,再将光标往下移动几行,就搞定了,根据数据多少,动态复制表格。

往下移动光标的代码:

  1. /**  
  2.      * 把选定的内容或者插入点向下移动  
  3.      *   
  4.      * @param pos  
  5.      *            移动的距离  
  6.      */ 
  7.     public void moveDown(int pos) {  
  8.         if (selection == null) {  
  9.             selection = Dispatch.get(word, "Selection").toDispatch();  
  10.         }  
  11.         for (int i = 0; i < pos; i++)  
  12.             Dispatch.call(selection, "MoveDown");  
  13.     } 

这样,就ok了。

但是在生成三个以上表格时,却发现一个问题,那就是后面的表格紧接上一个表格,不论往下移动几个光标都木有用。

那么,要如何是好呢。这时候,一个极其有用的代码就出现了,那就是插入一个空行:

  1. Dispatch.call(selection, "TypeParagraph");//插入空行 

全部搞定。

这次的过程给了我一个个赤果果的教训,那就是不要太依赖谷歌与度娘。

还是多看看源码吧。

仰山之高,观水之流…… 省我其心,抚尔之琴……

正文到此结束
Loading...