从 C# 以编程方式创建 Excel VBA 代码和按钮

2023-12-24

我正在使用简单的方法,该方法将我的 DataGridView 保存到 Excel 文档(仅 1 个工作表)中,并添加 VBA 代码和一个用于运行 VBA 代码的按钮。

public void SaveFile(string filePath)
    {

        Microsoft.Office.Interop.Excel.ApplicationClass ExcelApp = new Microsoft.Office.Interop.Excel.ApplicationClass();
        ExcelApp.Application.Workbooks.Add(Type.Missing);

        //Change  Workbook-properties.
        ExcelApp.Columns.ColumnWidth = 20;

        // Storing header part in Excel.
        for (int i = 1; i < gridData.Columns.Count + 1; i++)
        {
            ExcelApp.Cells[1, i] = gridData.Columns[i - 1].HeaderText;
        }

        //Storing Each row and column value to excel sheet
        for (int row = 0; row < gridData.Rows.Count; row++)
        {
            gridData.Rows[row].Cells[0].Value = "Makro";
            for (int column = 0; column < gridData.Columns.Count; column++)
            {
                ExcelApp.Cells[row + 2, column + 1] = gridData.Rows[row].Cells[column].Value.ToString();
            }
        }

        ExcelApp.ActiveWorkbook.SaveCopyAs(filePath);
        ExcelApp.ActiveWorkbook.Saved = true;
        ExcelApp.Quit();
    }

我只实现了DataGridView导出。

EDIT:感谢乔尔,我可以用适当的词语再次寻找解决方案。我觉得。你能纠正我或者给我一两个关于我应该寻找什么的提示吗?


我只是写了一个小例子添加一个新按钮到现有工作簿,然后添加一个宏,单击按钮时将调用该宏.

using Excel = Microsoft.Office.Interop.Excel;
using VBIDE = Microsoft.Vbe.Interop;
...

private static void excelAddButtonWithVBA()
{
    Excel.Application xlApp = new Excel.Application();
    Excel.Workbook xlBook = xlApp.Workbooks.Open(@"PATH_TO_EXCEL_FILE");
    Excel.Worksheet wrkSheet = xlBook.Worksheets[1];
    Excel.Range range;

    try
    {
        //set range for insert cell
        range = wrkSheet.get_Range("A1:A1");

        //insert the dropdown into the cell
        Excel.Buttons xlButtons = wrkSheet.Buttons();
        Excel.Button xlButton = xlButtons.Add((double)range.Left, (double)range.Top, (double)range.Width, (double)range.Height);

        //set the name of the new button
        xlButton.Name = "btnDoSomething";
        xlButton.Text = "Click me!";
        xlButton.OnAction = "btnDoSomething_Click";

        buttonMacro(xlButton.Name, xlApp, xlBook, wrkSheet);
    }
    catch (Exception ex)
    {
        Debug.WriteLine(ex.Message);
    }
    xlApp.Visible = true;
}

在这里我们得到了buttonMacro(..) method

private static void buttonMacro(string buttonName, Excel.Application xlApp, Excel.Workbook wrkBook, Excel.Worksheet wrkSheet)
{
    StringBuilder sb;
    VBIDE.VBComponent xlModule;
    VBIDE.VBProject prj;

    prj = wrkBook.VBProject;
    sb = new StringBuilder();

    // build string with module code
    sb.Append("Sub " + buttonName + "_Click()" + "\n");
    sb.Append("\t" + "msgbox \"" + buttonName + "\"\n"); // add your custom vba code here
    sb.Append("End Sub");

    // set an object for the new module to create
    xlModule = wrkBook.VBProject.VBComponents.Add(VBIDE.vbext_ComponentType.vbext_ct_StdModule);

    // add the macro to the spreadsheet
    xlModule.CodeModule.AddFromString(sb.ToString());
}

在知识库文章中找到此信息如何使用 Visual C# .NET 中的自动化功能创建 Excel 宏 http://support.microsoft.com/kb/303872/en

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

