C# 如何将Excel工作表从一个工作簿复制到另一个工作簿
我一直在网上寻找答案。有几十种解决方案,但似乎没有一种是正确的。我正在使用C构建的应用程序从mdb querydef中提取数据,并创建一个包含两个工作表的Excel工作簿。那部分工作得很好。现在让我们来看一个简单的部分:我有一个包含多个工作表的工作簿。每个工作表将以不同的方式计算数据。我需要代码来打开模板工作簿,复制正确的工作表,并将副本与其他两个工作表一起放在新创建的工作簿中。下面是我认为应该可以使用的代码示例:C# 如何将Excel工作表从一个工作簿复制到另一个工作簿,c#,visual-studio-2010,C#,Visual Studio 2010,我一直在网上寻找答案。有几十种解决方案,但似乎没有一种是正确的。我正在使用C构建的应用程序从mdb querydef中提取数据,并创建一个包含两个工作表的Excel工作簿。那部分工作得很好。现在让我们来看一个简单的部分:我有一个包含多个工作表的工作簿。每个工作表将以不同的方式计算数据。我需要代码来打开模板工作簿,复制正确的工作表,并将副本与其他两个工作表一起放在新创建的工作簿中。下面是我认为应该可以使用的代码示例: _Application xlApp;
_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);
根据我对MSDN文档的阅读,Workbench.Copy只能在工作簿中使用。您的C语法看起来是正确的 有两种方法可以实现这一点: 使用工作簿.SaveCopyAs复制整个模板工作簿,并删除不需要的内容。 选择要移动的区域并使用剪贴板区域。选择;范围。复制;范围。粘贴;复制它。
希望这有帮助。谢谢你的帮助。在尝试了更多的事情之后,我发现我唯一能做的就是复制整个工作簿并删除不适用的工作表。我觉得这很麻烦,所以如果有人找到更好的方法,我洗耳恭听。以下是我最终使用的代码:
_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);
从文档中可以看出,复制参数指定的是目的地而不是源。因此,您可能需要尝试类似sourceWB.Worksheets.CopydestWB的方法。好的。但是,xlTemplateWB.Worksheets[BOD].CopyxlTempWB;是无效语法。我假设可以创建工作表的实例,然后将其复制到新工作簿。但是,如何使工作表的新实例与要复制的工作表相等?我尝试了:WorksheetxlTemplateWB.Worksheets[BOD].CopyxlTempWB;但现在我收到了这个错误:来自HRESULT的异常:0x800A03ECI觉得必须有一种方法来做到这一点。也许几步?类似于:psuedo代码工作表tempWS=worksheetobecopied;将工作表粘贴到新工作簿中或者,是否有方法从一个工作表创建一个新工作簿,然后我可以添加两个数据工作表?@DanRicketts-需要记住的一点是,Excel对象模型最初是用VB5设计的。它比OO更具程序性,多年来,在试图保持向后兼容性的同时,已经慢慢地转向OO。再加上许多.Net对象封送到下面的COM对象,像深度对象拷贝这样的事情几乎是不可能的。是的,您可以创建一个空工作簿,将所选范围复制到其中,但不能作为工作表对象。复制范围是不够的,有什么原因吗?我需要VBA随范围移动。每张纸上都附有几百行代码。复制工作簿是可行的,但是删除23个工作表以保存1个工作表的效率非常低。我以前用VB做过这件事,但这个项目是用C语言编写的,我还在学习。@DanRicketts-如果你用的是现代的VBA,C语言的翻译应该非常接近。不过,在VBA中,我想不出更好的方法来实现这一点。我认为复制工作表的唯一方法是使用剪贴板复制上面的方法2。如果不想复制整个工作簿,还可以复制各个模块。不过,我建议您复制整个工作簿,并为最昂贵的资源开发人员时间进行优化。从长远来看,这将是一个更可持续的解决方案,而且易于实施。祝你好运