C# 如何使用新的CodeModule从模板复制Excel工作表

C# 如何使用新的CodeModule从模板复制Excel工作表,c#,epplus,C#,Epplus,我在复制excel工作表和所复制工作表的相应code模块时遇到问题。让我解释一下: 场景: 我有一个带有宏(.xlsm)的excel文件,我使用此excel文件作为模板创建另一个excel文件(数据将复制到新文件中) 因此,首先我从数据库中获取一些数据并打开excel模板(.xlsm)文件 在某一点上,某些条目需要位于不同的工作表中,这就是“worksheets.Add()”的作用 var newSheet = workbook.Worksheets.Add("someName", templ

我在复制
excel工作表
和所复制工作表的相应
code模块
时遇到问题。让我解释一下:

场景: 我有一个带有宏(.xlsm)的excel文件,我使用此excel文件作为模板创建另一个excel文件(数据将复制到新文件中)

因此,首先我从数据库中获取一些数据并打开excel模板(
.xlsm
)文件

在某一点上,某些条目需要位于不同的工作表中,这就是“worksheets.Add()”的作用

 var newSheet = workbook.Worksheets.Add("someName", templateSheet);
复制模板工作表(其中包含我也想复制的“VBA”代码)后,我遇到了问题

新创建的工作表的“CodeModule”似乎在名称和引用方面与模板中的相同

就是,;所有属性值都相同,并且:
workbook.VbaProject.Modules
仅包含模板文件的初始代码模块,而不包含新的
新闻页的新代码模块

更糟糕的是,如果我想像这样绑定一个新的
CodeModule

workbook.VbaProject.Modules.AddModule("test");
newSheet.CodeModule.Name = "test";
newSheet.CodeModule
templateSheet.CodeModule
都被设置为
null
(实际上
什么都没有,因为我使用的是VB.Net)


所以问题是:这是一个bug还是我做错了什么?更妙的是:你能为实现这一情景指点迷津吗?

我想你已经有所收获了。我看到了同样的情况——使用EPP3.1。xlsm文件格式中的整个vba是不同的,因为它们不是基于XML的,它们是包含编译文件的bin文件。因此,根据我所看到的,这是EPPlus中的一个缺陷,值得向他们提交。这里有一个单元测试,他们可以直接放入他们的解决方案中(这就是我在处理EPP时所做的):


这似乎是一个bug。我在
epplus
项目的问题中心创建了一个问题。它已标记为
已解决

我还没有测试新版本。完成后我会更新

更新
在最新资料中,此问题已得到解决。

感谢您的测试,我在他们的问题中心创建了一个问题。它(已经)被标记为已解决。如果我已经测试过,我会让你知道结果。仅供参考:我已经下载了最新的源代码,看来这个错误已经解决了。:)当你说最新版本时,我假设它是4.0(beta版)?感谢您的关注@厄尼:我不确定它是否是最新的二进制文件。我获取了源代码并编译了它(因为我觉得它还没有包含在测试版中)。。。它没有任何问题。只需打开项目并构建。
[TestMethod]
public void VBAWorksheetCopyTest()
{
    var sb = new StringBuilder();
    sb.AppendLine("Private Sub Test()");
    sb.AppendLine("    Range(\"G10\").Value = \"TEST\"");
    sb.AppendLine("End Sub");

    var existingFile = new FileInfo(@"c:\temp\temp1.xlsm");
    if (existingFile.Exists)
        existingFile.Delete();

    using (var package = new ExcelPackage(existingFile))
    {
        var workbook = package.Workbook;
        workbook.CreateVBAProject();

        var worksheet = workbook.Worksheets.Add("templateSheet");

        //Module saved in the workSHEET
        worksheet.CodeModule.Code = sb.ToString();
        worksheet.CodeModule.Name = "templateSheet";

        worksheet.Cells["A1"].Value = "Col1";
        worksheet.Cells["A2"].Value = "sdf";
        worksheet.Cells["A3"].Value = "wer";

        package.Save();
    }

    //Open temp1.xlsm and copy the sheet
    using (var package = new ExcelPackage(existingFile))
    {
        var workbook = package.Workbook;
        var templateSheet = workbook.Worksheets["templateSheet"];
        var someName = workbook.Worksheets.Add("someName", templateSheet);

        //VBA code does seem to copy but dose NOT match what is seen in excel
        Assert.IsTrue(templateSheet.CodeModule.Code.Length > 0);
        Assert.IsTrue(someName.CodeModule.Code.Length > 0);

        package.Save();
    }

    //Open temp1 and try to name the modules
    using (var package = new ExcelPackage(existingFile))
    {
        var workbook = package.Workbook;
        var templateSheet = workbook.Worksheets["templateSheet"];
        var someName = workbook.Worksheets["someName"];

        //Give it a name otherwise Excel autonames it 'newsheet1'
        someName.CodeModule.Name = "someName"; //BUT will cause both CodeModule objects to go null

        //These will now fail becuase codemodule is now null for both
        Assert.IsTrue(templateSheet.CodeModule.Code.Length > 0);
        Assert.IsTrue(someName.CodeModule.Code.Length > 0);
    }
}