2013-01-02 252 views
2

我一直在網上尋找答案。有幾十個「解決方案」,但似乎沒有什麼正確的。我正在構建的應用程序(使用C#)從mdb querydef中提取數據,並使用兩個工作表創建一個Excel工作簿。那部分工作完美。現在對於那些應該很簡單的部分:我有一個包含多個工作表的工作簿(每個工作表將計算不同的數據)我需要代碼來打開「模板」工作簿,複製正確的工作表,並將副本放入新創建的另外兩個工作表的工作簿。下面是我覺得代碼示例「應該」工作:根據我的MSDN文檔,Worksheet.Copy(讀數如何將Excel工作表從一個工作簿複製到另一個工作簿

  _Application xlApp; 
     Workbook xlTemplateWB; 
     Workbook xlTempWB; 
     object missing = System.Reflection.Missing.Value; 

     xlApp = new ApplicationClass(); 
     xlApp.Visible = true; 

     //Open Bench Sheet Template 
     xlTemplateWB = xlApp.Workbooks.Open(Elmnt.getDBPath() + TEMPLATENAME, 0, true, 5, "", "", 
      false, XlPlatform.xlWindows, "", true, false, 0, true, false, false); 

     //Open temporary workbook 
     xlTempWB = xlApp.Workbooks.Open(XLTempDir + XLTempName, 0, false, 5, true, "", true, 
      XlPlatform.xlWindows, "\t", false, false, 0, true, 1, 0); 

     //Copy "BOD" Worksheet 
     xlTempWB.Worksheets.Copy(xlTemplateWB.Worksheets["BOD"]); 
     xlTempWB.Save(); 

     //Close Workbooks 
     xlTempWB.Close(true, missing, missing); 
     xlTemplateWB.Close(true, missing, missing); 
     xlApp.Quit(); 

     //Release Objects 
     releaseObject(xlTempWB); 
     releaseObject(xlTemplateWB); 
     releaseObject(xlApp); 
+0

從文檔看來,複製參數指定的目標不是源。所以你可能想嘗試像'sourceWB.Worksheets.Copy(destWB)'這樣的東西。請參閱http://msdn.microsoft.com/en-us/library/microsoft.office.interop.excel.sheets.copy%28v=office.14%29.aspx –

+0

好的。但是,xlTemplateWB.Worksheets [「BOD」]。Copy(xlTempWB);是無效的語法。我假設我可以創建一個Worksheet的實例,然後將其複製到新的工作簿。但是,如何使工作表的新實例與要複製的工作表相同? –

+0

我試過:((工作表)xlTemplateWB.Worksheets [「BOD」])。Copy(xlTempWB);但現在我收到此錯誤:從HRESULT異常:0x800A03EC –

回答

2

)將只工作簿內工作。你的C#語法看起來正確。

有幾個方法可以解決這個:

  1. 複製(使用WorkBook.SaveCopyAs())整個模板的工作簿,並刪除你不需要的東西。
  2. 選擇要移動的範圍並使用剪貼板(Range.Select; Range.Copy; Range.Paste;)將其複製。

希望這會有所幫助。

+0

我覺得有必要做到這一點。也許幾個步驟?類似於:(僞代碼)工作表tempWS = WorksheetToBeCopied;在新工作簿中粘貼工作表 –

+0

或者,是否有辦法從一個工作表創建新工作簿,然後我可以在之後添加兩個數據工作表? –

+0

@DanRicketts - 要牢記的一點是,Excel對象模型首先是在VB5中設計的。它比OO更程序化,並且在嘗試保持向後兼容性的同時,已經慢慢轉移到OO。將很多.Net對象編組的皺紋添加到下面的COM對象中,而像深度對象拷貝這樣的東西幾乎是不可能的。是的,您可以創建一個空的工作簿來將選定的範圍複製到,而不是作爲Worksheet對象。有沒有一個原因,爲什麼複製範圍是不夠的? – saarp

1

謝謝你的幫助。在嘗試了更多的事情之後,我發現唯一可以工作的是複製整個工作簿並刪除不適用的工作表。我覺得這很麻煩,所以如果有人找到一個更好的方法來做到這一點,我就會全神貫注。以下是我最終使用的代碼:

  _Application xlApp; 
     Workbook xlTemplateWB; 
     Workbook xlTempWB; 
     object missing = System.Reflection.Missing.Value; 

     xlApp = new ApplicationClass(); 
     xlApp.Visible = true; 

     //Open Bench Sheet Template 
     xlTemplateWB = xlApp.Workbooks.Open(Elmnt.getDBPath() + TEMPLATENAME, 0, true, 5, "", "", 
      false, XlPlatform.xlWindows, "", true, false, 0, true, false, false); 

     //Save As a temporary workbook 
     xlTemplateWB.SaveAs(XLTempDir + XLTempName); 
     xlTemplateWB.Close(true, missing, missing); 
     releaseObject(xlTemplateWB); 

     //Open temporary workbook 
     xlTempWB = xlApp.Workbooks.Open(XLTempDir + XLTempName, 0, false, 5, true, "", true, 
      XlPlatform.xlWindows, "\t", false, false, 0, true, 1, 0); 

     //Remove non-applicable worksheets 
     for (int i = xlTempWB.Sheets.Count; i > 0; i--) 
     { 
      if (((Worksheet)xlTempWB.Sheets[i]).Name != bchSheet) 
      { 
       xlApp.DisplayAlerts = false; 
       ((Worksheet)xlTempWB.Sheets[i]).Delete(); 
       xlApp.DisplayAlerts = true; 
      } 
     } 
     xlTempWB.Save(); 

     //Close Workbooks 
     xlTempWB.Close(true, missing, missing); 
     xlApp.Quit(); 

     //Release Objects 
     releaseObject(xlTempWB); 
     releaseObject(xlApp); 
相關問題