Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/284.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何将Excel工作表从一个工作簿复制到另一个工作簿_C#_Visual Studio 2010 - Fatal编程技术网

C# 如何将Excel工作表从一个工作簿复制到另一个工作簿

C# 如何将Excel工作表从一个工作簿复制到另一个工作簿,c#,visual-studio-2010,C#,Visual Studio 2010,我一直在网上寻找答案。有几十种解决方案,但似乎没有一种是正确的。我正在使用C构建的应用程序从mdb querydef中提取数据,并创建一个包含两个工作表的Excel工作簿。那部分工作得很好。现在让我们来看一个简单的部分:我有一个包含多个工作表的工作簿。每个工作表将以不同的方式计算数据。我需要代码来打开模板工作簿,复制正确的工作表,并将副本与其他两个工作表一起放在新创建的工作簿中。下面是我认为应该可以使用的代码示例: _Application xlApp;

我一直在网上寻找答案。有几十种解决方案,但似乎没有一种是正确的。我正在使用C构建的应用程序从mdb querydef中提取数据,并创建一个包含两个工作表的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);

根据我对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。如果不想复制整个工作簿,还可以复制各个模块。不过,我建议您复制整个工作簿,并为最昂贵的资源开发人员时间进行优化。从长远来看,这将是一个更可持续的解决方案,而且易于实施。祝你好运