使用二次封装的Excel COM 组件操作Excel\WPS ET中的区域、行和列

数据太多导致性能差?操作复杂难以维护?别担心,这篇文章将帮你解决这些问题!

开源项目地址:MudTools OfficeInterop

本系统文章适用于需要对 Excel 单元格区域进行操作的开发者,解决以下问题:

  • 如何高效操作单元格区域
  • 如何处理行和列数据
  • 如何简化数据读写操作
  • 如何避免常见的性能问题

"单元格虽小,五脏俱全。掌握好每一个单元格,就能构建出强大的数据世界!" - 某位Excel大师

IExcelRange - 单元格区域核心接口

IExcelRange是操作 Excel 单元格区域的核心接口,继承自 [ICoreRange]接口。它就像你的"画笔",让你能够在Excel画布上自由挥洒!

基础操作

获取单元格区域

csharp 复制代码
// 通过索引获取单元格
var cellA1 = worksheet.Cells[1, 1];

// 通过地址获取区域
var rangeA1B10 = worksheet.Range("A1:B10");

// 通过行列获取区域
var range = worksheet.Range("A1", "B10");

读写单元格值

csharp 复制代码
// 写入值
worksheet.Cells[1, 1].Value = "Hello World";
worksheet.Range("A1").Value = 123;
worksheet.Range("B1").Value = DateTime.Now;

// 读取值
var value = worksheet.Cells[1, 1].Value;
var text = worksheet.Cells[1, 1].Text;

公式操作

csharp 复制代码
// 设置公式
worksheet.Cells[1, 3].Formula = "=A1+B1";

// 设置R1C1引用样式公式
worksheet.Cells[2, 3].FormulaR1C1 = "=RC[-2]+RC[-1]";

// 数组公式
worksheet.Range("D1:D10").FormulaArray = "=A1:A10*B1:B10";

区域选择与导航

csharp 复制代码
// 获取当前区域
var currentRegion = worksheet.Cells[1, 1].CurrentRegion;

// 获取整行/整列
var entireRow = worksheet.Cells[1, 1].EntireRow;
var entireColumn = worksheet.Cells[1, 1].EntireColumn;

// 偏移操作
var offsetCell = worksheet.Cells[1, 1].Offset(1, 1); // 向下向右偏移1个单元格

// 区域交集与并集
var range1 = worksheet.Range("A1:B10");
var range2 = worksheet.Range("B5:C15");
var intersection = range1.Intersect(range2);
var union = range1.Union(range2);

数据操作

复制与粘贴

csharp 复制代码
// 复制区域
worksheet.Range("A1:B10").Copy();

// 复制到指定区域
worksheet.Range("A1:B10").Copy(worksheet.Range("D1"));

// 特殊粘贴
worksheet.Range("A1:B10").Copy();
worksheet.Range("D1").PasteSpecial(XlPasteType.xlPasteValues);

// 带格式复制
worksheet.Range("A1:B10").CopyAndPaste("D1", XlPasteType.xlPasteAll);

插入与删除

csharp 复制代码
// 插入单元格
worksheet.Range("A1").Insert(XlDirection.xlDown);

// 删除单元格
worksheet.Range("A1").Delete(XlDirection.xlToLeft);

// 清除内容
worksheet.Range("A1:B10").ClearContents();
worksheet.Range("A1:B10").Clear();

格式设置

基础格式

csharp 复制代码
var range = worksheet.Range("A1:B10");

// 设置背景色
range.Interior.Color = Color.LightBlue;

// 设置字体
range.Font.Bold = true;
range.Font.Size = 12;
range.Font.Name = "Arial";

// 设置对齐方式
range.HorizontalAlignment = XlHAlign.xlHAlignCenter;
range.VerticalAlignment = XlVAlign.xlVAlignMiddle;

// 设置边框
range.BorderAround(XlLineStyle.xlContinuous, XlBorderWeight.xlThin);

数字格式

