VSTO学习之路:学习使用Epplus——读写VBA代码

创建xlsm工作簿:

宏工作簿,必须有VBProject对象,至少要有一个工作表

1 string path = @"E:\studyvs\open xml\test.xlsm";
2 var package = new ExcelPackage();
3 package.Workbook.Worksheets.Add("Sheet1");
4 //创建工程对象
5 package.Workbook.CreateVBAProject();
6 //保存工作簿
7 package.SaveAs(new FileInfo(path));
8 System.Windows.Forms.MessageBox.Show("创建成功");

向宏文件写入代码:

 1 string path = @"E:\studyvs\open xml\test.xlsm";
 2 var package = new ExcelPackage();
 3 package.Workbook.Worksheets.Add("Sheet1");
 4 //创建工程对象
 5 package.Workbook.CreateVBAProject();
 6 //也可以using OfficeOpenXml.VBA
 7 OfficeOpenXml.VBA.ExcelVbaProject proj = package.Workbook.VbaProject;
 8 //sheet1工作表模块
 9 OfficeOpenXml.VBA.ExcelVBAModule sheetmodule =proj.Modules["Sheet1"];
10 //为sheet1模块命名,和工作表名称一致
11 sheetmodule.Name = "sheet1";
12 sheetmodule.Code += "\r\nPrivate Sub Worksheet_SelectionChange(ByVal Target As Range)";
13 sheetmodule.Code += "\r\nMsgBox(\"Test of the VBA Feature!\")\r\nEnd Sub\r\n";
14
15
16 //工作簿模块
17 OfficeOpenXml.VBA.ExcelVBAModule workbookmodule = package.Workbook.CodeModule;
18 workbookmodule.Name = "workbook";
19 //给工作簿模块添加代码
20 workbookmodule.Code += "\r\nPrivate Sub Workbook_Open()\r\nsheet1.Cells(1,1).Value = \"VBA test\"";
21 workbookmodule.Code += "\r\nMsgBox \"VBA is running!\"\r\nEnd Sub";
22
23 //创建一个标准模块
24 var m = package.Workbook.VbaProject.Modules.AddModule("Module1");
25 m.Code += "Public Sub Test(param1 as string)\r\n\r\nEnd sub\r\n";
26 m.Code += "Public Function functest() As String\r\n\r\nEnd Function\r\n";
27
28 //创建两个类模块
29 var c = package.Workbook.VbaProject.Modules.AddClass("Class1", false);
30 c.Code += "Private Sub Class_Initialize()\r\n\r\nEnd Sub\r\nPrivate Sub Class_Terminate()\r\n\r\nEnd Sub";
31 var c2 = package.Workbook.VbaProject.Modules.AddClass("Class2", true);
32 c2.Code += "Private Sub Class_Initialize()\r\n\r\nEnd Sub\r\nPrivate Sub Class_Terminate()\r\n\r\nEnd Sub";
33
34 //设置工程的访问密码
35 proj.Protection.SetPassword("EPPlus");
36
37 //保存工作簿
38 package.SaveAs(new FileInfo(path));
39 System.Windows.Forms.MessageBox.Show("写入成功");

对于已存在的test.xlsm文件,另存为test2.xlsm

1 string path = @"E:\studyvs\open xml\test.xlsm";
2 var package = new ExcelPackage(new FileInfo(path));
3 package.SaveAs(new FileInfo(@"E:\studyvs\open xml\test2.xlsm"));

读取test.xlsm中各个模块的代码,写入文本文件

1 string path = @"E:\studyvs\open xml\test.xlsm";
2 var package = new ExcelPackage(new FileInfo(path));
3 foreach (var module in package.Workbook.VbaProject.Modules)
4 {
5     File.WriteAllText(string.Format(@"E:\studyvs\open xml\{0}.txt", module.Name), module.Code);
6 }
7
8 System.Windows.Forms.MessageBox.Show("ok");
时间: 2024-12-20 18:28:11

VSTO学习之路:学习使用Epplus——读写VBA代码的相关文章

Android开发学习之路-让注解帮你简化代码,彻底抛弃findViewById

本文主要是记录注解的使用的学习笔记,如有错误请提出. 在通常的情况下,我们在Activity中有一个View,我们要获得这个View的实例是要通过findViewById这个方法,然后这个方法返回的是一个Object类型,我们还需要进行强制的类型转换,但是相信很多人都遇到过,当我们的一个布局中有很多个控件的时候,每一个控件都要进行上面的这个操作其实是很烦躁的,特别是强制类型转换,即使是用Alt+Enter,多按几次都累了.而今天要用的是通过注解的方式来简化这一个复杂的步骤,在我们编写好相应的代码

