Aspose.Cells for .NET 教程(三):单元格操作全攻略

作者:微信公众号:【架构师老卢】
9-24 20:12
16

Aspose.Cells for .NET下载地址 https://soft51.cc/software/175799451582733643

📋 目录

  1. 单元格操作概述
  2. 读取与写入单元格数据
  3. 单元格区域(Range)操作
  4. 设置单元格格式
  5. 数据类型与公式支持
  6. 单元格批量导入与导出
  7. 综合实例
  8. 最佳实践与性能优化

1. 单元格操作概述

1.1 核心对象介绍

Cell 对象:代表工作表中的单个单元格,提供了读写数据、设置格式等功能。

Cells 对象:代表工作表中所有单元格的集合,提供了批量操作、区域选择等功能。

Range 对象:代表单元格区域,可以对多个单元格进行统一操作。

1.2 单元格定位方式

在 Aspose.Cells 中,有多种方式可以定位和访问单元格:

  • 索引方式worksheet.Cells[row, column] (从0开始)
  • 名称方式worksheet.Cells["A1"]
  • GetCell方法worksheet.Cells.GetCell(row, column)

1.3 单元格操作的基本模式

单元格操作通常遵循以下模式:

  1. 获取单元格对象
  2. 读取或写入数据
  3. 设置格式(可选)
  4. 应用样式(可选)

2. 读取与写入单元格数据

2.1 基本数据类型支持

Aspose.Cells 支持所有常见的数据类型:

  • 字符串:直接赋值或使用 PutValue(string)
  • 数字:整数、浮点数,自动识别类型
  • 日期时间DateTime 对象,可设置显示格式
  • 布尔值true/false
  • 公式:以 = 开头的字符串

2.2 数据读写方法

写入数据

  • cell.Value = data:通用方式
  • cell.PutValue(data):明确指定类型
  • cell.Formula = "=SUM(A1:A5)":写入公式

读取数据

  • cell.Value:获取原始值
  • cell.StringValue:获取字符串表示
  • cell.IntValuecell.DoubleValue:获取特定类型值
  • cell.DateTimeValue:获取日期时间值

2.3 数据类型判断

使用 cell.Type 属性可以判断单元格的数据类型:

  • CellValueType.IsString:字符串
  • CellValueType.IsNumeric:数字
  • CellValueType.IsDateTime:日期时间
  • CellValueType.IsBool:布尔值
  • CellValueType.IsNull:空值
  • CellValueType.IsError:错误值

3. 单元格区域(Range)操作

3.1 Range 创建方式

Range 提供了对多个单元格的批量操作能力:

// 通过字符串创建
Range range1 = worksheet.Cells.CreateRange("A1:C3");

// 通过坐标创建
Range range2 = worksheet.Cells.CreateRange(0, 0, 3, 3);

// 通过起始位置和大小创建
Range range3 = worksheet.Cells.CreateRange("B2", 2, 2);

3.2 Range 批量操作

批量数据操作

  • range.Value = array:批量写入二维数组
  • range.Value:批量读取为二维数组
  • range.Copy(targetRange):复制到目标区域
  • range.MoveTo(targetRange):移动到目标区域

批量格式操作

  • range.ApplyStyle(style, flag):应用统一样式
  • range.SetOutlineBorders():设置外边框
  • range.SetInsideBorders():设置内边框

3.3 Range 查找和替换

  • range.Find(searchText, startCell, findOptions):查找文本
  • range.FindNext(previousCell, findOptions):查找下一个
  • range.Replace(oldText, newText, replaceOptions):替换文本

4. 设置单元格格式

4.1 字体格式

通过 Style.Font 属性设置字体相关格式:

  • Font.Name:字体名称
  • Font.Size:字体大小
  • Font.Color:字体颜色
  • Font.IsBold:是否粗体
  • Font.IsItalic:是否斜体
  • Font.Underline:下划线类型

4.2 对齐方式

通过 Style 的对齐属性控制文本对齐:

  • HorizontalAlignment:水平对齐(左、中、右、两端对齐等)
  • VerticalAlignment:垂直对齐(顶部、中间、底部)
  • IsTextWrapped:是否自动换行
  • Indent:缩进级别
  • RotationAngle:旋转角度