从 C# 以编程方式创建 Excel VBA 代码和按钮 的相关文章

  • 如何将不记名令牌发送到 ASP NET MVC 5 中的视图?

    我有一个 NET MVC and WEB API项目 我想打电话给WEB API controllers来自 javascript 但我没有找到将令牌发送到我的视图的方法 我想添加bearer token in Viewbag变量 使用以下
  • 为什么这个 oracle 批量插入不起作用?

    我正在尝试将一些数据批量插入到 oracle 数据库中 我按照文档中的示例进行操作 this DataBaseAccess new OracleConnection connString var dataAdapter new Oracle
  • WPF Dispatchertimer 延迟反应/冻结

    在我的 WPF 应用程序中 我使用 3 个不同的 DispatcherTimers 一种是用于显示当前时间 一种是每 5 秒运行一次数据库查询 第三个每 1 秒刷新一次自定义按钮的值 当我的程序运行时 有很多延迟 冻结 例如 时间开始正确计
  • 比较 LINQ to SQL 中的两个日期

    我有一个数据库 其中有一个名为会议的表 会议日期使用以下格式存储在此表中 May 2nd 2011 例如 格式为5 2 2011 我的要求是获取两个日期 例如 2011 年 4 月 25 日和 2011 年 5 月 2 日 之间的会议 并编
  • NHibernate IQueryable 集合作为 root 的属性

    我有一个根对象 它有一个集合属性 例如 I have a Shelf object that has Books Now public class Shelf public ICollection
  • & 运算符的含义是什么?

    在下面的代码中 Expression
  • boost::asio::io_service 是否保留处理程序的顺序?

    Does boost asio io service http www boost org doc libs release doc html boost asio reference io service html保证处理程序的调用顺序与
  • 多维数组和指向指针的指针

    创建多维数组时char a 10 10 根据我的书 它说你必须使用类似于char a 10 将数组传递给函数 为什么必须这样指定长度 您不是只是将双指针传递给 with 并且该双指针不是已经指向分配的内存吗 那么为什么参数不能是char a
  • 以编程方式运行 T4 文本模板

    有没有一种方法可以通过代码以编程方式运行 T4 文本模板 我正在制作一种自定义域特定语言 我希望相关的文本模板在用户每次保存时运行 目前 这就是我在 DSL 模型中所做的事情 protected override void OnDocume
  • 如何在Azure功能中添加razor视图文件?

    我正在创建一个应用程序 它是 azure 函数项目 我想在该项目中使用 Razor 视图 我应该在 azure 函数中使用任何模板引擎吗 得益于一些方面的进步剃刀之光项目 https github com toddams RazorLigh
  • 如何从Web JavaScript应用程序获取桌面C#程序中的变量

    我遇到一个问题 有两个应用程序 一种是 C 中的桌面应用程序 另一种是 javascript 中的 Web 应用程序 运行桌面应用程序中的一些变量或信息需要传输到Web应用程序 有谁知道如何解决这个问题 有人愿意提供更多细节来解决这个问题吗
  • 将授权标头添加到 Web 参考

    我正在尝试向客户端的网络服务发出请求 我不知道客户端的底层平台 我使用 添加 Web 引用 在 Visual Studio 2010 中使用了客户端的 WSDL 并生成了我的代理类 称为 ContactService 我现在需要将如下所示的
  • 执行存储过程时 ExecuteNonQuery() 返回 -1

    我正在尝试在 Visual Studio 中执行存储过程 下面给出 CREATE PROCEDURE dbo addStudent stuName varchar 50 address varchar 100 tel varchar 15
  • 为什么未到达的 try-catch 块会增加运行时间?

    我目前正在创建自己的容器库 但我已经看到无法访问 if 语句无效 try catch阻止增加运行时间 这是我的测试 Vector cpp template
  • 为什么必须通过 this 指针访问模板基类成员?

    如果下面的类不是模板 我可以简单地拥有x in the derived班级 但是 通过下面的代码 我have to use this gt x Why template
  • 使用 _Alignas 进行结构成员对齐

    我想知道以下问题 是新的吗 Alignas结盟 C11 中的说明符适用于结构成员吗 我一直假设这么多 但彻底阅读了 N1570 公开草案似乎表明对齐说明符不能 出现在一个说明符限定符列表 这就是我所期望的 如果得到支持的话 我已经读过几遍语
  • 在Framework 4.6项目中使用.net core DLL

    我已经在 net core 2 0 中构建了一个 DLL 现在我想在使用 net 4 6 1 框架的 WinForms 项目中使用它 我可以引用该 dll 但收到 System IO FileLoadException 表示找不到 Syst
  • asp.net mvc GET 请求上的 formcollection 应该为空

    我正在发布一个简单的操作 public void Login FormCollection formCollection 即使查询字符串值很少 formcollection Count is 0 是靠行为吗 FormCollection 使
  • DataGridView 捕获用户行选择

    我在处理选择时遇到问题DataGridView 我的网格视图包含一个金额列 表单上有一个文本框 应显示所选网格视图行的总数 因此 我需要在用户选择 取消选择 gridview 行时捕获事件并相应地计算 添加 减去 金额 我找到了两种方法 使
  • C#:如何处理乱序 TCP 数据包?

    请有人解释一下如何处理乱序数据包 我使用原始套接字来捕获数据包 并在数据包到来时解析它们 但其中一些数据包的顺序错误 例如 ID 标志 16390 PSH ACK 16535 PSH ACK 16638 确认 16640 PSH ACK 1

