本文将深入探讨Excel单元格和区域的各种操作技巧。单元格是Excel中最基本的单位,而区域操作则是处理批量数据的关键。掌握这些技术对于高效处理Excel数据至关重要。
学习目标
- 掌握单元格的多种引用方式
- 理解区域的创建和操作技巧
- 学习数据格式化和类型转换
- 掌握批量数据操作的最佳实践
关键概念
- 单元格(Cell):Excel中最基本的元素
- 区域(Range):一组连续的单元格
- 引用方式:A1表示法、行列号表示法
- 数据操作:读写、格式化、计算等
单元格基础操作
单元格是Excel中最基本的组成单位,正确的引用和操作单元格是Excel自动化的基础。
单元格引用方式
MudTools.OfficeInterop.Excel库提供了多种单元格引用方式,每种方式都有其适用场景。
csharp
/// <summary>
/// 单元格基础操作示例
/// 演示如何引用和操作单个单元格
/// </summary>
static void CellBasicOperationsExample()
{
Console.WriteLine("=== 单元格基础操作示例 ===");
try
{
// 创建Excel应用程序实例
using var excelApp = ExcelFactory.BlankWorkbook();
// 获取活动工作簿和工作表
var workbook = excelApp.ActiveWorkbook;
var worksheet = workbook.ActiveSheetWrap;
worksheet.Name = "单元格操作";
// 方法1:使用Range方法引用单元格
var cellA1 = worksheet.Range("A1");
cellA1.Value = "使用Range方法引用";
cellA1.Font.Bold = true;
cellA1.Interior.Color = Color.LightBlue;
// 方法2:使用索引器(字符串地址)引用单元格
var cellB1 = worksheet["B1"];
cellB1.Value = "使用字符串索引器引用";
cellB1.Font.Italic = true;
cellB1.Interior.Color = Color.LightGreen;
// 方法3:使用索引器(行列号)引用单元格
var cellC1 = worksheet[1, 3]; // 第1行,第3列(C列)
cellC1.Value = "使用行列号索引器引用";
cellC1.Font.Underline = XlUnderlineStyle.xlUnderlineStyleSingle;
cellC1.Interior.Color = Color.LightYellow;
// 方法4:使用Cells属性引用单元格
var cellD1 = worksheet.Cells[1, 4]; // 第1行,第4列(D列)
cellD1.Value = "使用Cells属性引用";
cellD1.Font.Color = Color.Red;
cellD1.Interior.Color = Color.LightPink;
// 相对引用示例
worksheet["A3"].Value = "相对引用示例";
var activeCell = worksheet["A3"];
var offsetCell = activeCell.Offset(1, 1); // 向下1行,向右1列
offsetCell.Value = "这是相对于A3的单元格";
offsetCell.Interior.Color = Color.LightGray;
// 保存工作簿
string fileName = $"CellBasicOperations_{DateTime.Now:yyyyMMddHHmmss}.xlsx";
workbook.SaveAs(fileName);
Console.WriteLine($"✓ 成功演示单元格基础操作: {fileName}");
}
catch (Exception ex)
{
Console.WriteLine($"✗ 单元格基础操作时出错: {ex.Message}");
}
}
引用方式对比:
| 引用方式 | 语法示例 | 适用场景 | 优点 |
|---|---|---|---|
| Range方法 | worksheet.Range("A1") |
标准A1表示法 | 直观易读 |
| 字符串索引器 | worksheet["B1"] |
简化的A1表示法 | 代码简洁 |
| 行列号索引器 | worksheet[1, 3] |
动态计算引用 | 便于循环操作 |
| Cells属性 | worksheet.Cells[1, 4] |
精确行列号引用 | 类型安全 |
相对引用和绝对引用
csharp
/// <summary>
/// 相对引用和绝对引用示例
/// </summary>
static void RelativeAndAbsoluteReferenceExample()
{
using var excelApp = ExcelFactory.BlankWorkbook();
var workbook = excelApp.ActiveWorkbook;
var worksheet = workbook.ActiveSheetWrap;
// 绝对引用示例
var baseCell = worksheet["C5"];
baseCell.Value = "基准单元格";
// 相对引用(从基准单元格偏移)
var relativeCell1 = baseCell.Offset(0, 1); // 向右1列
relativeCell1.Value = "相对引用1(右1列)";
var relativeCell2 = baseCell.Offset(1, 0); // 向下1行
relativeCell2.Value = "相对引用2(下1行)";
var relativeCell3 = baseCell.Offset(2, 2); // 向下2行,向右2列
relativeCell3.Value = "相对引用3(下2行右2列)";
// 应用场景:创建表格结构
for (int row = 1; row <= 5; row++)
{
for (int col = 1; col <= 3; col++)
{
var cell = worksheet.Cells[row, col];
cell.Value = $"({row},{col})";
cell.Interior.Color = row % 2 == 0 ? Color.LightBlue : Color.LightYellow;
}
}
workbook.SaveAs("relative_absolute_reference.xlsx");
Console.WriteLine("相对引用和绝对引用示例完成");
}
单元格属性访问
csharp
/// <summary>
/// 单元格属性访问示例
/// </summary>
static void CellPropertyAccessExample()
{
using var excelApp = ExcelFactory.BlankWorkbook();
var workbook = excelApp.ActiveWorkbook;
var worksheet = workbook.ActiveSheetWrap;
var cell = worksheet["A1"];
// 基础属性
cell.Value = "测试单元格";
cell.Formula = "=1+2";
// 格式属性
cell.Font.Bold = true;
cell.Font.Size = 14;
cell.Font.Color = Color.Blue;
cell.Interior.Color = Color.LightGray;
cell.Borders.LineStyle = XlLineStyle.xlContinuous;
// 对齐属性
cell.HorizontalAlignment = XlHAlign.xlHAlignCenter;
cell.VerticalAlignment = XlVAlign.xlVAlignCenter;
// 读取属性
Console.WriteLine($"单元格地址: {cell.Address}");
Console.WriteLine($"行号: {cell.Row}");
Console.WriteLine($"列号: {cell.Column}");
Console.WriteLine($"值: {cell.Value}");
Console.WriteLine($"公式: {cell.Formula}");
Console.WriteLine($"文本: {cell.Text}");
workbook.SaveAs("cell_property_access.xlsx");
Console.WriteLine("单元格属性访问示例完成");
}
区域基础操作
区域操作是处理批量数据的关键,熟练掌握区域操作可以大幅提升数据处理效率。
区域引用方式
csharp
/// <summary>
/// 区域基础操作示例
/// 演示如何引用和操作单元格区域
/// </summary>
static void RangeBasicOperationsExample()
{
Console.WriteLine("=== 区域基础操作示例 ===");
try
{
// 创建Excel应用程序实例
using var excelApp = ExcelFactory.BlankWorkbook();
// 获取活动工作簿和工作表
var workbook = excelApp.ActiveWorkbook;
var worksheet = workbook.ActiveSheetWrap;
worksheet.Name = "区域操作";
// 方法1:使用Range方法引用区域
var rangeA1C3 = worksheet.Range("A1:C3");
rangeA1C3.Value = "区域A1:C3";
rangeA1C3.Font.Bold = true;
rangeA1C3.Interior.Color = Color.LightBlue;
// 方法2:使用索引器引用区域
var rangeE1G3 = worksheet["E1:G3"];
rangeE1G3.Value = "区域E1:G3";
rangeE1G3.Font.Italic = true;
rangeE1G3.Interior.Color = Color.LightGreen;
// 方法3:使用Range方法引用区域(行列号)
var rangeA5C7 = worksheet.Range(worksheet.Cells[5, 1], worksheet.Cells[7, 3]); // 第5-7行,第1-3列
rangeA5C7.Value = "区域A5:C7";
rangeA5C7.Font.Underline = XlUnderlineStyle.xlUnderlineStyleSingle;
rangeA5C7.Interior.Color = Color.LightYellow;
// 使用Range方法定义区域范围
var rangeFromTo = worksheet.Range(worksheet["A9"], worksheet["C11"]);
rangeFromTo.Value = "从A9到C11的区域";
rangeFromTo.Font.Color = Color.Red;
rangeFromTo.Interior.Color = Color.LightPink;
// 保存工作簿
string fileName = $"RangeBasicOperations_{DateTime.Now:yyyyMMddHHmmss}.xlsx";
workbook.SaveAs(fileName);
Console.WriteLine($"✓ 成功演示区域基础操作: {fileName}");
}
catch (Exception ex)
{
Console.WriteLine($"✗ 区域基础操作时出错: {ex.Message}");
}
}
动态区域操作
csharp
/// <summary>
/// 动态区域操作示例
/// </summary>
static void DynamicRangeOperationsExample()
{
using var excelApp = ExcelFactory.BlankWorkbook();
var workbook = excelApp.ActiveWorkbook;
var worksheet = workbook.ActiveSheetWrap;
// 创建动态数据
for (int row = 1; row <= 10; row++)
{
worksheet.Cells[row, 1].Value = $"产品{row}";
worksheet.Cells[row, 2].Value = row * 100;
worksheet.Cells[row, 3].Value = DateTime.Now.AddDays(row);
}
// 获取已使用区域
var usedRange = worksheet.UsedRange;
usedRange.Borders.LineStyle = XlLineStyle.xlContinuous;
// 获取特定区域
var currentRegion = worksheet["A1"].CurrentRegion;
currentRegion.Interior.Color = Color.LightBlue;
// 获取区域边界
var firstCell = usedRange.Cells[1, 1];
var lastCell = usedRange.Cells[usedRange.Rows.Count, usedRange.Columns.Count];
Console.WriteLine($"已使用区域: {usedRange.Address}");
Console.WriteLine($"起始单元格: {firstCell.Address}");
Console.WriteLine($"结束单元格: {lastCell.Address}");
Console.WriteLine($"行数: {usedRange.Rows.Count}");
Console.WriteLine($"列数: {usedRange.Columns.Count}");
workbook.SaveAs("dynamic_range_operations.xlsx");
Console.WriteLine("动态区域操作示例完成");
}
区域遍历和操作
csharp
/// <summary>
/// 区域遍历和操作示例
/// </summary>
static void RangeTraversalExample()
{
using var excelApp = ExcelFactory.BlankWorkbook();
var workbook = excelApp.ActiveWorkbook;
var worksheet = workbook.ActiveSheetWrap;
// 创建示例数据
var dataRange = worksheet.Range("A1:D5");
// 方法1:使用二维数组填充
object[,] data = new object[5, 4];
for (int row = 0; row < 5; row++)
{
for (int col = 0; col < 4; col++)
{
data[row, col] = $"({row + 1},{col + 1})";
}
}
dataRange.Value = data;
// 方法2:遍历区域中的每个单元格
foreach (var cell in dataRange.Cells)
{
cell.Interior.Color = ((cell.Row + cell.Column) % 2 == 0)
? Color.LightBlue : Color.LightYellow;
}
// 方法3:按行列遍历
for (int row = 1; row <= dataRange.Rows.Count; row++)
{
for (int col = 1; col <= dataRange.Columns.Count; col++)
{
var cell = dataRange.Cells[row, col];
cell.Font.Bold = (row == 1); // 第一行加粗
}
}
// 特殊区域引用
var entireRow = worksheet.Rows["2:2"]; // 第二行
entireRow.Interior.Color = Color.LightGreen;
var entireColumn = worksheet.Columns["C:C"]; // C列
entireColumn.Font.Italic = true;
workbook.SaveAs("range_traversal.xlsx");
Console.WriteLine("区域遍历和操作示例完成");
}
数据读写操作
单元格数据读写
csharp
/// <summary>
/// 单元格数据读写操作示例
/// 演示如何读写不同类型的单元格数据
/// </summary>
static void CellDataOperationsExample()
{
Console.WriteLine("=== 单元格数据读写操作示例 ===");
try
{
// 创建Excel应用程序实例
using var excelApp = ExcelFactory.BlankWorkbook();
// 获取活动工作簿和工作表
var workbook = excelApp.ActiveWorkbook;
var worksheet = workbook.ActiveSheetWrap;
worksheet.Name = "单元格数据操作";
// 写入不同类型的数据
worksheet["A1"].Value = "文本数据";
worksheet["A2"].Value = 123.45; // 数字
worksheet["A3"].Value = DateTime.Now; // 日期时间
worksheet["A4"].Value = true; // 布尔值
// 读取数据并显示
Console.WriteLine($"A1单元格值: {worksheet["A1"].Value} (类型: {worksheet["A1"].Value?.GetType()})");
Console.WriteLine($"A2单元格值: {worksheet["A2"].Value} (类型: {worksheet["A2"].Value?.GetType()})");
Console.WriteLine($"A3单元格值: {worksheet["A3"].Value} (类型: {worksheet["A3"].Value?.GetType()})");
Console.WriteLine($"A4单元格值: {worksheet["A4"].Value} (类型: {worksheet["A4"].Value?.GetType()})");
// 设置公式
worksheet["B1"].Value = 10;
worksheet["B2"].Value = 20;
worksheet["B3"].Formula = "=B1+B2";
Console.WriteLine($"B3单元格公式结果: {worksheet["B3"].Value}");
// 保存工作簿
string fileName = $"CellDataOperations_{DateTime.Now:yyyyMMddHHmmss}.xlsx";
workbook.SaveAs(fileName);
Console.WriteLine($"✓ 成功演示单元格数据读写操作: {fileName}");
}
catch (Exception ex)
{
Console.WriteLine($"✗ 单元格数据读写操作时出错: {ex.Message}");
}
}
区域数据批量读写
csharp
/// <summary>
/// 区域数据读写操作示例
/// 演示如何读写区域数据
/// </summary>
static void RangeDataOperationsExample()
{
Console.WriteLine("=== 区域数据读写操作示例 ===");
try
{
// 创建Excel应用程序实例
using var excelApp = ExcelFactory.BlankWorkbook();
// 获取活动工作簿和工作表
var workbook = excelApp.ActiveWorkbook;
var worksheet = workbook.ActiveSheetWrap;
worksheet.Name = "区域数据操作";
// 写入区域数据(使用二维数组)
object[,] data = {
{"姓名", "部门", "薪资"},
{"张三", "技术部", 8000},
{"李四", "销售部", 7500},
{"王五", "市场部", 7000}
};
var dataRange = worksheet.Range("A1:C4");
dataRange.Value = data;
dataRange.Font.Bold = true;
dataRange.Interior.Color = Color.LightBlue;
// 读取区域数据
object[,] readData = (object[,])dataRange.Value;
Console.WriteLine("读取的区域数据:");
for (int row = 0; row < readData.GetLength(0); row++)
{
for (int col = 0; col < readData.GetLength(1); col++)
{
Console.Write($"{readData[row, col]}\t");
}
Console.WriteLine();
}
// 使用区域公式
worksheet.Range("D1").Value = "奖金";
worksheet.Range("D2:D4").Formula = "=C2*0.1";
// 保存工作簿
string fileName = $"RangeDataOperations_{DateTime.Now:yyyyMMddHHmmss}.xlsx";
workbook.SaveAs(fileName);
Console.WriteLine($"✓ 成功演示区域数据读写操作: {fileName}");
}
catch (Exception ex)
{
Console.WriteLine($"✗ 区域数据读写操作时出错: {ex.Message}");
}
}
性能优化:批量操作技巧
csharp
/// <summary>
/// 批量操作性能优化示例
/// </summary>
static void BatchOperationsPerformanceExample()
{
using var excelApp = ExcelFactory.BlankWorkbook();
var workbook = excelApp.ActiveWorkbook;
var worksheet = workbook.ActiveSheetWrap;
// 禁用屏幕更新(性能优化)
excelApp.ScreenUpdating = false;
try
{
// 方法1:一次性写入大量数据(推荐)
var largeData = new object[1000, 10];
for (int i = 0; i < 1000; i++)
{
for (int j = 0; j < 10; j++)
{
largeData[i, j] = $"数据{i + 1}-{j + 1}";
}
}
var largeRange = worksheet.Range("A1:J1000");
largeRange.Value = largeData;
// 方法2:批量设置格式
largeRange.Font.Name = "微软雅黑";
largeRange.Font.Size = 10;
// 方法3:选择性格式设置(性能更好)
var headerRow = worksheet.Range("A1:J1");
headerRow.Font.Bold = true;
headerRow.Interior.Color = Color.LightGray;
// 方法4:使用数组公式(减少计算次数)
var formulaRange = worksheet.Range("K1:K1000");
formulaRange.FormulaArray = "=LEN(A1:J1)";
Console.WriteLine("批量操作完成,处理了10000个单元格");
}
finally
{
// 恢复屏幕更新
excelApp.ScreenUpdating = true;
}
workbook.SaveAs("batch_operations_performance.xlsx");
Console.WriteLine("批量操作性能优化示例完成");
}
数据格式化和类型转换
数字和日期格式化
csharp
/// <summary>
/// 数字格式设置示例
/// 演示如何设置数字、日期、货币等格式
/// </summary>
static void NumberFormattingExample()
{
Console.WriteLine("=== 数字格式设置示例 ===");
try
{
// 创建Excel应用程序实例
using var excelApp = ExcelFactory.BlankWorkbook();
// 获取活动工作簿和工作表
var workbook = excelApp.ActiveWorkbook;
var worksheet = workbook.ActiveSheetWrap;
worksheet.Name = "数字格式";
// 设置整数格式
var integerRange = worksheet.Range("A1");
integerRange.Value = 1234;
integerRange.NumberFormat = "0";
// 设置小数格式
var decimalRange = worksheet.Range("A2");
decimalRange.Value = 1234.567;
decimalRange.NumberFormat = "0.00";
// 设置百分比格式
var percentageRange = worksheet.Range("A3");
percentageRange.Value = 0.1234;
percentageRange.NumberFormat = "0.00%";
// 设置货币格式
var currencyRange = worksheet.Range("A4");
currencyRange.Value = 1234.56;
currencyRange.NumberFormat = "¥#,##0.00";
// 设置日期格式
var dateRange = worksheet.Range("A5");
dateRange.Value = DateTime.Now;
dateRange.NumberFormat = "yyyy-mm-dd";
// 设置时间格式
var timeRange = worksheet.Range("A6");
timeRange.Value = DateTime.Now;
timeRange.NumberFormat = "hh:mm:ss";
// 设置科学计数法格式
var scientificRange = worksheet.Range("A7");
scientificRange.Value = 123456789;
scientificRange.NumberFormat = "0.00E+00";
// 保存工作簿
string fileName = $"NumberFormatting_{DateTime.Now:yyyyMMddHHmmss}.xlsx";
workbook.SaveAs(fileName);
Console.WriteLine($"✓ 成功演示数字格式设置: {fileName}");
}
catch (Exception ex)
{
Console.WriteLine($"✗ 数字格式设置时出错: {ex.Message}");
}
}
字体和文本格式化
csharp
/// <summary>
/// 基础字体格式设置示例
/// 演示如何设置字体名称、大小、粗体、斜体等基本属性
/// </summary>
static void BasicFontFormattingExample()
{
Console.WriteLine("=== 基础字体格式设置示例 ===");
try
{
// 创建Excel应用程序实例
using var excelApp = ExcelFactory.BlankWorkbook();
// 获取活动工作簿和工作表
var workbook = excelApp.ActiveWorkbook;
var worksheet = workbook.ActiveSheetWrap;
worksheet.Name = "基础字体格式";
// 设置标题字体格式
var titleRange = worksheet.Range("A1");
titleRange.Value = "基础字体格式示例";
titleRange.Font.Name = "微软雅黑";
titleRange.Font.Size = 16;
titleRange.Font.Bold = true;
titleRange.Font.Color = Color.DarkBlue;
titleRange.Interior.Color = Color.LightGray;
// 设置普通文本字体格式
var normalTextRange = worksheet.Range("A3");
normalTextRange.Value = "普通文本";
normalTextRange.Font.Name = "宋体";
normalTextRange.Font.Size = 10;
// 设置粗体文本
var boldTextRange = worksheet.Range("A4");
boldTextRange.Value = "粗体文本";
boldTextRange.Font.Bold = true;
// 设置斜体文本
var italicTextRange = worksheet.Range("A5");
italicTextRange.Value = "斜体文本";
italicTextRange.Font.Italic = true;
// 设置下划线文本
var underlineTextRange = worksheet.Range("A6");
underlineTextRange.Value = "下划线文本";
underlineTextRange.Font.Underline = XlUnderlineStyle.xlUnderlineStyleSingle;
// 设置字体颜色
var coloredTextRange = worksheet.Range("A7");
coloredTextRange.Value = "彩色文本";
coloredTextRange.Font.Color = Color.Red;
// 保存工作簿
string fileName = $"BasicFontFormatting_{DateTime.Now:yyyyMMddHHmmss}.xlsx";
workbook.SaveAs(fileName);
Console.WriteLine($"✓ 成功演示基础字体格式设置: {fileName}");
}
catch (Exception ex)
{
Console.WriteLine($"✗ 基础字体格式设置时出错: {ex.Message}");
}
}
对齐和布局格式化
csharp
/// <summary>
/// 对齐格式设置示例
/// 演示如何设置单元格内容的对齐方式
/// </summary>
static void AlignmentFormattingExample()
{
Console.WriteLine("=== 对齐格式设置示例 ===");
try
{
// 创建Excel应用程序实例
using var excelApp = ExcelFactory.BlankWorkbook();
// 获取活动工作簿和工作表
var workbook = excelApp.ActiveWorkbook;
var worksheet = workbook.ActiveSheetWrap;
worksheet.Name = "对齐格式";
// 设置水平居中对齐
var centerRange = worksheet.Range("A1");
centerRange.Value = "水平居中";
centerRange.HorizontalAlignment = XlHAlign.xlHAlignCenter;
centerRange.VerticalAlignment = XlVAlign.xlVAlignCenter;
centerRange.Interior.Color = Color.LightBlue;
// 设置左对齐
var leftRange = worksheet.Range("A2");
leftRange.Value = "左对齐";
leftRange.HorizontalAlignment = XlHAlign.xlHAlignLeft;
leftRange.Interior.Color = Color.LightGreen;
// 设置右对齐
var rightRange = worksheet.Range("A3");
rightRange.Value = "右对齐";
rightRange.HorizontalAlignment = XlHAlign.xlHAlignRight;
rightRange.Interior.Color = Color.LightYellow;
// 设置垂直居中对齐
var verticalCenterRange = worksheet.Range("B1:B3");
verticalCenterRange.Value = "垂直居中";
verticalCenterRange.VerticalAlignment = XlVAlign.xlVAlignCenter;
// 设置文本自动换行
var wrapTextRange = worksheet.Range("C1");
wrapTextRange.Value = "这是一个很长的文本,用于演示自动换行功能";
wrapTextRange.WrapText = true;
wrapTextRange.ColumnWidth = 15;
wrapTextRange.Interior.Color = Color.LightPink;
// 设置文本方向
var orientationRange = worksheet.Range("C2");
orientationRange.Value = "文本方向";
orientationRange.Orientation = XlOrientation.xlHorizontal;
orientationRange.Interior.Color = Color.LightGray;
// 保存工作簿
string fileName = $"AlignmentFormatting_{DateTime.Now:yyyyMMddHHmmss}.xlsx";
workbook.SaveAs(fileName);
Console.WriteLine($"✓ 成功演示对齐格式设置: {fileName}");
}
catch (Exception ex)
{
Console.WriteLine($"✗ 对齐格式设置时出错: {ex.Message}");
}
}
高级单元格和区域操作
条件格式化和数据验证
csharp
/// <summary>
/// 高级单元格和区域操作示例
/// 演示更复杂的单元格和区域操作
/// </summary>
static void AdvancedCellRangeOperationsExample()
{
Console.WriteLine("=== 高级单元格和区域操作示例 ===");
try
{
// 创建Excel应用程序实例
using var excelApp = ExcelFactory.BlankWorkbook();
// 获取活动工作簿和工作表
var workbook = excelApp.ActiveWorkbook;
var worksheet = workbook.ActiveSheetWrap;
worksheet.Name = "高级操作";
// 创建示例数据
object[,] salesData = {
{"月份", "销售额", "利润"},
{"1月", 50000, 10000},
{"2月", 55000, 12000},
{"3月", 60000, 15000},
{"4月", 58000, 13000},
{"5月", 62000, 16000},
{"6月", 65000, 18000}
};
var dataRange = worksheet.Range("A1:C7");
dataRange.Value = salesData;
// 设置标题格式
var headerRange = worksheet.Range("A1:C1");
headerRange.Font.Bold = true;
headerRange.Interior.Color = Color.LightGray;
headerRange.HorizontalAlignment = XlHAlign.xlHAlignCenter;
// 设置数据格式
var numberRange = worksheet.Range("B2:C7");
numberRange.NumberFormat = "#,##0";
// 使用特殊区域引用
var usedRange = worksheet.UsedRange;
usedRange.Borders.LineStyle = XlLineStyle.xlContinuous;
// 查找操作
var foundCell = dataRange.Find("6月");
if (foundCell != null)
{
foundCell.Interior.Color = Color.Yellow;
Console.WriteLine($"找到'6月'在单元格: {foundCell.Address}");
}
// 保存工作簿
string fileName = $"AdvancedCellRangeOperations_{DateTime.Now:yyyyMMddHHmmss}.xlsx";
workbook.SaveAs(fileName);
Console.WriteLine($"✓ 成功演示高级单元格和区域操作: {fileName}");
}
catch (Exception ex)
{
Console.WriteLine($"✗ 高级单元格和区域操作时出错: {ex.Message}");
}
}
数据排序和筛选
csharp
/// <summary>
/// 数据排序和筛选示例
/// </summary>
static void DataSortingAndFilteringExample()
{
using var excelApp = ExcelFactory.BlankWorkbook();
var workbook = excelApp.ActiveWorkbook;
var worksheet = workbook.ActiveSheetWrap;
// 创建员工数据
object[,] employeeData = {
{"姓名", "部门", "入职日期", "薪资"},
{"张三", "技术部", new DateTime(2020, 3, 15), 8000},
{"李四", "销售部", new DateTime(2019, 7, 20), 7500},
{"王五", "市场部", new DateTime(2021, 1, 10), 7000},
{"赵六", "技术部", new DateTime(2018, 11, 5), 8500},
{"钱七", "销售部", new DateTime(2022, 5, 30), 7800}
};
var dataRange = worksheet.Range("A1:D6");
dataRange.Value = employeeData;
// 数据排序 - 按薪资降序
var sort = worksheet.Sort;
sort.SetRange(dataRange);
sort.Header = XlYesNoGuess.xlYes;
sort.SortFields.Clear();
sort.SortFields.Add(worksheet.Range("D2:D6"), XlSortOn.xlSortOnValues, XlSortOrder.xlDescending);
sort.Apply();
// 数据筛选 - 筛选技术部员工
dataRange.AutoFilter();
worksheet.Range("B1").AutoFilter(1, "技术部");
// 复制筛选结果到新位置
var filteredData = worksheet.Range("A1:D6").SpecialCells(XlCellType.xlCellTypeVisible);
var resultRange = worksheet.Range("F1");
resultRange.Value = "技术部员工数据";
resultRange.Font.Bold = true;
if (filteredData != null)
{
filteredData.Copy(worksheet.Range("F2"));
}
// 设置数字格式
worksheet.Range("D2:D6").NumberFormat = "¥#,##0";
worksheet.Range("I2:I6").NumberFormat = "¥#,##0";
// 设置日期格式
worksheet.Range("C2:C6").NumberFormat = "yyyy-mm-dd";
worksheet.Range("H2:H6").NumberFormat = "yyyy-mm-dd";
workbook.SaveAs("data_sorting_filtering.xlsx");
Console.WriteLine("数据排序和筛选示例完成");
}
数据验证和条件格式化
csharp
/// <summary>
/// 数据验证和条件格式化示例
/// </summary>
static void DataValidationAndConditionalFormattingExample()
{
using var excelApp = ExcelFactory.BlankWorkbook();
var workbook = excelApp.ActiveWorkbook;
var worksheet = workbook.ActiveSheetWrap;
// 创建学生成绩数据
object[,] studentData = {
{"姓名", "语文", "数学", "英语", "总分"},
{"张三", 85, 92, 78, 0},
{"李四", 78, 88, 85, 0},
{"王五", 92, 95, 90, 0},
{"赵六", 65, 72, 68, 0},
{"钱七", 88, 82, 79, 0}
};
var dataRange = worksheet.Range("A1:E6");
dataRange.Value = studentData;
// 计算总分
for (int row = 2; row <= 6; row++)
{
var totalCell = worksheet.Cells[row, 5];
totalCell.Formula = $"=SUM(B{row}:D{row})";
}
// 数据验证 - 成绩范围限制
var scoreRange = worksheet.Range("B2:D6");
var validation = scoreRange.Validation;
validation.Delete(); // 清除现有验证
validation.Add(XlDVType.xlValidateWholeNumber, XlDVAlertStyle.xlValidAlertStop,
XlFormatConditionOperator.xlBetween, 0, 100);
validation.ErrorMessage = "成绩必须在0-100之间";
validation.ShowError = true;
// 条件格式化 - 高分标记
var highScoreRange = worksheet.Range("B2:D6");
var highScoreFormat = highScoreRange.FormatConditions.Add(XlFormatConditionType.xlCellValue,
XlFormatConditionOperator.xlGreaterEqual, 90);
highScoreFormat.Interior.Color = Color.LightGreen;
highScoreFormat.Font.Bold = true;
// 条件格式化 - 低分标记
var lowScoreRange = worksheet.Range("B2:D6");
var lowScoreFormat = lowScoreRange.FormatConditions.Add(XlFormatConditionType.xlCellValue,
XlFormatConditionOperator.xlLess, 60);
lowScoreFormat.Interior.Color = Color.LightPink;
// 条件格式化 - 总分优秀标记
var totalScoreRange = worksheet.Range("E2:E6");
var totalScoreFormat = totalScoreRange.FormatConditions.Add(XlFormatConditionType.xlCellValue,
XlFormatConditionOperator.xlGreaterEqual, 240);
totalScoreFormat.Interior.Color = Color.Gold;
totalScoreFormat.Font.Bold = true;
workbook.SaveAs("data_validation_conditional_formatting.xlsx");
Console.WriteLine("数据验证和条件格式化示例完成");
}
实际应用案例
数据录入系统
csharp
/// <summary>
/// 数据录入系统示例
/// </summary>
public class DataEntrySystem
{
private readonly IExcelApplication _excelApp;
private readonly IWorkbook _workbook;
private readonly IWorksheet _worksheet;
public DataEntrySystem()
{
_excelApp = ExcelFactory.BlankWorkbook();
_workbook = _excelApp.ActiveWorkbook;
_worksheet = _workbook.ActiveSheetWrap;
InitializeTemplate();
}
private void InitializeTemplate()
{
_worksheet.Name = "数据录入";
// 创建表头
var headers = new[] { "员工编号", "姓名", "部门", "职位", "入职日期", "薪资" };
var headerRange = _worksheet.Range("A1:F1");
headerRange.Value = headers;
// 设置表头格式
headerRange.Font.Bold = true;
headerRange.Interior.Color = Color.LightBlue;
headerRange.HorizontalAlignment = XlHAlign.xlHAlignCenter;
headerRange.Borders.LineStyle = XlLineStyle.xlContinuous;
// 设置数据验证
SetupDataValidation();
// 设置条件格式
SetupConditionalFormatting();
}
private void SetupDataValidation()
{
// 员工编号验证(数字)
var idRange = _worksheet.Range("A2:A100");
var idValidation = idRange.Validation;
idValidation.Add(XlDVType.xlValidateWholeNumber, XlDVAlertStyle.xlValidAlertStop,
XlFormatConditionOperator.xlGreater, 0);
// 部门选择列表
var deptRange = _worksheet.Range("C2:C100");
var deptValidation = deptRange.Validation;
deptValidation.Add(XlDVType.xlValidateList, XlDVAlertStyle.xlValidAlertStop,
XlFormatConditionOperator.xlEqual, "技术部,销售部,市场部,人事部,财务部");
// 薪资范围验证
var salaryRange = _worksheet.Range("F2:F100");
var salaryValidation = salaryRange.Validation;
salaryValidation.Add(XlDVType.xlValidateDecimal, XlDVAlertStyle.xlValidAlertStop,
XlFormatConditionOperator.xlBetween, 3000, 20000);
}
private void SetupConditionalFormatting()
{
// 高薪资标记
var highSalaryRange = _worksheet.Range("F2:F100");
var highSalaryFormat = highSalaryRange.FormatConditions.Add(XlFormatConditionType.xlCellValue,
XlFormatConditionOperator.xlGreaterEqual, 10000);
highSalaryFormat.Interior.Color = Color.LightGreen;
// 低薪资标记
var lowSalaryRange = _worksheet.Range("F2:F100");
var lowSalaryFormat = lowSalaryRange.FormatConditions.Add(XlFormatConditionType.xlCellValue,
XlFormatConditionOperator.xlLess, 5000);
lowSalaryFormat.Interior.Color = Color.LightPink;
}
/// <summary>
/// 添加员工数据
/// </summary>
public void AddEmployee(string id, string name, string department, string position, DateTime hireDate, decimal salary)
{
// 找到下一空行
var lastRow = _worksheet.Cells.Find("*", System.Reflection.Missing.Value,
System.Reflection.Missing.Value, System.Reflection.Missing.Value,
XlSearchOrder.xlByRows, XlSearchDirection.xlPrevious,
false, System.Reflection.Missing.Value, System.Reflection.Missing.Value).Row;
var newRow = lastRow + 1;
// 填充数据
_worksheet.Cells[newRow, 1].Value = id;
_worksheet.Cells[newRow, 2].Value = name;
_worksheet.Cells[newRow, 3].Value = department;
_worksheet.Cells[newRow, 4].Value = position;
_worksheet.Cells[newRow, 5].Value = hireDate;
_worksheet.Cells[newRow, 6].Value = salary;
// 设置日期格式
_worksheet.Cells[newRow, 5].NumberFormat = "yyyy-mm-dd";
// 设置数字格式
_worksheet.Cells[newRow, 6].NumberFormat = "¥#,##0.00";
Console.WriteLine($"员工 {name} 数据已添加");
}
/// <summary>
/// 保存数据
/// </summary>
public void SaveData(string fileName)
{
// 自动调整列宽
_worksheet.Columns.AutoFit();
// 添加边框
var dataRange = _worksheet.UsedRange;
dataRange.Borders.LineStyle = XlLineStyle.xlContinuous;
_workbook.SaveAs(fileName);
Console.WriteLine($"数据已保存到: {fileName}");
}
public void Dispose()
{
_excelApp?.Dispose();
}
}
// 使用示例
static void DataEntrySystemExample()
{
using var system = new DataEntrySystem();
// 添加示例数据
system.AddEmployee("001", "张三", "技术部", "工程师", new DateTime(2020, 3, 15), 8000);
system.AddEmployee("002", "李四", "销售部", "销售经理", new DateTime(2019, 7, 20), 12000);
system.AddEmployee("003", "王五", "市场部", "市场专员", new DateTime(2021, 1, 10), 6000);
system.AddEmployee("004", "赵六", "技术部", "高级工程师", new DateTime(2018, 11, 5), 15000);
system.AddEmployee("005", "钱七", "销售部", "销售代表", new DateTime(2022, 5, 30), 7000);
system.SaveData("employee_data_entry.xlsx");
Console.WriteLine("数据录入系统示例完成");
}
报表生成器
csharp
/// <summary>
/// 报表生成器示例
/// </summary>
public class ReportGenerator
{
private readonly IExcelApplication _excelApp;
private readonly IExcelWorkbook _workbook;
public ReportGenerator()
{
_excelApp = ExcelFactory.BlankWorkbook();
_workbook = _excelApp.ActiveWorkbook;
}
/// <summary>
/// 生成销售报表
/// </summary>
public void GenerateSalesReport(SalesData[] salesData, string outputPath)
{
var worksheet = _workbook.ActiveSheetWrap;
worksheet.Name = "销售报表";
// 创建报表标题
var titleRange = worksheet.Range("A1:F1");
titleRange.Value = "2023年销售业绩报表";
titleRange.Font.Size = 16;
titleRange.Font.Bold = true;
titleRange.Interior.Color = Color.DarkBlue;
titleRange.Font.Color = Color.White;
titleRange.HorizontalAlignment = XlHAlign.xlHAlignCenter;
titleRange.Merge();
// 创建表头
var headers = new[] { "月份", "产品类别", "产品名称", "销售数量", "销售金额", "利润率" };
var headerRange = worksheet.Range("A3:F3");
headerRange.Value = headers;
// 设置表头格式
headerRange.Font.Bold = true;
headerRange.Interior.Color = Color.LightGray;
headerRange.Borders.LineStyle = XlLineStyle.xlContinuous;
// 填充数据
for (int i = 0; i < salesData.Length; i++)
{
var row = i + 4;
var data = salesData[i];
worksheet.Cells[row, 1].Value = data.Month;
worksheet.Cells[row, 2].Value = data.Category;
worksheet.Cells[row, 3].Value = data.ProductName;
worksheet.Cells[row, 4].Value = data.Quantity;
worksheet.Cells[row, 5].Value = data.Amount;
worksheet.Cells[row, 6].Value = data.ProfitRate;
}
// 设置数据格式
var dataRange = worksheet.Range("A4:F" + (salesData.Length + 3));
dataRange.Borders.LineStyle = XlLineStyle.xlContinuous;
worksheet.Range("D4:D" + (salesData.Length + 3)).NumberFormat = "0";
worksheet.Range("E4:E" + (salesData.Length + 3)).NumberFormat = "¥#,##0.00";
worksheet.Range("F4:F" + (salesData.Length + 3)).NumberFormat = "0.00%";
// 添加合计行
var totalRow = salesData.Length + 4;
worksheet.Cells[totalRow, 3].Value = "合计";
worksheet.Cells[totalRow, 4].Formula = $"=SUM(D4:D{totalRow - 1})";
worksheet.Cells[totalRow, 5].Formula = $"=SUM(E4:E{totalRow - 1})";
var totalRange = worksheet.Range($"A{totalRow}:F{totalRow}");
totalRange.Font.Bold = true;
totalRange.Interior.Color = Color.LightBlue;
totalRange.Borders[XlBordersIndex.xlEdgeTop].Weight = XlBorderWeight.xlThick;
// 自动调整列宽
worksheet.Columns.AutoFit();
// 保存报表
_workbook.SaveAs(outputPath);
Console.WriteLine($"销售报表已生成: {outputPath}");
}
public void Dispose()
{
_excelApp?.Dispose();
}
}
public class SalesData
{
public string Month { get; set; }
public string Category { get; set; }
public string ProductName { get; set; }
public int Quantity { get; set; }
public decimal Amount { get; set; }
public decimal ProfitRate { get; set; }
}
// 使用示例
static void ReportGeneratorExample()
{
// 创建示例数据
var salesData = new[]
{
new SalesData { Month = "1月", Category = "电子产品", ProductName = "笔记本电脑", Quantity = 10, Amount = 50000, ProfitRate = 0.2m },
new SalesData { Month = "1月", Category = "电子产品", ProductName = "手机", Quantity = 20, Amount = 60000, ProfitRate = 0.25m },
new SalesData { Month = "2月", Category = "家居用品", ProductName = "沙发", Quantity = 5, Amount = 15000, ProfitRate = 0.15m },
new SalesData { Month = "2月", Category = "服装", ProductName = "T恤", Quantity = 50, Amount = 2500, ProfitRate = 0.1m },
new SalesData { Month = "3月", Category = "电子产品", ProductName = "平板电脑", Quantity = 15, Amount = 30000, ProfitRate = 0.18m }
};
using var generator = new ReportGenerator();
generator.GenerateSalesReport(salesData, "sales_report.xlsx");
Console.WriteLine("报表生成器示例完成");
}
数据提取工具
csharp
/// <summary>
/// 数据提取工具示例
/// </summary>
public class DataExtractionTool
{
private readonly IExcelApplication _excelApp;
public DataExtractionTool()
{
_excelApp = ExcelFactory.BlankWorkbook();
}
/// <summary>
/// 从Excel文件中提取特定数据
/// </summary>
public List<ExtractedData> ExtractDataFromFile(string filePath, string sheetName, ExtractionCriteria criteria)
{
var extractedData = new List<ExtractedData>();
using var excelApp = ExcelFactory.Open(filePath);
var workbook = excelApp.ActiveWorkbook;
var worksheet = workbook.Worksheets[sheetName] as IExcelWorksheet;
if (worksheet == null)
{
throw new ArgumentException($"工作表 '{sheetName}' 不存在");
}
var usedRange = worksheet.UsedRange;
var data = (object[,])usedRange.Value;
// 查找标题行
var headerRow = FindHeaderRow(data, criteria.HeaderNames);
if (headerRow < 0)
{
throw new InvalidOperationException("未找到指定的标题行");
}
// 提取数据
for (int row = headerRow + 1; row <= data.GetLength(0); row++)
{
if (MatchCriteria(data, row, criteria))
{
var extracted = ExtractRowData(data, row, criteria);
extractedData.Add(extracted);
}
}
return extractedData;
}
private int FindHeaderRow(object[,] data, string[] headerNames)
{
for (int row = 1; row <= data.GetLength(0); row++)
{
bool match = true;
for (int col = 1; col <= data.GetLength(1); col++)
{
var cellValue = data[row, col]?.ToString() ?? "";
if (headerNames.Contains(cellValue))
{
match = true;
break;
}
}
if (match)
{
return row;
}
}
return -1;
}
private bool MatchCriteria(object[,] data, int row, ExtractionCriteria criteria)
{
// 实现匹配逻辑
foreach (var condition in criteria.Conditions)
{
var cellValue = data[row, condition.ColumnIndex]?.ToString() ?? "";
if (!condition.Matches(cellValue))
{
return false;
}
}
return true;
}
private ExtractedData ExtractRowData(object[,] data, int row, ExtractionCriteria criteria)
{
var extracted = new ExtractedData();
foreach (var field in criteria.FieldsToExtract)
{
var value = data[row, field.ColumnIndex];
extracted.Values[field.FieldName] = value;
}
return extracted;
}
public void Dispose()
{
_excelApp?.Dispose();
}
}
public class ExtractionCriteria
{
public string[] HeaderNames { get; set; }
public List<ExtractionCondition> Conditions { get; set; } = new();
public List<ExtractionField> FieldsToExtract { get; set; } = new();
}
public class ExtractionCondition
{
public int ColumnIndex { get; set; }
public Func<string, bool> Matches { get; set; }
}
public class ExtractionField
{
public string FieldName { get; set; }
public int ColumnIndex { get; set; }
}
public class ExtractedData
{
public Dictionary<string, object> Values { get; set; } = new();
}
// 使用示例
static void DataExtractionToolExample()
{
using var tool = new DataExtractionTool();
var criteria = new ExtractionCriteria
{
HeaderNames = new[] { "月份", "产品类别", "销售金额" },
Conditions = new List<ExtractionCondition>
{
new ExtractionCondition
{
ColumnIndex = 2, // 产品类别列
Matches = value => value == "电子产品"
}
},
FieldsToExtract = new List<ExtractionField>
{
new ExtractionField { FieldName = "Month", ColumnIndex = 1 },
new ExtractionField { FieldName = "Category", ColumnIndex = 2 },
new ExtractionField { FieldName = "Amount", ColumnIndex = 5 }
}
};
try
{
var results = tool.ExtractDataFromFile("sales_data.xlsx", "Sheet1", criteria);
Console.WriteLine("提取的数据:");
foreach (var result in results)
{
Console.WriteLine($"月份: {result.Values["Month"]}, 类别: {result.Values["Category"]}, 金额: {result.Values["Amount"]}");
}
}
catch (Exception ex)
{
Console.WriteLine($"数据提取失败: {ex.Message}");
}
Console.WriteLine("数据提取工具示例完成");
}
总结
本章详细介绍了Excel单元格和区域的各种操作技巧,涵盖了从基础引用到高级应用的各个方面。通过本章的学习,您应该能够:
- 掌握单元格引用:熟练使用多种单元格引用方式
- 理解区域操作:掌握区域的创建、遍历和批量操作
- 应用数据格式化:使用数字、字体、对齐等格式化技术
- 实现批量操作:掌握性能优化的批量数据处理技巧
- 构建实用工具:实现数据录入、报表生成、数据提取等应用
关键要点回顾
- 引用方式多样性:根据场景选择合适的引用方式
- 批量操作优先:使用二维数组和区域操作提升性能
- 格式化一致性:保持数据格式的标准化和一致性
- 错误处理完善:确保数据操作的健壮性
本文代码示例基于MudTools.OfficeInterop.Excel库,实际使用时请参考最新的API文档和示例代码。