4.3 边框和背景

边框设置

style.SetBorder(BorderType.TopBorder, CellBorderType.Thick, Color.Black);

背景设置

style.BackgroundColor = Color.LightBlue;
style.Pattern = BackgroundType.Solid;

4.4 数字格式

通过 Style.Custom 属性设置数字显示格式:

  • "#,##0.00":千位分隔符,两位小数
  • "0.00%":百分比格式
  • "yyyy-mm-dd":日期格式
  • "¥#,##0.00":货币格式

5. 数据类型与公式支持

5.1 公式基础

设置公式

cell.Formula = "=SUM(A1:A5)";
workbook.CalculateFormula(); // 计算公式

常用函数类型

  • 数学函数:SUM、AVERAGE、MAX、MIN、COUNT
  • 逻辑函数:IF、AND、OR、NOT
  • 文本函数:CONCATENATE、LEN、UPPER、LOWER
  • 日期函数:TODAY、NOW、YEAR、MONTH、DAY
  • 查找函数:VLOOKUP、INDEX、MATCH

5.2 命名区域

创建和使用命名区域可以让公式更易读和维护:

// 创建命名区域
workbook.Worksheets.Names.Add("SalesData", range);

// 在公式中使用
cell.Formula = "=SUM(SalesData)";

5.3 数组公式

数组公式可以对整个数组进行计算:

cell.SetArrayFormula("=SUM(A1:A5*B1:B5)", 1, 1);

6. 单元格批量导入与导出

6.1 数据导入

从 DataTable 导入

worksheet.Cells.ImportDataTable(dataTable, true, 0, 0);

从数组导入

worksheet.Cells.ImportArray(array, 0, 0);

从集合导入

worksheet.Cells.ImportCustomObjects(objectList, 0, 0, new ImportTableOptions());

6.2 数据导出

导出为 DataTable

DataTable dt = worksheet.Cells.ExportDataTable(0, 0, rows, cols, new ExportTableOptions());

导出为数组

object[,] data = worksheet.Cells.ExportArray(0, 0, rows, cols);

6.3 批量操作优化

  • 使用二维数组进行批量数据操作
  • 使用 Range 对象进行区域操作
  • 分批处理大量数据
  • 使用 StyleFlag 控制格式应用范围

7. 综合实例

下面通过一个完整的学生成绩管理系统来展示单元格操作的综合应用:

using Aspose.Cells;
using System;
using System.Drawing;

