【C#】【EXCEL】Bumblebee/Classes/ExWorkbook.cs

Bumblebee/Classes/ExWorkbook.cs

Flow diagram

默认构造函数
Default Constructor XL.Workbook 构造函数
XL.Workbook Constructor 复制构造函数
Copy Constructor 工作表操作
Worksheet Operations 宏操作
Macro Operations 其他操作
Other Operations 开始 / Start 创建 ExWorkbook 实例
Create ExWorkbook Instance 选择构造方法
Choose Constructor 创建空 ExWorkbook
Create Empty ExWorkbook 从 XL.Workbook 创建
Create from XL.Workbook 从现有 ExWorkbook 创建
Create from Existing ExWorkbook 选择操作类型
Choose Operation Type 管理工作表
Manage Worksheets 管理宏
Manage Macros 执行其他操作
Perform Other Operations 获取工作表
Get Worksheet 获取所有工作表
Get All Worksheets 获取活动工作表
Get Active Worksheet 添加宏
Add Macro 运行宏
Run Macro 设置 ComObj
Set ComObj 保存工作簿
Save Workbook 激活工作簿
Activate Workbook 调用 ToString 方法
Call ToString Method 结束 / End

这个流程图展示了ExWorkbook类的主要结构和一些关键方法的流程:

  1. ExWorkbook Class (ExWorkbook类)

    • Members (成员变量)
    • Constructors (构造函数)
    • Properties (属性)
    • Methods (方法)
  2. Members (成员变量):

    • ComObj: XL.Workbook
    • name: string
  3. Constructors (构造函数):

    • ExWorkbook()
    • ExWorkbook(XL.Workbook)
    • ExWorkbook(ExWorkbook)
  4. Properties (属性):

    • Name
    • ParentApp
  5. Methods (方法):

    • Set
    • Save
    • GetWorksheet
    • GetWorksheets
    • GetActiveWorksheet
    • Activate
    • AddMacro
    • RunMacro
  6. GetWorksheet方法流程:

    • Worksheet exists? (工作表是否存在?)
      • Yes: Return existing worksheet (返回现有工作表)
      • No: Create new worksheet (创建新工作表)
  7. AddMacro方法流程:

    • Module exists? (模块是否存在?)
      • Yes: Update existing module (更新现有模块)
      • No: Create new module (创建新模块)
  8. RunMacro方法:

    • Run macro by name (通过名称运行宏)

