在網上復制粘貼代碼習慣了,所以沒有合適的方法的時候自己都懶得動腦子。
沒想到昨天半天谷歌沒找到的解決方法今天早上換個思路幾分鍾就搞定了。
jacob是一個操作文檔的組件,這個就不贅述了,想知道的同學可以去百度和谷歌。
這是網上的jacob操作word的一個復制表格的方法
/** * 在當前文檔指定的位置拷貝表格 * * @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"); } }
可是如果是要復制多個表格,並且是在生成過程中復制的話就遇到難題了。
因為如果要使用上面這個方法的話,需要一個標簽提供表格copy時的坐標。
而
public void insertText(String newText) { Dispatch.put(selection, "Text", newText); }
insertText這個方法,據實驗和本人猜測,是在最后生成的時候才寫入的。
而不是立即實現。
所以使用
/** * 從選定內容或插入點開始查找文本 * * @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(); }
find方法尋找剛才插入的標識文字始終是false,那么理所當然,
copyTable(String pos, int tableIndex)這個方法是無用的。
所以昨天糾結了一下午。
今天早上突然福臨心至。把copy這個方法的代碼實現看了下。
我擦,我突然發現,無須用什么標簽來替換插入表格,直接尋找到光標插入點不就行了。
稍微修改了下,其實就是刪除了幾行代碼,就變成以下代碼
/** * 在當前插入點拷貝表格 * * @param tableIndex * 被拷貝的表格在word文檔中所處的位置 */ public void copyTable(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"); Dispatch.call(selection, "Paste"); }
so,在插入上一個表格之后,再將光標往下移動幾行,就搞定了,根據數據多少,動態復制表格
。
往下移動光標的代碼:
/** * 把選定的內容或者插入點向下移動 * * @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"); }
這樣,就ok了。
但是在生成三個以上表格時,卻發現一個問題,那就是后面的表格緊接上一個表格,不論往下移動幾個光標都木有用。
那么,要如何是好呢。這時候,一個極其有用的代碼就出現了,那就是插入一個空行:
Dispatch.call(selection, "TypeParagraph");//插入空行
全部搞定。
這次的過程給了我一個個赤果果的教訓,那就是不要太依賴谷歌與度娘。
還是多看看源碼吧。