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

Bumblebee/Classes/ExApp.cs

Flow diagram

成功 / Success
失败 / Failure
工作簿操作
Workbook Operations
工作表操作
Worksheet Operations
其他操作
Other Operations
开始 / Start
创建 ExApp 实例
Create ExApp Instance
获取或创建
Excel 应用程序
Get or Create
Excel Application
Excel 应用程序就绪
Excel Application Ready
抛出异常
Throw Exception
选择操作类型
Choose Operation Type
工作簿操作
Workbook Operations
工作表操作
Worksheet Operations
其他操作
Other Operations
加载工作簿
LoadWorkbook
获取所有工作簿
GetWorkbooks
获取特定工作簿
GetWorkbook
获取活动工作簿
GetActiveWorkbook
获取特定工作表
GetWorksheet
获取所有工作表
GetWorksheets
获取活动工作表
GetActiveWorksheet
冻结屏幕
Freeze
解冻屏幕
UnFreeze
完成工作簿操作
Workbook Operations Completed
完成工作表操作
Worksheet Operations Completed
完成其他操作
Other Operations Completed
结束 / End
  1. 创建 ExApp 实例 (Create ExApp Instance)

    • 对应构造函数:public ExApp()
  2. 获取或创建 Excel 应用程序 (Get or Create Excel Application)

    • 在构造函数中:

      this.ComObj = (XL.Application)Marshal2.GetActiveObject("Excel.Application");
      // 或
      this.ComObj = new XL.Application();
      
  3. 工作簿操作 (Workbook Operations)

    • LoadWorkbook: public ExWorkbook LoadWorkbook(string filePath)
    • GetWorkbooks: public List<ExWorkbook> GetWorkbooks()
    • GetWorkbook: public ExWorkbook GetWorkbook(string name)
    • GetActiveWorkbook: public ExWorkbook GetActiveWorkbook()
  4. 工作表操作 (Worksheet Operations)

    • GetWorksheet: public ExWorksheet GetWorksheet(string name)
    • GetWorksheets: public List<ExWorksheet> GetWorksheets()
    • GetActiveWorksheet: public ExWorksheet GetActiveWorksheet()
  5. 其他操作 (Other Operations)

    • Freeze: public void Freeze()
    • UnFreeze: public void UnFreeze()

Code

using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

// 使用别名 XL 来简化 Microsoft.Office.Interop.Excel 的引用
using XL = Microsoft.Office.Interop.Excel;

namespace Bumblebee
{
    /// <summary>
    /// 封装 Excel 应用程序的类,提供对 Excel 的各种操作
    /// </summary>
    public class ExApp
    {
        #region members

        // Excel 应用程序对象
        public XL.Application ComObj = null;

        #endregion

        #region constructors

        /// <summary>
        /// 默认构造函数:尝试获取已运行的 Excel 实例,如果失败则创建新实例
        /// </summary>
        public ExApp()
        {
            try
            { 
                // 尝试获取已经运行的 Excel 实例
                this.ComObj = (XL.Application)Marshal2.GetActiveObject("Excel.Application"); 
            }
            catch (Exception e)
            {
                // 如果没有运行的实例,创建一个新的
                this.ComObj = new XL.Application();
            }
            // 如果没有活动的工作簿,添加一个新的
            if (this.ComObj.ActiveWorkbook == null) this.ComObj.Workbooks.Add();
            // 确保 Excel 窗口可见
            if(!this.ComObj.Visible) this.ComObj.Visible = true;
        }

        /// <summary>
        /// 复制构造函数:从另一个 ExApp 对象创建新实例
        /// </summary>
        /// <param name="exApp">现有的 ExApp 对象</param>
        public ExApp(ExApp exApp)
        {
            this.ComObj = exApp.ComObj;
        }

        /// <summary>
        /// 参数化构造函数:使用给定的 Excel.Application 对象创建实例
        /// </summary>
        /// <param name="comObj">Excel.Application 对象</param>
        public ExApp(XL.Application comObj)
        {
            this.ComObj = comObj;
        }

        #endregion

        #region properties

        // 这里可以添加属性

        #endregion

        #region methods

        /// <summary>
        /// 暂停屏幕更新,提高性能
        /// </summary>
        public void Freeze()
        {
            this.ComObj.ScreenUpdating = false;
        }

        /// <summary>
        /// 恢复屏幕更新
        /// </summary>
        public void UnFreeze()
        {
            this.ComObj.ScreenUpdating = true;
        }

        #region workbooks

        /// <summary>
        /// 加载指定路径的工作簿
        /// </summary>
        /// <param name="filePath">工作簿文件路径</param>
        /// <returns>加载的工作簿对象</returns>
        public ExWorkbook LoadWorkbook(string filePath)
        {
            ExWorkbook workbook = new ExWorkbook(this.ComObj.Workbooks.Open(filePath));
            return workbook;
        }

        /// <summary>
        /// 获取所有打开的工作簿
        /// </summary>
        /// <returns>工作簿对象列表</returns>
        public List<ExWorkbook> GetWorkbooks()
        {
            List<ExWorkbook> output = new List<ExWorkbook>();
            foreach (XL.Workbook workbook in this.ComObj.Workbooks)
            {
                output.Add(new ExWorkbook(workbook));
            }
            return output;
        }

