我正在使用ClosedXML从C#(asp.net-mvc)生成电子表格,并且效果很好。我还有一个额外的要求,因此我想获得一些有关如何实现此目标的反馈。
我想另存为启用了宏的工作簿,当我给它一个“ xlsm”扩展名时,它似乎没有打开(与xlsx相对)。这是我的代码:
public ActionResult ExportExcel()
{
MemoryStream stream = nModel.GenerateSS();
return File(stream, @"application/vnd.openxmlformats-officedocument.spreadsheetml.sheet.main+xml", "MySS.xlsx");
}
但是如果我尝试这样做:
public ActionResult ExportExcel()
{
MemoryStream stream = nModel.GenerateSS();
return File(stream, @"application/vnd.openxmlformats-officedocument.spreadsheetml.sheet.main+xml", "MySS.xlsm");
}
尝试打开时Excel抱怨。
然后,假设我可以做#1,那么我需要能够使用一些VBA(假设只是一个硬编码的函数)并将其插入模块或工作簿中,以便当有人打开电子表格并单击宏时,他们可以运行宏。从谷歌搜索来看,ClosedXML似乎不支持该功能,所以我很好奇是否有人可以通过其他方法来实现这一目标?
我知道将代码插入VBA项目的唯一方法是与Office.Interop.Excel
一起使用Microsoft.Vbe.Interop
(不确定ClosedXML和其他第三方...但仍然希望共享)
但是,由于您要寻求替代方案,所以这就是我要去做的事情。
Creating a workbook and inserting a macro to it using C#
您需要允许以编程方式访问Excel中的VBA Project。
在您的C#解决方案中,添加COM引用以
Microsoft Visual Basic应用程序可扩展性5.3
Microsoft Excel 14.0对象库
将using指令添加到文件的C#代码中
using Microsoft.Office.Interop.Excel;
using System.Reflection;
using Microsoft.Vbe.Interop;
using System.Runtime.InteropServices;
现在按照代码和注释进行操作
Microsoft.Office.Interop.Excel.Application xlApp = new Microsoft.Office.Interop.Excel.Application();
xlApp.Visible = true;
Workbook wb = xlApp.Workbooks.Add(XlWBATemplate.xlWBATWorksheet);
VBProject vbProj = wb.VBProject; // access to VBAProject
VBComponent vbComp = vbProj.VBComponents.Add(vbext_ComponentType.vbext_ct_StdModule); // adding a standard coding module
vbComp.CodeModule.DeleteLines(1, vbComp.CodeModule.CountOfLines); //emptying it
// this is VBA code to add to the coding module
string code = "Public Sub HelloWorld() \n" +
" MsgBox \"hello world!\" \n" +
"End Sub";
// code should be added to the module now
vbComp.CodeModule.AddFromString(code);
// location to which you want to save the workbook - desktop in this case
string fullPath = Environment.GetFolderPath(Environment.SpecialFolder.DesktopDirectory) + "\\macroWorkbook.xlsm";
// run the macro
xlApp.Run("HelloWorld");
// save as macro enabled workbook
wb.SaveAs(Filename: fullPath, FileFormat: XlFileFormat.xlOpenXMLWorkbookMacroEnabled);
xlApp.Quit();
在上面的代码中;
您创建一个宿主Excel应用程序,添加一个工作簿。访问VBA项目对象模块,将新的标准编码模块添加到VBA项目中,然后将VBA宏写入该模块。Application.Run("HelloWorld")
只需调用宏-注意,如果您不希望弹出该框,则可以注释掉此部分。然后最后将工作簿作为“启用宏的工作簿”保存到fullPath
变量中指定的位置。
PS。请注意,我尚未添加任何错误处理。
有关C#和VBA的其他提示,请参见此博客,希望对您有所帮助:)
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句