如何将一些VBA代码嵌入到使用ClosedXML创建的电子表格中?

里奥拉

我正在使用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

  • (Excel)文件->选项->信任中心->信任中心设置->宏设置->信任对VBA项目对象模型的访问

在此处输入图片说明

在您的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] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

如何将真正的实时Google表格电子表格嵌入到网页中?

自动创建电子表格后,如何将电子表格的 URL 引用复制到其他 Google 电子表格中的跟踪表

如何使用 Apps 脚本将多个电子表格中特定列的数据导入到一个电子表格中?

使用Google工作表脚本时,如何在不创建新工作表副本的情况下将电子表格的工作表复制到另一个电子表格中?

我想从我的Excel电子表格中删除一些图片

通过比较一些值从其他电子表格中获取数据

如何使用php在Google驱动器中创建电子表格并安装加载项或将应用脚本附加到电子表格中

如何将单元格从一个电子表格复制到另一个电子表格中的工作表?

如何使用API在新的Google电子表格中创建第一行?

如何将源文件导入嵌入到Google电子表格中的Google Apps脚本项目中

将Vimeo视频嵌入到Excel电子表格中

迭代空白电子表格时如何将占位符插入到聚合的 df 中

如何将电子表格中的特定行和列复制到记事本?

如何将数据从Gmail邮件附件复制到电子表格?

Google Script 如何将新行备份到主电子表格

如何将数据从一个电子表格追加到另一个电子表格?

如何将电子表格中的两行合并为一行?

Google Apps脚本,使用格式将一个电子表格复制到另一电子表格

使用Python使用Google API将电子表格复制到另一个电子表格

如何将值列表中的多个项目输入电子表格

如何将Outlook邮件中的数据解析为Excel电子表格

将另一个电子表格中的彩色单元格复制到当前电子表格

无法从电子表格中排除一些不必要的值

Google电子表格脚本显示了一些奇怪的行为

如何使用HtmlService将值从Google电子表格检索到文本字段

使用Google脚本将Xbrl集成到Google电子表格中

如何根据活动电子表格 Google Apps 脚本中的数据创建多个电子表格?

如何使用VBA在Excel电子表格中的列表中打开文件夹

如何将每一行发送到另一电子表格,该电子表格的名称存储在该行的单元格中?