多线程学习之路-学习wait和notify

package threadtest; import java.util.LinkedList; import java.util.concurrent.TimeUnit; import java.util.concurrent.atomic.AtomicInteger; public class QueueTest01 { private LinkedList<Object> list = new LinkedList<Object>(); private AtomicInteg

我的IOS学习之路(一):使用代码创建UI界面

此实例为使用代码动态的删除和添加标签(Label) 主要列举视图控制器文件,详见代码 1 #import "FCViewController.h" 2 3 @interface FCViewController () 4 @property (strong, nonatomic) NSMutableArray *Labels; 5 @end 6 7 @implementation FCViewController 8 int nextY = 40; 9 - (void)viewDidL

(转)如何学习Java技术?谈Java学习之路

51CTO编者注:这篇文章已经是有数年“网龄”的老文,不过在今天看来仍然经典.如何学习Java?本篇文章可以说也是面对编程初学者的一篇指导文章,其中对于如何学习Java的步骤的介绍,很多也适用于开发领域其他技能的学习. [在原先<学好Java之我见>的基础上重新整理而成] Java - 近10年来计算机软件发展过程中的传奇,其在众多开发者心中的地位就如“屠龙刀”.“倚天剑”. Java是个平台,我只想说说我对学好Java的一点看法,希望对初学者有所帮助. 1. 思考一下 学习Java之前,先别

kafka学习之路(二)——提高

kafka学习之路(二)--提高 消息发送流程 因为Kafka内在就是分布式的,一个Kafka集群通常包括多个代理.为了均衡负载,将话题分成多个分区,每个代理存储一或多个分区.多个生产者和消费者能够同时生产和获取消息.     过程: 1.Producer根据指定的partition方法(round-robin.hash等),将消息发布到指定topic的partition里面 2.kafka集群接收到Producer发过来的消息后,将其持久化到硬盘,并保留消息指定时长(可配置),而不关注消息是否

linux学习之路之bash及其特性

我们知道当我们用鼠标点击,或输入一个命令,系统就玩帮我们完成一个任务,那么当我们点击一个链接时,系统由是如何知道要去完成相应的操作呢?这是因为通过shell来完成的. 那么什么是shell呢? shell就是用户和操作系统之间的一个接口,通过这个接口shell接受来自用户的命令,并调用相应的应用程序来呼叫kernel来处理相应的工作. 在linux系统上面存放着多种类型的shell,这些shell存放在/etc/shells文件里,默认RedHat使用的shell为bash 下面介绍一些bash

linux学习之路之磁盘阵列RAID及硬件RAID和软件RAID的区别

我们知道单个磁盘存储数据的容量是有限的,为了让磁盘的容量增大,我们可以将多个较小的磁盘组合在一起,形成一个较大的磁盘装置,这就是RAID(独立式磁盘阵列),RAID不仅可以提高数据的存储容量,也可以提高数据保护功能,不同级别的RAID,所提供的的功能各不一样. RAID常见的级别有RAID0,RAID1,RAID5,RAID10,RAID01,RAID5,RAID50 下面逐个介绍这些级别的工作原理. RAID0:首先将磁盘分成等量的数据块(CHUNK),然后在将存储的数据切分成符合CHUNK大

C++学习之路,漫长而遥远

一.C/C++语言 如果你的基础很差, 建议不要一开始就学C++语言,从C开始学起,对程序有个初步的认识,循序渐进.C语言的书嘛,先买一本 300 页以内的,把书中的每一个例子都通过键盘敲打进去到 Visual studio里面去,然后单步执行,逐行调试去看各个变量的值.或者自行添加一些printf语句去输出变量的值.这样当你看完一本书后, 你就有编写小程序的感觉了. 记住,千万不要偷懒,不敲进去,自以为聪明, 能看懂, 或者直接从光盘复制.偷懒的代价是会花费更多的时间学习,最后还没有学会,给自

Python 学习之路(三)

Python 学习之路(三) 以下所用的是Python 3.6 一.集合部分 集合是一个无序的,不重复的数据集合,主要用来去重,以及关系测试:交集,差集,并集等 1.1 关系操作 1.1.1 列表去重 可以给列表去重,例如: 1 set_demo = [1,2,3,4,5,3,2,1] # 列表 2 set_demo = set(set_demo) # 转换成集合,来去重 3 print(set_demo) 1.1.2 取交集 intersection()方法 可以获得两个集合的交集部分,例如: