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