随机推荐

  • Express 中间件、next 和 Promise

    有一个非常简单的带处理程序的 Express 路由器 router get users userId roles roleId function req res next const roleId req params roleId res
  • 如何知道客户端是否已在套接字中终止

    假设 写完这段代码后我有一个已连接的套接字 if sd accept socket d struct sockaddr client addr alen lt 0 perror accept failed n exit 1 我如何在服务器端
  • 使用 jsdom 加载 ajax 应用程序

    我正在寻找一种解决方案来在服务器上引导客户端应用程序 用 Backbone js 编写 以便我可以为爬虫和非 js 消费者提供正确的内容 我一直在尝试使用 jsdom 和 Node js 来引导应用程序 并且可以加载基本模板内容 但应用程序
  • Sonarqube 6.7x 的安全插件

    我们正在使用 sonarqube 我们喜欢它的工作方式 我们正在尝试扩展 sonarqube 以增强安全性 我尝试为sonarqube 6 x找到一些安全插件来检测Java语言的漏洞 但我找不到任何插件 我想知道是否有任何插件可以查找 so
  • 如何检查麦克风是否可用于录音

    我正在开发一个 WPF 应用程序 需要录制用户的音频消息 我按照代码here http channel9 msdn com coding4fun articles NET Voice Recorder并且它工作正常 现在的问题是 如果它是台
  • 如何比较两个 OrderedDict 字典?

    如何比较两个 OrderedDict 字典 我的结构如下 dict a OrderedDict 1 4 2 5 3 3 4 5 5 4 6 4 7 4 8 3 9 4 dict b OrderedDict 1 4 2 2 3 1 4 4 5
  • 在音频分析中绘制频谱图

    我正在研究使用神经网络的语音识别 为此 我需要获取这些训练音频文件 wav 的频谱图 如何在 python 中获取这些频谱图 有很多方法可以做到这一点 最简单的方法是查看中提出的方法关于 Kaggle 竞赛TensorFlow 语音识别挑战
  • 按值对多维哈希进行排序并打印最高的

    我有一个存储的多维哈希 info 具有以下结构 info os id length foreach os keys info foreach id keys info os print os id gt info os id n if ke
  • 常量截断为整数

    下面的GO程序会报错 fft go 13 constant 6 28319 truncated to integer fft go 13 cannot use 7 k N type int as type float64 in assign
  • 如何在 php 中创建我的网站的日志文件? [关闭]

    很难说出这里问的是什么 这个问题是含糊的 模糊的 不完整的 过于宽泛的或修辞性的 无法以目前的形式得到合理的回答 如需帮助澄清此问题以便重新打开 访问帮助中心 help reopen questions 我想知道如何用 php 创建我的网站
  • UICollectionView 对陈旧数据的断言错误

    在尝试从我的集合视图中卸载一批图像 然后用另一批图像替换它们的过程中 我遇到了一个错误 其中 根据原始图像组或后续图像组是大于还是小于预期的替换图像 发生断言错误 表示 Assertion failure in UICollectionVi
  • CUDA 中的全局内存与共享内存

    我有两个 CUDA 内核可以计算类似的东西 一种是使用全局内存 myfun是一个设备函数 它从全局内存中读取大量数据并进行计算 第二个内核将该数据块从全局内存传输到共享内存 以便数据可以在块的不同线程之间共享 我使用全局内存的内核比使用共享
  • 从精明的边缘获取边界并删除图像的背景

    我正在尝试删除我正在尝试训练神经网络的图像的背景 我使用此处描述的方法运气不佳 如何从此类图像中删除背景 https stackoverflow com questions 29313667 how do i remove the back
  • 如何在 Bootstrap 模态中显示画布

    我创建了一个地图 您可以在其中通过 Javascript 预订自行车 用户应该 1 选择一个自行车站 绿色站 可以使用自行车 2 点击一个按钮 预留按钮 3 登录画布 在模式中 页面在这里 http p4547 phpnet org bik
  • 将 Android 手机中的图像和视频获取到自定义图库中

    我正在尝试创建一个自定义图库 允许用户从其 Android 设备上包含的所有照片和视频中进行挑选 我知道如何创建仅包含照片和视频的图库 但如果我想将两者结合起来 我该怎么做 我认为问题归结于我如何创建光标 为了选择所有视频 我这样创建了光标
  • 如何将数据从隔离作用域传递到父作用域?

    我对使用 AngularJS 相当陌生 我想做的是创建一个指令并从其中的父作用域调用函数 我能够完成此任务 但我似乎无法弄清楚如何通过表达式将数据从隔离范围传递到父范围 Angular 开发者指南中对此的解释有点令人困惑 该指令 app d
  • Nodemon - 排除文件

    我想从 NodeMon 的监控中排除一些特定文件 我怎样才能做到这一点 我现有的配置 nodemon all script app js options watchedExtensions js 为了让 NodeMon 忽略监控中的一堆文件
  • 使用 jQuery 以编程方式单击 链接

    我知道这个问题以前曾被问过 但在网上搜索后我似乎找不到直接的答案 the HTML a href index php jQuery 这两个都不起作用 myAnchor click or myAnchor trigger click 实现这一
  • 使用 SlimDX 设置常量缓冲区

    我一直在关注 Microsoft Direct3D11 教程 但使用 C 和 SlimDX 我正在尝试设置常量缓冲区 但不确定如何创建或设置它 我只是尝试使用常量缓冲区设置三个矩阵 世界 视图和投影 但我在每个阶段 创建 数据输入并将其传递
  • 从 C# 以编程方式创建 Excel VBA 代码和按钮

    我正在使用简单的方法 该方法将我的 DataGridView 保存到 Excel 文档 仅 1 个工作表 中 并添加 VBA 代码和一个用于运行 VBA 代码的按钮 public void SaveFile string filePath