public class StudentGradeManager
{
    public static void CreateGradeSystem()
    {
        // 创建工作簿
        Workbook workbook = new Workbook();
        Worksheet worksheet = workbook.Worksheets[0];
        worksheet.Name = "学生成绩表";
        
        // 1. 设置标题
        worksheet.Cells["A1"].Value = "学生成绩管理系统";
        worksheet.Cells.Merge(0, 0, 1, 7);
        
        Style titleStyle = workbook.CreateStyle();
        titleStyle.Font.Size = 16;
        titleStyle.Font.IsBold = true;
        titleStyle.HorizontalAlignment = TextAlignmentType.Center;
        titleStyle.BackgroundColor = Color.Navy;
        titleStyle.Font.Color = Color.White;
        titleStyle.Pattern = BackgroundType.Solid;
        worksheet.Cells["A1"].SetStyle(titleStyle);
        
        // 2. 设置列标题
        string[] headers = {"学号", "姓名", "数学", "英语", "语文", "总分", "平均分", "等级"};
        for (int i = 0; i < headers.Length; i++)
        {
            Cell headerCell = worksheet.Cells[2, i];
            headerCell.Value = headers[i];
            
            Style headerStyle = workbook.CreateStyle();
            headerStyle.BackgroundColor = Color.LightBlue;
            headerStyle.Pattern = BackgroundType.Solid;
            headerStyle.Font.IsBold = true;
            headerStyle.HorizontalAlignment = TextAlignmentType.Center;
            headerStyle.SetBorder(BorderType.TopBorder, CellBorderType.Thin, Color.Black);
            headerStyle.SetBorder(BorderType.BottomBorder, CellBorderType.Thin, Color.Black);
            headerStyle.SetBorder(BorderType.LeftBorder, CellBorderType.Thin, Color.Black);
            headerStyle.SetBorder(BorderType.RightBorder, CellBorderType.Thin, Color.Black);
            headerCell.SetStyle(headerStyle);
        }
        
        // 3. 创建学生数据
        object[,] studentData = {
            {"S001", "张三", 85, 78, 92},
            {"S002", "李四", 92, 88, 85},
            {"S003", "王五", 78, 85, 90},
            {"S004", "赵六", 88, 92, 78},
            {"S005", "钱七", 95, 85, 88}
        };
        
        // 4. 批量写入基础数据
        Range dataRange = worksheet.Cells.CreateRange(3, 0, 5, 5);
        dataRange.Value = studentData;
        
        // 5. 设置公式
        for (int row = 3; row < 8; row++)
        {
            // 总分公式
            worksheet.Cells[row, 5].Formula = $"=SUM(C{row+1}:E{row+1})";
            
            // 平均分公式  
            worksheet.Cells[row, 6].Formula = $"=AVERAGE(C{row+1}:E{row+1})";
            
            // 等级公式
            worksheet.Cells[row, 7].Formula = 
                $"=IF(G{row+1}>=90,\"优秀\",IF(G{row+1}>=80,\"良好\",IF(G{row+1}>=70,\"中等\",\"及格\")))";
        }
        
        // 6. 计算公式
        workbook.CalculateFormula();
        
        // 7. 设置数据区域格式
        Range allDataRange = worksheet.Cells.CreateRange("A3:H8");
        Style dataStyle = workbook.CreateStyle();
        dataStyle.SetBorder(BorderType.TopBorder, CellBorderType.Thin, Color.Gray);
        dataStyle.SetBorder(BorderType.BottomBorder, CellBorderType.Thin, Color.Gray);
        dataStyle.SetBorder(BorderType.LeftBorder, CellBorderType.Thin, Color.Gray);
        dataStyle.SetBorder(BorderType.RightBorder, CellBorderType.Thin, Color.Gray);
        dataStyle.HorizontalAlignment = TextAlignmentType.Center;
        
        StyleFlag flag = new StyleFlag();
        flag.Borders = true;
        flag.HorizontalAlignment = true;
        allDataRange.ApplyStyle(dataStyle, flag);
        
        // 8. 设置数字格式
        Range scoreRange = worksheet.Cells.CreateRange("C4:G8");
        Style numberStyle = workbook.CreateStyle();
        numberStyle.Custom = "0.00";
        scoreRange.ApplyStyle(numberStyle, new StyleFlag { NumberFormat = true });
        
        // 9. 添加条件格式化
        // 优秀成绩高亮
        FormatCondition excellentCondition = worksheet.ConditionalFormattings.AddCondition(
            FormatConditionType.CellValue, OperatorType.GreaterOrEqual, "90", null);
        excellentCondition.Areas.Add(worksheet.Cells.CreateCellArea("G4", "G8"));
        excellentCondition.Style.BackgroundColor = Color.LightGreen;
        excellentCondition.Style.Pattern = BackgroundType.Solid;
        
        // 不及格成绩高亮
        FormatCondition failCondition = worksheet.ConditionalFormattings.AddCondition(
            FormatConditionType.CellValue, OperatorType.Less, "60", null);
        failCondition.Areas.Add(worksheet.Cells.CreateCellArea("G4", "G8"));
        failCondition.Style.BackgroundColor = Color.LightCoral;
        failCondition.Style.Pattern = BackgroundType.Solid;
        
        // 10. 添加统计信息
        worksheet.Cells["A10"].Value = "统计信息";
        worksheet.Cells["A11"].Value = "班级人数:";
        worksheet.Cells["B11"].Formula = "=COUNTA(A4:A8)";
        
        worksheet.Cells["A12"].Value = "平均总分:";
        worksheet.Cells["B12"].Formula = "=AVERAGE(F4:F8)";
        
        worksheet.Cells["A13"].Value = "最高分:";
        worksheet.Cells["B13"].Formula = "=MAX(F4:F8)";
        
        worksheet.Cells["A14"].Value = "优秀人数:";
        worksheet.Cells["B14"].Formula = "=COUNTIF(H4:H8,\"优秀\")";
        
        // 11. 设置列宽和行高
        worksheet.AutoFitColumns();
        worksheet.Cells.SetRowHeight(0, 30);
        worksheet.Cells.SetRowHeight(2, 25);
        
        // 12. 数据验证(为新增数据行预设)
        Range validationRange = worksheet.Cells.CreateRange("C9:E20");
        Validation validation = worksheet.Validations[worksheet.Validations.Add()];
        validation.AreaList.Add(validationRange);
        validation.Type = ValidationType.Decimal;
        validation.Operator = OperatorType.Between;
        validation.Formula1 = "0";
        validation.Formula2 = "100";
        validation.ErrorMessage = "请输入0-100之间的分数";
        validation.ShowError = true;
        
        // 13. 保存文件
        workbook.Save("StudentGradeManagement.xlsx");
        Console.WriteLine("学生成绩管理系统创建完成!");
        
        // 14. 演示数据读取
        Console.WriteLine("\n学生成绩统计:");
        for (int row = 3; row < 8; row++)
        {
            string studentId = worksheet.Cells[row, 0].StringValue;
            string name = worksheet.Cells[row, 1].StringValue;
            double total = worksheet.Cells[row, 5].DoubleValue;
            double average = worksheet.Cells[row, 6].DoubleValue;
            string grade = worksheet.Cells[row, 7].StringValue;
            
            Console.WriteLine($"{studentId} {name}: 总分{total:F1}, 平均分{average:F1}, 等级{grade}");
        }
        
        // 15. 演示批量数据导出
        object[,] exportData = worksheet.Cells.ExportArray(2, 0, 6, 8);
        Console.WriteLine($"\n导出数据: {exportData.GetLength(0)}行 x {exportData.GetLength(1)}列");
    }
}

