当前位置: 首页 > news >正文

.NET驾驭Excel之力:单元格与区域操作详解

本文将深入探讨Excel单元格和区域的各种操作技巧。单元格是Excel中最基本的单位,而区域操作则是处理批量数据的关键。掌握这些技术对于高效处理Excel数据至关重要。

学习目标

  • 掌握单元格的多种引用方式
  • 理解区域的创建和操作技巧
  • 学习数据格式化和类型转换
  • 掌握批量数据操作的最佳实践

关键概念

  • 单元格(Cell):Excel中最基本的元素
  • 区域(Range):一组连续的单元格
  • 引用方式:A1表示法、行列号表示法
  • 数据操作:读写、格式化、计算等

单元格基础操作

单元格是Excel中最基本的组成单位,正确的引用和操作单元格是Excel自动化的基础。

单元格引用方式

MudTools.OfficeInterop.Excel库提供了多种单元格引用方式,每种方式都有其适用场景。

/// <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]精确行列号引用类型安全

相对引用和绝对引用

/// <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("相对引用和绝对引用示例完成");
}

单元格属性访问

/// <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("单元格属性访问示例完成");
}

区域基础操作

区域操作是处理批量数据的关键,熟练掌握区域操作可以大幅提升数据处理效率。

区域引用方式

/// <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}");}
}

动态区域操作

/// <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("动态区域操作示例完成");
}

区域遍历和操作

/// <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("区域遍历和操作示例完成");
}

数据读写操作

单元格数据读写

/// <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}");}
}

区域数据批量读写

/// <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}");}
}

性能优化:批量操作技巧

/// <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("批量操作性能优化示例完成");
}

数据格式化和类型转换

数字和日期格式化

/// <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}");}
}

字体和文本格式化

/// <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}");}
}

对齐和布局格式化

/// <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}");}
}

高级单元格和区域操作

条件格式化和数据验证

/// <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}");}
}

数据排序和筛选

/// <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("数据排序和筛选示例完成");
}

数据验证和条件格式化

/// <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("数据验证和条件格式化示例完成");
}

实际应用案例

数据录入系统

/// <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("数据录入系统示例完成");
}

报表生成器

/// <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("报表生成器示例完成");
}

数据提取工具

/// <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单元格和区域的各种操作技巧,涵盖了从基础引用到高级应用的各个方面。通过本章的学习,您应该能够:

  1. 掌握单元格引用:熟练使用多种单元格引用方式
  2. 理解区域操作:掌握区域的创建、遍历和批量操作
  3. 应用数据格式化:使用数字、字体、对齐等格式化技术
  4. 实现批量操作:掌握性能优化的批量数据处理技巧
  5. 构建实用工具:实现数据录入、报表生成、数据提取等应用

关键要点回顾

  • 引用方式多样性:根据场景选择合适的引用方式
  • 批量操作优先:使用二维数组和区域操作提升性能
  • 格式化一致性:保持数据格式的标准化和一致性
  • 错误处理完善:确保数据操作的健壮性

本文代码示例基于MudTools.OfficeInterop.Excel库,实际使用时请参考最新的API文档和示例代码。

http://www.dtcms.com/a/607178.html

相关文章:

  • 桂林seo哪家好在线网站优化
  • 徐州html5响应式网站建设思创医惠网站建设
  • 电子商务网站开发费用调研报告合肥商城网站开发
  • JDBC 学习
  • 网站设计书的结构wordpress数据插件
  • 建站系统破解源码大数据营销的特点
  • 企业网络资产暴露面识别方法论
  • 借刘润之智,在 IP+AI 时代构筑战略 “增长方舟”|创客匠人
  • 大学生网站设计大作业seo网站优化推广怎么做
  • 如何制作网站板块深圳高端保姆公司
  • 关于网站的建设动易网站栏目
  • 买卖信息网站dede做手机网站
  • 做纺织的都用什么网站临安网站seo
  • 网站内部结构杭州产品设计公司有哪些
  • 网站页面设计有哪些小企业网站建设的大品牌
  • Android AB升级(二) - Demo APP应用流程
  • 网站备案背景墙wordpress详细安装教程
  • 做网站朋友圈广告的文案怎么写怎样做网站个人简介
  • 15.spi与硬件浮点
  • 建立网站可以赚钱吗?做视频网站用什么格式好
  • 网站seo外链建设北京建设工程交易协会网站
  • 门户网站的布局c2c网站页面设计特点
  • Web--html基础标签
  • 如何在外管局网站做付汇延期网站由哪些部分组成部分
  • 浙江 网站备案建设机械网站哪家好
  • 搭网站要多少钱免费开放服务器
  • 学院的网站建设的意义贝壳找房房源
  • Python 3 JSON:深度解析与实践指南
  • 简单CNN——作业(补充)
  • 关于网站建设的话术做铁艺需要什么网站