csharp 复制代码
// 设置数字格式
worksheet.Range("A1").NumberFormat = "0.00";
worksheet.Range("B1").NumberFormat = "#,##0.00";
worksheet.Range("C1").NumberFormat = "yyyy/mm/dd";
worksheet.Range("D1").NumberFormat = "[RED]0.00";

行高与列宽

csharp 复制代码
// 设置行高
worksheet.Rows.RowHeight = 20;

// 设置列宽
worksheet.Columns.ColumnWidth = 15;

// 自动调整
worksheet.Columns.AutoFit();
worksheet.Rows.AutoFit();

查找与替换

csharp 复制代码
// 查找
var foundCell = worksheet.Cells.Find("查找内容");

// 查找下一个
var nextCell = worksheet.Cells.FindNext(foundCell);

// 替换
worksheet.Cells.Replace("旧内容", "新内容");

// 特殊单元格查找
var emptyCells = worksheet.Cells.SpecialCells(XlCellType.xlCellTypeBlanks);
var constants = worksheet.Cells.SpecialCells(XlCellType.xlCellTypeConstants);

高级操作

数据筛选

csharp 复制代码
// 自动筛选
worksheet.Range("A1:D10").AutoFilter();

// 移除筛选
worksheet.Range("A1:D10").RemoveAutoFilter();

排序

csharp 复制代码
// 排序
worksheet.Range("A1:D10").Sort(
    key1: worksheet.Range("B1"),
    order1: XlSortOrder.xlAscending,
    header: XlYesNoGuess.xlYes
);

合并与拆分

csharp 复制代码
// 合并单元格
worksheet.Range("A1:B2").Merge();

// 取消合并
worksheet.Range("A1:B2").UnMerge();

注释操作

csharp 复制代码
// 添加注释
worksheet.Cells[1, 1].AddComment("这是注释");

// 获取注释文本
var commentText = worksheet.Cells[1, 1].CommentText;

// 删除注释
worksheet.Cells[1, 1].DeleteComment();

IExcelRows - 行操作接口

IExcelRows继承自 IExcelRange,专门用于处理行相关操作。它就像你的"行军指挥官",帮你整齐划一地管理每一行数据!

行操作示例

csharp 复制代码
// 获取所有行
var allRows = worksheet.Rows;

// 获取特定行
var row5 = worksheet.Rows[5];

// 获取行范围
var rows5To10 = worksheet.Range("5:10").Rows;

// 行操作
worksheet.Rows[1].RowHeight = 25;
worksheet.Rows[2].Hidden = true;
worksheet.Rows[3].Insert();
worksheet.Rows[4].Delete();

批量行操作

csharp 复制代码
// 选择多行
var selectedRows = worksheet.Range("2:5").Rows;

// 设置行高
selectedRows.RowHeight = 20;

// 隐藏行
selectedRows.Hidden = true;

// 自动调整行高
selectedRows.AutoFit();

IExcelColumns - 列操作接口

IExcelColumns继承自 IExcelRange,专门用于处理列相关操作。它是你的"列队教练",帮你把每一列都训练得井井有条!

列操作示例

csharp 复制代码
// 获取所有列
var allColumns = worksheet.Columns;

// 获取特定列
var columnA = worksheet.Columns[1];
var columnB = worksheet.Columns["B"];

// 获取列范围
var columnsAToD = worksheet.Range("A:D").Columns;

// 列操作
worksheet.Columns[1].ColumnWidth = 15;
worksheet.Columns[2].Hidden = true;
worksheet.Columns[3].Insert();
worksheet.Columns[4].Delete();

批量列操作

csharp 复制代码
// 选择多列
var selectedColumns = worksheet.Range("B:E").Columns;

// 设置列宽
selectedColumns.ColumnWidth = 12;

// 隐藏列
selectedColumns.Hidden = true;

// 自动调整列宽
selectedColumns.AutoFit();

性能优化技巧

处理大量数据时,性能优化至关重要。以下是一些实用的技巧:

批量操作

csharp 复制代码
// 禁用屏幕更新和自动计算以提高性能
excelApp.ScreenUpdating = false;
excelApp.Calculation = XlCalculation.xlCalculationManual;