Description

  1. 构造函数 (Constructors):

    • ExWorkbook(): 默认构造函数,创建一个空的 ExWorkbook 对象。
    • ExWorkbook(XL.Workbook comObj): 使用现有的 Excel Workbook COM 对象创建 ExWorkbook。这允许我们封装现有的 Excel 工作簿。
    • ExWorkbook(ExWorkbook workbook): 复制构造函数,创建一个现有 ExWorkbook 的副本。
  2. 属性 (Properties):

    • Name: 获取工作簿的名称,不包含文件扩展名。使用 System.IO.Path.GetFileNameWithoutExtension() 方法移除扩展名。
    • ParentApp: 获取父应用程序 (Excel Application) 的封装对象 ExApp。
  3. 方法 (Methods):

    • Set(XL.Workbook comObject): 设置 COM 对象和名称。这允许在创建对象后更改其底层 Excel 工作簿。

    • Save(string filename, Extensions extension):

      保存工作簿到指定文件名和扩展名。

      // Save workbook with specified filename and extension

      csharp 复制代码
      this.ComObj.Application.DisplayAlerts = false;  // 禁用 Excel 警告
      this.ComObj.SaveAs(filename, extension.ToExcel());  // 保存文件
      this.ComObj.Application.DisplayAlerts = true;  // 重新启用 Excel 警告
      this.name = this.ComObj.Name;  // 更新工作簿名称
    • GetWorksheet(string name):

      获取指定名称的工作表,如果不存在则创建新的。

      // Get or create worksheet with specified name

      csharp 复制代码
      foreach (XL.Worksheet worksheet in this.ComObj.Worksheets)
      {
          if (worksheet.Name == name)
          {
              return new ExWorksheet(worksheet);
          }
      }
      // 如果不存在,创建新工作表
      XL.Worksheet newWorksheet = this.ComObj.Worksheets.Add();
      newWorksheet.Name = name;
      return new ExWorksheet(newWorksheet);
    • GetWorksheets():

      获取所有工作表的列表。

      // Get list of all worksheets

      csharp 复制代码
      List<ExWorksheet> worksheets = new List<ExWorksheet>();
      foreach (XL.Worksheet sheet in this.ComObj.Worksheets)
      {
          worksheets.Add(new ExWorksheet(sheet));
      }
      return worksheets;
    • GetActiveWorksheet():

      获取活动工作表,如果没有则创建新的。

      // Get active worksheet or create new if none exists

      csharp 复制代码
      if (this.ComObj.Worksheets.Count < 1)
      {
          return new ExWorksheet(this.ComObj.Worksheets.Add());
      }
      else
      {
          return new ExWorksheet(this.ComObj.ActiveSheet);
      }
    • Activate(): 激活当前工作簿。

    • AddMacro(string name, string content, VbModuleType type):

      添加或更新宏。

      // Add or update macro

      csharp 复制代码
      Vi.VBComponent component = null;
      bool isNew = true;
      // 检查是否存在同名组件
      foreach (Vi.VBComponent comp in this.ComObj.VBProject.VBComponents)
      {
          if (comp.Name == name)
          {
              isNew = false;
              component = comp;
              break;
          }
      }
      // 如果是新的,创建新组件
      if (isNew)
      {
          component = this.ComObj.VBProject.VBComponents.Add(type.ToExcel());
          component.Name = name;
      }
      // 清除现有代码并添加新代码
      component.CodeModule.DeleteLines(1, component.CodeModule.CountOfLines);
      component.CodeModule.AddFromString(content);
    • RunMacro(string name): 运行指定名称的宏。

  4. 重写方法 (Override):

    • ToString(): 重写 ToString 方法,返回包含工作簿名称的字符串表示。

这个类提供了一个强大的接口来操作 Excel 工作簿,包括管理工作表、保存文件、添加和运行宏等功能。它封装了许多底层的 Excel COM 操作,使得在 .NET 环境中处理 Excel 文件变得更加简单和直观。

Code

csharp 复制代码
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

using XL = Microsoft.Office.Interop.Excel;
using Vi = Microsoft.Vbe.Interop;

namespace Bumblebee
{
    public class ExWorkbook
    {
        #region 成员变量

        // Excel Workbook COM 对象
        public XL.Workbook ComObj = null;

        // 工作簿名称
        protected string name = "";

        #endregion

        #region 构造函数

        // 默认构造函数
        public ExWorkbook()
        {
        }

        // 使用 Excel Workbook COM 对象的构造函数
        public ExWorkbook(XL.Workbook comObj)
        {
            this.ComObj = comObj;
            this.name = comObj.Name;
        }

        // 复制构造函数
        public ExWorkbook(ExWorkbook workbook)
        {
            this.ComObj = workbook.ComObj;
            this.name = workbook.Name;
        }

        #endregion

        #region 属性

        // 获取工作簿名称(不包含扩展名)
        public virtual string Name
        {
            get { return System.IO.Path.GetFileNameWithoutExtension(name); }
        }

        // 获取父应用程序
        public virtual ExApp ParentApp
        {
            get { return new ExApp(this.ComObj.Application); }
        }

        #endregion

        #region 方法

        // 设置 COM 对象
        public void Set(XL.Workbook comObject)
        {
            this.ComObj = comObject;
            this.name = comObject.Name;
        }

        // 保存工作簿
        public void Save(string filename, Extensions extension)
        {
            // 禁用 Excel 警告弹窗
            this.ComObj.Application.DisplayAlerts = false;
            // 保存文件,使用指定的文件名和扩展名
            this.ComObj.SaveAs(filename, extension.ToExcel());
            // 重新启用 Excel 警告弹窗
            this.ComObj.Application.DisplayAlerts = true;
            // 更新工作簿名称
            this.name = this.ComObj.Name;
        }

        #region 工作表相关方法

