使用二次封装的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自动化技能!

相关推荐
骆驼爱记录3 小时前
Word通配符技巧:高效文档处理指南
开发语言·c#·自动化·word·excel·wps·新人首发
AI刀刀4 小时前
豆包怎么生成excel
ai·excel·豆包·deepseek·ds随心转
骆驼爱记录4 小时前
Word表格题注自动设置全攻略
开发语言·c#·自动化·word·excel·wps·新人首发
天荒地老笑话么5 小时前
Vim核心快捷键与运维实战指南
运维·vim·excel
开开心心就好1 天前
键盘改键工具免安装,自定义键位屏蔽误触
java·网络·windows·随机森林·计算机外设·电脑·excel
fqbqrr1 天前
2601Mfc,自动化excel
自动化·excel·mfc
tlwlmy1 天前
python excel图片批量导出
开发语言·python·excel
TracyDemo2 天前
excel 透视图怎么进行删除透视图
excel
骆驼爱记录2 天前
Excel邮件合并嵌入图片技巧
自动化·word·excel·wps·新人首发
avi91112 天前
Unity Data Excel读取方法+踩坑记;和WPS Excel的一些命令
unity·游戏引擎·excel·wps·data