        /// <summary>
        /// 根据名称获取特定工作簿
        /// </summary>
        /// <param name="name">工作簿名称(不包括扩展名)</param>
        /// <returns>找到的工作簿对象,如果未找到则返回 null</returns>
        public ExWorkbook GetWorkbook(string name)
        {
            ExWorkbook output = new ExWorkbook();
            foreach (XL.Workbook workbook in this.ComObj.Workbooks)
            {
                string file = Path.ChangeExtension(workbook.Name, null);
                if (file == name)
                {
                    output.Set(workbook);
                    return output;
                }
            }
            return null;
        }

        /// <summary>
        /// 获取当前活动的工作簿
        /// </summary>
        /// <returns>活动工作簿对象</returns>
        public ExWorkbook GetActiveWorkbook()
        {
            ExWorkbook output = new ExWorkbook();
            if (this.ComObj.Workbooks.Count < 1)
            {
                output.Set(this.ComObj.Workbooks.Add());
            }
            else
            {
                output.Set(this.ComObj.ActiveWorkbook);
            }
            return output;
        }

        #endregion

        #region worksheets

        /// <summary>
        /// 根据名称获取特定工作表
        /// </summary>
        /// <param name="name">工作表名称</param>
        /// <returns>找到的工作表对象,如果未找到则返回 null</returns>
        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;
                }
            }
            return null;
        }

        /// <summary>
        /// 获取所有工作表
        /// </summary>
        /// <returns>工作表对象列表</returns>
        public List<ExWorksheet> GetWorksheets()
        {
            List<ExWorksheet> worksheets = new List<ExWorksheet>();
            foreach (XL.Worksheet sheet in this.ComObj.Worksheets)
            {
                worksheets.Add(new ExWorksheet(sheet));
            }
            return worksheets;
        }

        /// <summary>
        /// 获取当前活动的工作表
        /// </summary>
        /// <returns>活动工作表对象</returns>
        public ExWorksheet GetActiveWorksheet()
        {
            ExWorksheet output = new ExWorksheet();
            if (this.ComObj.ActiveSheet == null)
            {
                XL.Workbook book = this.ComObj.Workbooks.Add();
                XL.Worksheet sheet = book.Worksheets.Add();
                output = new ExWorksheet(sheet);
            }
            else
            {
                output = new ExWorksheet(this.ComObj.ActiveSheet);
            }
            return output;
        }

        #endregion

        #endregion

        #region overrides

        /// <summary>
        /// 重写 ToString 方法,返回类的字符串表示
        /// </summary>
        /// <returns>类的字符串表示</returns>
        public override string ToString()
        {
            return "Excel | App";
        }

        #endregion
    }
}

Description

这段代码定义了一个名为 ExApp 的类,它是对 Microsoft Excel 应用程序的封装。这个类提供了一系列方法来操作 Excel 应用程序、工作簿和工作表。下面是对代码的详细解释:

  1. 命名空间和引用:

    • 代码位于 Bumblebee 命名空间中。
    • 使用了 Microsoft.Office.Interop.Excel 命名空间,别名为 XL
  2. 类成员:

    • ComObj: 类型为 XL.Application,表示 Excel 应用程序对象。
  3. 构造函数:

    • 默认构造函数:尝试获取已运行的 Excel 实例,如果失败则创建新实例。
    • 复制构造函数:从另一个 ExApp 对象创建新实例。
    • 参数化构造函数:使用给定的 XL.Application 对象创建实例。
  4. 方法:

    • Freeze()UnFreeze(): 控制 Excel 的屏幕更新。
    • 工作簿相关方法:
      • LoadWorkbook(): 打开指定路径的工作簿。
      • GetWorkbooks(): 获取所有打开的工作簿。
      • GetWorkbook(): 根据名称获取特定工作簿。
      • GetActiveWorkbook(): 获取当前活动的工作簿。
    • 工作表相关方法:
      • GetWorksheet(): 根据名称获取特定工作表。
      • GetWorksheets(): 获取所有工作表。
      • GetActiveWorksheet(): 获取当前活动的工作表。
  5. 重写方法:

    • ToString(): 返回类的字符串表示。

关键点:

  1. 错误处理:使用 try-catch 处理获取已运行 Excel 实例时可能出现的错误。
  2. 兼容性:代码考虑了 Excel 应用程序可能未打开或没有活动工作簿的情况。
  3. 封装:将 Excel 操作封装在易用的方法中,简化了 Excel 自动化的过程。
  4. 灵活性:提供了多种方式来获取和操作工作簿和工作表。

学习建议:

  1. 深入了解 Microsoft.Office.Interop.Excel 命名空间和 COM 互操作。
  2. 研究 Excel 对象模型,了解 Application、Workbook、Worksheet 等对象的关系和属性。
  3. 练习使用这个类来自动化 Excel 操作,如创建、打开、保存工作簿,修改单元格等。
  4. 注意内存管理和性能优化,特别是在处理大型 Excel 文件时。
  5. 考虑添加错误处理和日志记录,以提高代码的健壮性。
  • 23
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

hmywillstronger

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值