2011-03-22 51 views
4

我試圖以編程方式修改Word文檔中的嵌入式Excel表格。爲此,我修改了docx文件和嵌入式excel文件。以編程方式更新嵌入的Excel文件

主文檔的顯著部分如下:

<w:object w:dxaOrig="8406" w:dyaOrig="2056"> 
    <v:shape id="_x0000_i1028" type="#_x0000_t75" 
    style="width:390.75pt;height:95.25pt" o:ole=""><v:imagedata r:id="rId14" 
    o:title=""/> 
    </v:shape> 
    <o:OLEObject Type="Embed" ProgID="Excel.Sheet.12" ShapeID="_x0000_i1028" 
    DrawAspect="Content" ObjectID="_1349794876" r:id="rId15" 
    UpdateMode="Always"/> 
</w:object> 

Word文檔使用一個OLEOBJECT鏈接到嵌入的Excel文件。出於顯示目的,使用 .wmf文件(使用v:shape元素)。我修改了過時此預覽的excel文檔。

這導致在該文件中一些奇怪的行爲:

  • 嵌入式(EXCEL)表的預覽顯示錯誤的數據打開
  • 上的嵌入式表雙擊在嵌入的Excel表和顯示了正確的數據
  • 關閉嵌入式編輯器觸發新的預覽的產生,顯示了正確的數據

當然,我希望表SH當文檔打開時,請使用正確的表格。如何觸發Word以放棄圖像並重新預覽?

對我來說,一個理想的解決方案就是通過修改docx的內容來觸發預覽的再生,但使用小腳本的解決方案也會有所幫助。

+0

您是通過OpenXML,.NET,VSTO還是VBA更新嵌入式電子表格? – 2011-03-24 18:22:24

+0

我自己在做轉換,使用PHP(SimpleXML和一點DOMDocument)。電子表格的轉換完美無缺,這是問題的「預覽」圖像。 – Scharrels 2011-03-24 19:44:04

回答

5

目前還沒有完美的解決方案,但大多數情況下都是強制開啓/關閉OLEFormat.Object。如果您是從Word外部對嵌入式Excel工作表進行補充(即操作Open XML格式)或通過對象模型執行操作,則無關緊要。它涉及的是從Word中打開嵌入式Excel電子表格,然後關閉該對象以將圖像更改爲嵌入電子表格中的當前值以及要創建的新圖像。

這隻取決於一點,如果你在許多Word文檔或只是一個這樣做。在前一種情況下,全局模板(例如normal.dot或您創建並放在STARTUP文件夾中的自定義模板)或稍後的情況下,只需在一個文檔後面運行代碼。兩者都有不同的方式讓事情運行,但基本上你會掛鉤Document_Open事件,並從那裏檢查當前文檔是否具有OLE嵌入對象,如果是,打開和關閉它們。

沒有進入鉤子,就像我說的,代碼並不漂亮。基本上是因爲它使用SendKeys。大多數情況下,這將起作用。有些時候,它不會。這就是SendKeys和其他未經同意接收焦點的程序(如即時通訊程序)的性質。

如果Word有焦點(這意味着你不能打開VBE,然後按F5 ),該代碼應該做的伎倆:

Sub UpdateEmbeddedXLSX() 
Dim workbook As InlineShape 
    For Each workbook In ActiveDocument.InlineShapes 
     With workbook 
      If .Type = wdInlineShapeEmbeddedOLEObject Then 
       ''# Excel.Sheet.12 for Excel 2007 
       If .OLEFormat.ClassType = "Excel.Sheet.12" Then 
        ''# Open Object as spreadsheet 
        .OLEFormat.DoVerb wdOLEVerbPrimary 
        ''# If you want, you can also do any updates here like 
        .OLEFormat.Object.ActiveSheet.Cells(2, 2).Value = ".1" 
        ''# Nasty - but it works - SendKeys 
        SendKeys "{ESC}", True 
       End If 
      End If 
     End With 
    Next 
End Sub 

最起碼,你可以把這個代碼在normal.dot中,並將其分配給QAT以作爲宏運行。

請注意,代碼不會繞過Excel打開,這些值會更改然後關閉 - 這是使用嵌入對象的一部分。使用鏈接而不是嵌入將會更順利地完成所有這些,但我意識到這並不總是一種選擇。

+0

我一直希望沒有使用宏的解決方案,但我最終使用了這個。謝謝你的回答! – Scharrels 2011-03-30 08:21:22

1

只需添加到舊的文章在事件有人絆倒在這個像我一樣:

上面的代碼的偉大工程,但我修改它使用書籤,而不是使用的SendKeys的。 SendKeys語句真的與我的鍵盤上的NumLock混淆。只是這個命令的怪癖之一。

我所做的是在我的Word文檔模板中創建書籤。然後在我的代碼,我創建了一個指向書籤:

Dim bMark as bookmark 
Set bMark as ActiveDocument.Bookmarks("NameOfBookmark") 

然後代替SendKeys語句的,我做了以下內容:

bMark.Range.Select 
Selection.EndKey 

這基本上拉焦點從嵌入的工作表中,並放到頁面的書籤上。然後,.EndKey語句簡單地刪除了選擇。你甚至不需要它。

希望這會有所幫助!

相關問題