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

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

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

关键要点回顾

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

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

相关推荐
用户8356290780515 小时前
C# 自动化生成 PowerPoint 演示文稿
后端·c#
秋天之落叶6 小时前
使用ADO将excel表内容加载到mssql表中的长度问题
数据库·sqlserver·excel
饮品爱好者6 小时前
[C#] NO.4 我的第一个项目
vscode·职场和发展·c#·github
1314lay_10076 小时前
SAP ABAP 导入excel表,导多个sheet
excel·abap
专注VB编程开发20年7 小时前
.net按地址动态调用VC++DLL将非托管DLL中的函数地址转换为.NET可调用的委托
开发语言·c++·c#·.net
玩泥巴的9 小时前
.NET驾驭Excel之力:工作簿与工作表操作基础
c#·excel·二次开发·office·com互操作
czhc11400756639 小时前
C# 1116 流程控制 常量
开发语言·c#
葛小白19 小时前
C#进阶12:C#全局路径规划算法_Dijkstra
算法·c#·dijkstra算法
yivifu10 小时前
精益求精,支持处理嵌套表格的Word表格转HTML表格
开发语言·c#·word