【发布时间】:2016-09-20 15:53:40
【问题描述】:
在从EPPlus 下载的示例Sample15.cs 中,我看到EPPlus 可以编写/注入VBA 宏。但是,我看不到如何从 .xlsm 工作簿中读取所有 VBA 宏。
EPPlus 能否解释 VbaProject.bin 并支持此功能?
PS:Open XML SDK 似乎也无法做到这一点(如果我错了请纠正我),这就是我考虑 EPPlus 的原因...
【问题讨论】:
在从EPPlus 下载的示例Sample15.cs 中,我看到EPPlus 可以编写/注入VBA 宏。但是,我看不到如何从 .xlsm 工作簿中读取所有 VBA 宏。
EPPlus 能否解释 VbaProject.bin 并支持此功能?
PS:Open XML SDK 似乎也无法做到这一点(如果我错了请纠正我),这就是我考虑 EPPlus 的原因...
【问题讨论】:
如果您只想阅读每个模块中的代码,您只需像这样浏览“Workbook.VbaProject.Modules”集合:
var fi = new FileInfo(@"C:\temp\Book1.xlsm");
using (var pck = new ExcelPackage(fi))
{
var modules = pck.Workbook.VbaProject.Modules;
foreach (var module in modules)
{
Console.WriteLine($"Module Name: {module.Name}{Environment.NewLine}Code:");
Console.Write(module.Code);
Console.WriteLine("---------");
}
这会在输出中给你这个(我刚刚创建了一个带有两个模块的 excel xlsm):
Module Name: ThisWorkbook
Code:
---------
Module Name: Sheet1
Code:
---------
Module Name: Module1
Code:
Public Sub proc1()
Dim wb As Workbook
Set wb = ActiveWorkbook
Dim ws As Worksheet
Set ws = wb.ActiveSheet
ws.Cells(1, 1).Value = "proc1"
End Sub
---------
Module Name: Module2
Code:
Public Sub proc2()
Dim wb As Workbook
Set wb = ActiveWorkbook
Dim ws As Worksheet
Set ws = wb.ActiveSheet
ws.Cells(2, 1).Value = "proc2"
End Sub
---------
【讨论】:
ExcelVbaProject.cs 是在ExcelWorkbook.cs 中引用的实际二进制读/写epplus.codeplex.com/SourceControl/latest#EPPlus/VBA/…。