2013-01-02 253 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); 
相关问题