        // 获取指定名称的工作表,如不存在则创建
        public ExWorksheet GetWorksheet(string name)
        {
            ExWorksheet output = new ExWorksheet();

            // 遍历所有工作表,查找指定名称的工作表
            foreach (XL.Worksheet worksheet in this.ComObj.Worksheets)
            {
                if (worksheet.Name == name)
                {
                    output = new ExWorksheet(worksheet);
                    return output;
                }
            }

            // 如果未找到指定名称的工作表,则创建新的
            XL.Worksheet worksheet1 = this.ComObj.Worksheets.Add();
            worksheet1.Name = name;

            return new ExWorksheet(worksheet1);
        }

        // 获取所有工作表
        public List<ExWorksheet> GetWorksheets()
        {
            List<ExWorksheet> worksheets = new List<ExWorksheet>();

            // 遍历所有工作表,创建 ExWorksheet 对象并添加到列表
            foreach (XL.Worksheet sheet in this.ComObj.Worksheets)
            {
                worksheets.Add(new ExWorksheet(sheet));
            }

            return worksheets;
        }

        // 获取活动工作表,如无则创建新的
        public ExWorksheet GetActiveWorksheet()
        {
            ExWorksheet output = new ExWorksheet();

            // 如果没有工作表,创建新的
            if (this.ComObj.Worksheets.Count < 1)
            {
                output = new ExWorksheet(this.ComObj.Worksheets.Add());
            }
            else
            {
                // 否则返回当前活动的工作表
                output = new ExWorksheet(this.ComObj.ActiveSheet);
            }

            return output;
        }

        #endregion

        // 激活工作簿
        public void Activate()
        {
            this.ComObj.Activate();
        }

        // 添加宏
        public void AddMacro(string name, string content, VbModuleType type)
        {
            Vi.VBComponent component = null;
            bool isNew = true;

            // 检查是否存在同名的 VB 组件
            foreach (Vi.VBComponent comp in this.ComObj.VBProject.VBComponents)
            {
                if (comp.Name == name)
                {
                    isNew = false;
                    component = comp;
                }
            }

            // 如果是新的宏,创建新的 VB 组件
            if (isNew)
            {
                component = this.ComObj.VBProject.VBComponents.Add(type.ToExcel());
                component.Name = name;
            }

            // 删除现有的代码
            component.CodeModule.DeleteLines(1, component.CodeModule.CountOfLines);
            // 添加新的代码内容
            component.CodeModule.AddFromString(content);
        }

        // 运行宏
        public void RunMacro(string name)
        {
            this.ComObj.Application.Run(name);
        }

        #endregion

        #region 重写方法

        // 重写 ToString 方法
        public override string ToString()
        {
            return "Workbook | " + Name;
        }

        #endregion
    }
}

这段代码现在包含了详细的中文注释,解释了每个方法和属性的功能。主要功能包括:

  1. 工作簿的创建和管理
  2. 工作表的操作(获取、创建、遍历)
  3. 保存工作簿
  4. 宏的添加和运行
  5. 工作簿的激活
相关推荐
GISer小浪花努力上岸13 分钟前
Java实现简易计算器功能(idea)
java·开发语言·intellij-idea
脚步的影子25 分钟前
Redis 入门 - C#|.NET Core客户端库六种选择
redis·c#·.netcore
Achanss28 分钟前
C#学习笔记 .NET Core使用注意事项
笔记·学习·c#
海海向前冲31 分钟前
设计模式 -- 单例设计模式
java·开发语言·设计模式
就这样很好88036 分钟前
排序算法总结
java·算法·排序算法
weixin_486681141 小时前
C++系列-STL中find相关的算法
java·c++·算法
学java的小菜鸟啊1 小时前
Java队列详细解释
java·开发语言·经验分享·python
帅得不敢出门1 小时前
安卓framework美化手势导航侧滑返回UI
android·java·ui·framework·安卓·开发·定制
我是真爱学JAVA1 小时前
第四章 类和对象 课后训练(1)
java·开发语言·算法
可儿·四系桜2 小时前
如何在Linux虚拟机上安装和配置JDK
java·linux·运维