try
{
    // 执行批量操作
    var range = worksheet.Range("A1:Z1000");
    range.Value = "批量数据";
}
finally
{
    // 恢复设置
    excelApp.ScreenUpdating = true;
    excelApp.Calculation = XlCalculation.xlCalculationAutomatic;
}

数组操作

csharp 复制代码
// 使用二维数组进行批量数据操作
object[,] data = new object[1000, 26];
for (int row = 0; row < 1000; row++)
{
    for (int col = 0; col < 26; col++)
    {
        data[row, col] = $"数据{row},{col}";
    }
}

// 一次性写入所有数据
worksheet.Range("A1:Z1000").Value = data;

实际应用示例

数据导入示例

csharp 复制代码
// 从 DataTable 导入数据到 Excel
using var excelApp = ExcelFactory.BlankWorkbook();
var worksheet = excelApp.ActiveSheet;

// 假设有一个 DataTable
DataTable dataTable = GetDataFromDatabase();

// 将数据复制到 Excel
worksheet.Cells[1, 1].CopyFromDataTable(dataTable, "A1", true);

// 格式化标题行
var headerRange = worksheet.Range($"A1:{GetColumnLetter(dataTable.Columns.Count)}1");
headerRange.Font.Bold = true;
headerRange.Interior.Color = Color.LightGray;

// 自动调整列宽
worksheet.Columns.AutoFit();

// 保存文件
excelApp.ActiveWorkbook.SaveAs(@"C:\Output\DataReport.xlsx");

数据导出示例

csharp 复制代码
// 从 Excel 导出数据到数组
using var excelApp = ExcelFactory.Open(@"C:\Data\InputData.xlsx");
var worksheet = excelApp.ActiveSheet;

// 获取数据区域
var dataRange = worksheet.UsedRange;

// 读取数据到数组
object[,] values = dataRange.Value as object[,];

// 处理数据
for (int row = 1; row <= values.GetLength(0); row++)
{
    for (int col = 1; col <= values.GetLength(1); col++)
    {
        Console.WriteLine($"[{row},{col}] = {values[row, col]}");
    }
}

总结

通过使用 IExcelRange、IExcelRows 和 IExcelColumns 接口,开发者可以:

  1. 灵活操作 Excel 单元格区域
  2. 高效处理行和列数据
  3. 简化格式设置和数据操作
  4. 避免常见的性能问题
  5. 提高代码可读性和可维护性

这些接口提供了对 Excel 单元格操作的全面封装,使开发者能够专注于业务逻辑而不是底层的 COM 交互细节。

掌握了这些技能,你就能轻松应对各种Excel数据处理任务了!继续阅读后续指南,解锁更多Excel自动化技能!

相关推荐
qq_452396231 天前
第七篇:《数据驱动测试:利用Excel/JSON/CSV管理测试数据》
json·excel
是吗乔治1 天前
vuetify实现excel表格粘贴效果
前端·vue.js·vue·excel
herinspace2 天前
如何解决管家婆辉煌零售POS中显示的原价和售价不一致?
网络·人工智能·学习·excel·语音识别·零售
l1t2 天前
duckdb excel插件和rusty_sheet插件在python中的不同表现
开发语言·python·excel
agilearchitect2 天前
Matlab导入Excel表格教程:从基础到进阶全攻略
数据结构·其他·matlab·excel
AC赳赳老秦2 天前
OpenClaw与Excel联动:批量读取/写入数据,生成可视化报表
开发语言·python·excel·产品经理·策略模式·deepseek·openclaw
做cv的小昊2 天前
【TJU】研究生应用统计学课程笔记(4)——第二章 参数估计(2.1 矩估计和极大似然估计、2.2估计量的优良性原则)
人工智能·笔记·考研·数学建模·数据分析·excel·概率论
火星papa2 天前
C# 【通过NPIO读写Excel表】
c#·excel·npoi
葡萄城技术团队2 天前
Excel公式前的“@”符号:是Bug还是黑科技?
科技·bug·excel
爱折磨键盘的大鹏2 天前
若依框架实现Excel动态下拉(查库)
excel