Bumblebee/Classes/ExApp.cs
Flow diagram
-
创建 ExApp 实例 (Create ExApp Instance)
- 对应构造函数:
public ExApp()
- 对应构造函数:
-
获取或创建 Excel 应用程序 (Get or Create Excel Application)
-
在构造函数中:
this.ComObj = (XL.Application)Marshal2.GetActiveObject("Excel.Application"); // 或 this.ComObj = new XL.Application();
-
-
工作簿操作 (Workbook Operations)
- LoadWorkbook:
public ExWorkbook LoadWorkbook(string filePath)
- GetWorkbooks:
public List<ExWorkbook> GetWorkbooks()
- GetWorkbook:
public ExWorkbook GetWorkbook(string name)
- GetActiveWorkbook:
public ExWorkbook GetActiveWorkbook()
- LoadWorkbook:
-
工作表操作 (Worksheet Operations)
- GetWorksheet:
public ExWorksheet GetWorksheet(string name)
- GetWorksheets:
public List<ExWorksheet> GetWorksheets()
- GetActiveWorksheet:
public ExWorksheet GetActiveWorksheet()
- GetWorksheet:
-
其他操作 (Other Operations)
- Freeze:
public void Freeze()
- UnFreeze:
public void UnFreeze()
- Freeze:
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 应用程序、工作簿和工作表。下面是对代码的详细解释:
-
命名空间和引用:
- 代码位于
Bumblebee
命名空间中。 - 使用了
Microsoft.Office.Interop.Excel
命名空间,别名为XL
。
- 代码位于
-
类成员:
ComObj
: 类型为XL.Application
,表示 Excel 应用程序对象。
-
构造函数:
- 默认构造函数:尝试获取已运行的 Excel 实例,如果失败则创建新实例。
- 复制构造函数:从另一个
ExApp
对象创建新实例。 - 参数化构造函数:使用给定的
XL.Application
对象创建实例。
-
方法:
Freeze()
和UnFreeze()
: 控制 Excel 的屏幕更新。- 工作簿相关方法:
LoadWorkbook()
: 打开指定路径的工作簿。GetWorkbooks()
: 获取所有打开的工作簿。GetWorkbook()
: 根据名称获取特定工作簿。GetActiveWorkbook()
: 获取当前活动的工作簿。
- 工作表相关方法:
GetWorksheet()
: 根据名称获取特定工作表。GetWorksheets()
: 获取所有工作表。GetActiveWorksheet()
: 获取当前活动的工作表。
-
重写方法:
ToString()
: 返回类的字符串表示。
关键点:
- 错误处理:使用 try-catch 处理获取已运行 Excel 实例时可能出现的错误。
- 兼容性:代码考虑了 Excel 应用程序可能未打开或没有活动工作簿的情况。
- 封装:将 Excel 操作封装在易用的方法中,简化了 Excel 自动化的过程。
- 灵活性:提供了多种方式来获取和操作工作簿和工作表。
学习建议:
- 深入了解 Microsoft.Office.Interop.Excel 命名空间和 COM 互操作。
- 研究 Excel 对象模型,了解 Application、Workbook、Worksheet 等对象的关系和属性。
- 练习使用这个类来自动化 Excel 操作,如创建、打开、保存工作簿,修改单元格等。
- 注意内存管理和性能优化,特别是在处理大型 Excel 文件时。
- 考虑添加错误处理和日志记录,以提高代码的健壮性。