// 使用示例
class Program
{
    static void Main(string[] args)
    {
        try
        {
            StudentGradeManager.CreateGradeSystem();
            Console.WriteLine("程序执行完成,请查看生成的Excel文件。");
        }
        catch (Exception ex)
        {
            Console.WriteLine($"程序执行出错: {ex.Message}");
        }
        
        Console.ReadKey();
    }
}

8. 最佳实践与性能优化

8.1 性能优化建议

  1. 批量操作优先

    • 使用二维数组进行批量数据写入
    • 使用 Range 对象进行区域操作
    • 避免逐个单元格的循环操作
  2. 样式优化

    • 创建样式对象并重复使用
    • 使用 StyleFlag 控制需要应用的样式属性
    • 批量应用相同样式到多个区域
  3. 公式优化

    • 在批量设置数据后统一调用 CalculateFormula()
    • 使用命名区域提高公式可读性
    • 避免复杂的嵌套公式

8.2 内存管理

  1. 及时释放资源

    // 处理完成后释放大对象
    largeArray = null;
    GC.Collect();
    
  2. 分批处理大数据

    int batchSize = 1000;
    for (int i = 0; i < totalRows; i += batchSize)
    {
        // 分批处理数据
    }
    

8.3 错误处理

  1. 数据验证

    • 检查单元格数据类型
    • 验证数据范围和格式
    • 处理空值和异常值
  2. 异常捕获

    try
    {
        // 单元格操作代码
    }
    catch (CellsException ex)
    {
        Console.WriteLine($"单元格操作错误: {ex.Message}");
    }
    

8.4 代码组织建议

  1. 功能模块化:将不同的操作封装成独立方法
  2. 配置外置化:将格式设置、样式配置等提取为常量或配置文件
  3. 可重用性:创建通用的工具类和扩展方法

通过掌握这些单元格操作技巧,你可以高效地处理 Excel 文件中的数据读写、格式设置和批量操作,为构建复杂的电子表格应用程序奠定坚实的基础。

Aspose.Cells for .NET下载地址 https://soft51.cc/software/175799451582733643

相关留言评论
昵称:
邮箱:
阅读排行