【问题标题】:How to copy an Excel Worksheet from one Workbook to another如何将 Excel 工作表从一个工作簿复制到另一个工作簿
【发布时间】:2013-01-03 04:06:39
【问题描述】:

我一直在网上寻找答案。有几十个“解决方案”,但似乎没有任何工作正常。我正在构建的应用程序(使用 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);

【问题讨论】:

  • 从文档看来,复制参数指定了目标而不是源。所以你可能想试试sourceWB.Worksheets.Copy(destWB) 之类的东西。见msdn.microsoft.com/en-us/library/…
  • 好的。但是,xlTemplateWB.Worksheets["BOD"].Copy(xlTempWB);是无效的语法。我假设我可以创建一个工作表的实例,然后将其复制到新的工作簿中。但是,如何使工作表的新实例等于要复制的工作表?
  • 我试过了:((Worksheet)xlTemplateWB.Worksheets["BOD"]).Copy(xlTempWB);但现在我收到此错误:HRESULT 异常:0x800A03EC

标签: c# visual-studio-2010


【解决方案1】:

根据我对 MSDN 文档的阅读,Worksheet.Copy() 仅适用于工作簿。您的 C# 语法看起来是正确的。

有几种方法可以解决这个问题:

  1. 复制整个模板工作簿(使用WorkBook.SaveCopyAs())并删除不需要的内容。
  2. 选择要移动的范围并使用剪贴板 (Range.Select; Range.Copy; Range.Paste;) 进行复制。

希望这会有所帮助。

【讨论】:

  • 我觉得必须有办法做到这一点。也许几个步骤?类似于:(伪代码)工作表 tempWS = WorksheetToBeCopied;将工作表粘贴到新工作簿中
  • 或者,有没有办法从一个工作表创建一个新工作簿,然后我可以添加两个数据工作表?
  • @DanRicketts - 要记住的一件事是,Excel 对象模型最初是在考虑 VB5 的情况下设计的。它比 OO 更具程序性,并且多年来逐渐转向 OO,同时试图保持向后兼容性。加上许多 .Net 对象编组到下面的 COM 对象的皱纹,像深对象副本这样的事情几乎是不可能的。是的,您可以创建一个空工作簿来将所选范围复制到其中,而不是作为 Worksheet 对象。复制范围不够有什么原因吗?
  • 我需要 VBA 来配合它移动。每张表都附有数百行代码。复制工作簿可以,但删除 23 个工作表以保存 1 个效率极低。我过去使用 VB 完成了这项工作,但这个项目是用 C# 编写的(我还在学习)。
  • @DanRicketts - 如果您使用的是“现代”VBA,C# 的翻译应该非常接近。不过,我也想不出更好的方法在 VBA 中做到这一点。我认为复制工作表的唯一方法是使用上面的方法#2(剪贴板复制)。如果您不想复制整个工作簿,也可以复制各个模块。不过,我建议您复制整个工作簿,优化最昂贵的资源 - 开发人员时间。从长远来看,这将是一个更可持续的解决方案,并且易于实施。祝你好运。
【解决方案2】:

感谢您的帮助。在尝试了更多的事情之后,我发现我唯一可以开始工作的就是复制整个工作簿并删除不适用的工作表。我觉得这很麻烦,所以如果有人找到更好的方法来做到这一点,我会全力以赴。这是我最终使用的代码:

            _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);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-04-18
    • 2017-09-18
    • 2011-03-14
    • 1970-01-01
    • 2014-12-09
    • 1970-01-01
    相关资源
    最近更新 更多