张家口市网站建设_网站建设公司_论坛网站_seo优化
2025/12/31 14:12:51 网站建设 项目流程

第三章:核心架构与基础概念

3.1 ReoGrid架构概述

3.1.1 整体架构

ReoGrid采用分层架构设计,从下至上分为以下几层:

┌─────────────────────────────────────────┐
│      应用层 (Application Layer)          │
│  用户代码、业务逻辑、事件处理              │
└─────────────────────────────────────────┘↓ ↑ 使用 / 事件
┌─────────────────────────────────────────┐
│      控件层 (Control Layer)              │
│  ReoGridControl、WorksheetControl        │
└─────────────────────────────────────────┘↓ ↑ 操作 / 通知
┌─────────────────────────────────────────┐
│      核心层 (Core Layer)                 │
│  Workbook、Worksheet、Cell、Range        │
└─────────────────────────────────────────┘↓ ↑ 数据 / 状态
┌─────────────────────────────────────────┐
│      功能层 (Feature Layer)              │
│  Formula、Chart、Print、IO、Actions      │
└─────────────────────────────────────────┘↓ ↑ 调用 / 结果
┌─────────────────────────────────────────┐
│      渲染层 (Rendering Layer)            │
│  Graphics、ViewportController、Painter    │
└─────────────────────────────────────────┘↓ ↑ 绘制 / 输入
┌─────────────────────────────────────────┐
│      平台层 (Platform Layer)             │
│  WinForms、WPF、Android、Drawing         │
└─────────────────────────────────────────┘

3.1.2 核心组件关系

// 组件关系示意
ReoGridControl                           // 主控件└─ Workbook                         // 工作簿├─ Worksheets[]                 // 工作表集合│   └─ Worksheet                // 单个工作表│       ├─ Cells[,]            // 单元格网格│       ├─ Rows[]              // 行集合│       ├─ Columns[]           // 列集合│       ├─ Ranges[]            // 命名区域│       ├─ Charts[]            // 图表集合│       ├─ FloatingObjects[]   // 浮动对象│       └─ Settings            // 工作表设置├─ ActionManager                // 操作管理器│   ├─ UndoStack               // 撤销栈│   └─ RedoStack               // 重做栈└─ FormulaEngine                // 公式引擎├─ Functions[]             // 内置函数└─ CustomFunctions[]       // 自定义函数

3.1.3 数据流向

用户操作↓
输入处理 (MouseHandler / KeyboardHandler)↓
动作创建 (Action)↓
动作执行 (DoAction)↓
数据模型更新 (Cell / Range Update)↓
事件触发 (CellDataChanged Event)↓
公式计算 (Formula Calculation)↓
视图失效 (Invalidate)↓
重新渲染 (Render)↓
界面更新

3.2 Workbook工作簿

3.2.1 Workbook概念

Workbook是ReoGrid的顶层容器,代表一个完整的电子表格文件。

using unvell.ReoGrid;// 获取Workbook实例
var workbook = grid.Workbook;// Workbook属性
Console.WriteLine($"工作表数量: {workbook.Worksheets.Count}");
Console.WriteLine($"当前工作表: {workbook.CurrentWorksheet.Name}");

3.2.2 Workbook管理

创建和管理工作表

using unvell.ReoGrid;public class WorkbookManager
{private ReoGridControl grid;public WorkbookManager(ReoGridControl gridControl){grid = gridControl;}/// <summary>/// 创建新工作表/// </summary>public Worksheet CreateWorksheet(string name){var sheet = grid.CreateWorksheet(name);return sheet;}/// <summary>/// 获取指定工作表/// </summary>public Worksheet GetWorksheet(string name){return grid.Worksheets[name];}/// <summary>/// 删除工作表/// </summary>public void RemoveWorksheet(string name){var sheet = grid.Worksheets[name];grid.RemoveWorksheet(sheet);}/// <summary>/// 切换当前工作表/// </summary>public void SwitchToWorksheet(string name){grid.CurrentWorksheet = grid.Worksheets[name];}/// <summary>/// 重命名工作表/// </summary>public void RenameWorksheet(string oldName, string newName){var sheet = grid.Worksheets[oldName];sheet.Name = newName;}/// <summary>/// 复制工作表/// </summary>public Worksheet CopyWorksheet(string sourceName, string targetName){var sourceSheet = grid.Worksheets[sourceName];var newSheet = grid.CreateWorksheet(targetName);// 复制数据和样式CopyWorksheetContent(sourceSheet, newSheet);return newSheet;}private void CopyWorksheetContent(Worksheet source, Worksheet target){// 复制单元格数据for (int row = 0; row < source.RowCount; row++){for (int col = 0; col < source.ColumnCount; col++){var cell = source.GetCell(row, col);if (cell != null){target[row, col] = cell.Data;target.SetCellStyles(row, col, cell.Style);}}}}
}

3.2.3 Workbook设置

using unvell.ReoGrid;public class WorkbookConfiguration
{public static void ConfigureWorkbook(ReoGridControl grid){// 公式相关grid.SetSettings(WorkbookSettings.Formula_AutoCalculate, true);grid.SetSettings(WorkbookSettings.Formula_AutoUpdateReferenceCell, true);// 编辑相关grid.SetSettings(WorkbookSettings.Edit_Readonly, false);grid.SetSettings(WorkbookSettings.Edit_AllowSelectRange, true);grid.SetSettings(WorkbookSettings.Edit_AutoFormatCell, true);grid.SetSettings(WorkbookSettings.Edit_DragSelectionToMoveCells, true);grid.SetSettings(WorkbookSettings.Edit_DragSelectionToFillSerial, true);// 视图相关grid.SetSettings(WorkbookSettings.View_ShowGridLine, true);grid.SetSettings(WorkbookSettings.View_ShowRowHeader, true);grid.SetSettings(WorkbookSettings.View_ShowColumnHeader, true);grid.SetSettings(WorkbookSettings.View_ShowPageBreaks, false);grid.SetSettings(WorkbookSettings.View_ShowFrozenLine, true);// 行为相关grid.SetSettings(WorkbookSettings.Behavior_BeforeRangeMove, true);grid.SetSettings(WorkbookSettings.Behavior_BeforeRangeDelete, true);}
}

3.3 Worksheet工作表

3.3.1 Worksheet概念

Worksheet是实际包含数据的工作表,是用户操作的主要对象。

using unvell.ReoGrid;// 获取当前工作表
var sheet = grid.CurrentWorksheet;// 工作表基本信息
Console.WriteLine($"工作表名称: {sheet.Name}");
Console.WriteLine($"行数: {sheet.MaxContentRow}");
Console.WriteLine($"列数: {sheet.MaxContentCol}");
Console.WriteLine($"是否只读: {sheet.IsReadonly}");

3.3.2 工作表操作

尺寸管理

using unvell.ReoGrid;public class WorksheetSizeManager
{private Worksheet sheet;public WorksheetSizeManager(Worksheet worksheet){sheet = worksheet;}/// <summary>/// 设置默认行高/// </summary>public void SetDefaultRowHeight(ushort height){sheet.SetRowsHeight(0, sheet.RowCount, height);}/// <summary>/// 设置默认列宽/// </summary>public void SetDefaultColumnWidth(ushort width){sheet.SetColumnsWidth(0, sheet.ColumnCount, width);}/// <summary>/// 设置指定行的高度/// </summary>public void SetRowHeight(int row, ushort height){sheet.SetRowsHeight(row, 1, height);}/// <summary>/// 设置指定列的宽度/// </summary>public void SetColumnWidth(int col, ushort width){sheet.SetColumnsWidth(col, 1, width);}/// <summary>/// 自动调整列宽/// </summary>public void AutoFitColumn(int col){sheet.AutoFitColumnWidth(col);}/// <summary>/// 自动调整行高/// </summary>public void AutoFitRow(int row){sheet.AutoFitRowHeight(row);}/// <summary>/// 隐藏行/// </summary>public void HideRow(int row){sheet.HideRows(row, 1);}/// <summary>/// 显示行/// </summary>public void ShowRow(int row){sheet.ShowRows(row, 1);}
}

插入和删除

using unvell.ReoGrid;public class WorksheetEditManager
{private Worksheet sheet;public WorksheetEditManager(Worksheet worksheet){sheet = worksheet;}/// <summary>/// 插入行/// </summary>public void InsertRows(int row, int count){sheet.InsertRows(row, count);}/// <summary>/// 删除行/// </summary>public void DeleteRows(int row, int count){sheet.DeleteRows(row, count);}/// <summary>/// 插入列/// </summary>public void InsertColumns(int col, int count){sheet.InsertColumns(col, count);}/// <summary>/// 删除列/// </summary>public void DeleteColumns(int col, int count){sheet.DeleteColumns(col, count);}/// <summary>/// 清空工作表/// </summary>public void Clear(){sheet.Reset();}/// <summary>/// 清空指定区域/// </summary>public void ClearRange(string range){sheet.DeleteRangeData(new RangePosition(range));}
}

3.3.3 工作表事件

using System;
using unvell.ReoGrid;
using unvell.ReoGrid.Events;public class WorksheetEventHandler
{private Worksheet sheet;public WorksheetEventHandler(Worksheet worksheet){sheet = worksheet;RegisterEvents();}private void RegisterEvents(){// 单元格数据变化事件sheet.CellDataChanged += OnCellDataChanged;// 选择变化事件sheet.SelectionRangeChanged += OnSelectionChanged;// 单元格编辑事件sheet.BeforeCellEdit += OnBeforeCellEdit;sheet.CellEdit += OnCellEdit;// 行列变化事件sheet.RowsInserted += OnRowsInserted;sheet.RowsDeleted += OnRowsDeleted;sheet.ColumnsInserted += OnColumnsInserted;sheet.ColumnsDeleted += OnColumnsDeleted;}private void OnCellDataChanged(object sender, CellEventArgs e){Console.WriteLine($"单元格 [{e.Cell.Row}, {e.Cell.Column}] 数据已更改");Console.WriteLine($"新值: {e.Cell.Data}");}private void OnSelectionChanged(object sender, RangeEventArgs e){Console.WriteLine($"选择区域已更改: {e.Range}");}private void OnBeforeCellEdit(object sender, CellBeforeEditEventArgs e){// 可以在这里阻止编辑if (e.Cell.Row == 0) // 禁止编辑第一行{e.IsCancelled = true;}}private void OnCellEdit(object sender, CellEditEventArgs e){Console.WriteLine($"单元格正在编辑: {e.Cell.Position}");}private void OnRowsInserted(object sender, RowsInsertedEventArgs e){Console.WriteLine($"插入了 {e.Count} 行,起始行: {e.Index}");}private void OnRowsDeleted(object sender, RowsDeletedEventArgs e){Console.WriteLine($"删除了 {e.Count} 行,起始行: {e.Index}");}private void OnColumnsInserted(object sender, ColumnsInsertedEventArgs e){Console.WriteLine($"插入了 {e.Count} 列,起始列: {e.Index}");}private void OnColumnsDeleted(object sender, ColumnsDeletedEventArgs e){Console.WriteLine($"删除了 {e.Count} 列,起始列: {e.Index}");}
}

3.4 Cell单元格

3.4.1 Cell概念与结构

using unvell.ReoGrid.Data;// Cell的核心属性
public class CellStructure
{public void ShowCellInfo(Cell cell){if (cell != null){// 位置信息Console.WriteLine($"行: {cell.Row}");Console.WriteLine($"列: {cell.Column}");Console.WriteLine($"地址: {cell.Address}");// 数据信息Console.WriteLine($"数据类型: {cell.DataFormat}");Console.WriteLine($"数据值: {cell.Data}");Console.WriteLine($"显示文本: {cell.DisplayText}");// 样式信息Console.WriteLine($"字体: {cell.Style.FontName}");Console.WriteLine($"字号: {cell.Style.FontSize}");Console.WriteLine($"背景色: {cell.Style.BackColor}");// 公式信息if (cell.HasFormula){Console.WriteLine($"公式: {cell.Formula}");}// 状态信息Console.WriteLine($"是否只读: {cell.IsReadonly}");Console.WriteLine($"是否合并: {cell.IsMergedCell}");}}
}

3.4.2 单元格数据操作

using System;
using unvell.ReoGrid;
using unvell.ReoGrid.Data;public class CellDataOperations
{private Worksheet sheet;public CellDataOperations(Worksheet worksheet){sheet = worksheet;}/// <summary>/// 设置单元格数据/// </summary>public void SetCellData(){// 方式1:使用地址sheet["A1"] = "文本";// 方式2:使用索引sheet[0, 1] = 123;// 方式3:使用Positionsheet.SetCellData(new CellPosition(0, 2), DateTime.Now);// 方式4:使用SetCellDatasheet.SetCellData(0, 3, "数据", CellDataFormatFlag.Text);}/// <summary>/// 读取单元格数据/// </summary>public object GetCellData(int row, int col){var cell = sheet.GetCell(row, col);if (cell != null){// 获取原始数据var data = cell.Data;// 获取显示文本var text = cell.DisplayText;// 获取特定类型数据if (cell.DataFormat == CellDataFormatFlag.Number){return Convert.ToDouble(data);}else if (cell.DataFormat == CellDataFormatFlag.DateTime){return Convert.ToDateTime(data);}return data;}return null;}/// <summary>/// 批量设置数据/// </summary>public void BatchSetData(int startRow, int startCol, object[,] data){int rows = data.GetLength(0);int cols = data.GetLength(1);for (int r = 0; r < rows; r++){for (int c = 0; c < cols; c++){sheet[startRow + r, startCol + c] = data[r, c];}}}/// <summary>/// 清除单元格数据/// </summary>public void ClearCellData(int row, int col){sheet[row, col] = null;}
}

3.4.3 单元格样式

using System.Drawing;
using unvell.ReoGrid.Data;
using unvell.ReoGrid.Graphics;public class CellStyleOperations
{private Worksheet sheet;public CellStyleOperations(Worksheet worksheet){sheet = worksheet;}/// <summary>/// 设置基础样式/// </summary>public void SetBasicStyle(string address){sheet.SetCellStyle(address, new WorksheetRangeStyle{Flag = PlainStyleFlag.FontName | PlainStyleFlag.FontSize | PlainStyleFlag.FontColor,FontName = "微软雅黑",FontSize = 12,FontColor = Color.Blue});}/// <summary>/// 设置背景和边框/// </summary>public void SetBackgroundAndBorder(string address){sheet.SetCellStyle(address, new WorksheetRangeStyle{Flag = PlainStyleFlag.BackColor | PlainStyleFlag.Border,BackColor = Color.LightYellow,Border = new RangeBorderStyle{Left = new BorderStyle { Color = Color.Black, Style = BorderLineStyle.Solid },Top = new BorderStyle { Color = Color.Black, Style = BorderLineStyle.Solid },Right = new BorderStyle { Color = Color.Black, Style = BorderLineStyle.Solid },Bottom = new BorderStyle { Color = Color.Black, Style = BorderLineStyle.Solid }}});}/// <summary>/// 设置对齐方式/// </summary>public void SetAlignment(string address){sheet.SetCellStyle(address, new WorksheetRangeStyle{Flag = PlainStyleFlag.HorizontalAlign | PlainStyleFlag.VerticalAlign,HAlign = ReoGridHorAlign.Center,VAlign = ReoGridVerAlign.Middle});}/// <summary>/// 设置数字格式/// </summary>public void SetNumberFormat(string address, CellDataFormatFlag format){sheet.SetRangeDataFormat(address, format);}/// <summary>/// 设置自定义格式/// </summary>public void SetCustomFormat(string address, string formatString){sheet.SetRangeDataFormat(address, CellDataFormatFlag.Custom, new NumberDataFormatter.NumberFormatArgs{Pattern = formatString});}
}

3.5 Range区域

3.5.1 Range概念

Range代表工作表中的一个或多个连续单元格区域。

using unvell.ReoGrid;public class RangeOperations
{/// <summary>/// 创建Range的多种方式/// </summary>public void CreateRangeExamples(){// 方式1:使用字符串地址var range1 = new RangePosition("A1:C10");// 方式2:使用行列索引var range2 = new RangePosition(0, 0, 10, 3); // row, col, rows, cols// 方式3:使用开始和结束位置var range3 = new RangePosition(new CellPosition(0, 0),    // 起始位置new CellPosition(9, 2)     // 结束位置);// Range信息Console.WriteLine($"起始行: {range1.Row}");Console.WriteLine($"起始列: {range1.Col}");Console.WriteLine($"行数: {range1.Rows}");Console.WriteLine($"列数: {range1.Cols}");Console.WriteLine($"地址: {range1.ToAddress()}");}
}

3.5.2 区域操作

using System;
using unvell.ReoGrid;
using unvell.ReoGrid.Data;public class RangeManager
{private Worksheet sheet;public RangeManager(Worksheet worksheet){sheet = worksheet;}/// <summary>/// 设置区域样式/// </summary>public void SetRangeStyle(string range, WorksheetRangeStyle style){sheet.SetRangeStyles(range, style);}/// <summary>/// 复制区域/// </summary>public void CopyRange(string sourceRange, string targetRange){var data = sheet.GetPartialGrid(new RangePosition(sourceRange));sheet.SetPartialGrid(new RangePosition(targetRange), data);}/// <summary>/// 移动区域/// </summary>public void MoveRange(string sourceRange, string targetAddress){var source = new RangePosition(sourceRange);var target = new CellPosition(targetAddress);sheet.MoveRange(source, target);}/// <summary>/// 填充区域/// </summary>public void FillRange(string range, object value){var rangePos = new RangePosition(range);for (int r = rangePos.Row; r < rangePos.EndRow; r++){for (int c = rangePos.Col; c < rangePos.EndCol; c++){sheet[r, c] = value;}}}/// <summary>/// 序列填充/// </summary>public void FillSerial(string range, int start, int step){var rangePos = new RangePosition(range);int value = start;for (int r = rangePos.Row; r < rangePos.EndRow; r++){for (int c = rangePos.Col; c < rangePos.EndCol; c++){sheet[r, c] = value;value += step;}}}/// <summary>/// 查找和替换/// </summary>public int FindAndReplace(string range, object findValue, object replaceValue){var rangePos = new RangePosition(range);int count = 0;for (int r = rangePos.Row; r < rangePos.EndRow; r++){for (int c = rangePos.Col; c < rangePos.EndCol; c++){var cell = sheet.GetCell(r, c);if (cell != null && Equals(cell.Data, findValue)){sheet[r, c] = replaceValue;count++;}}}return count;}
}

3.6 渲染机制

3.6.1 渲染流程

用户操作/数据变化↓
Invalidate() - 标记区域失效↓
Paint事件触发↓
BeginDraw() - 开始绘制↓
DrawGrid() - 绘制网格↓
DrawCells() - 绘制单元格├─ DrawCellBackground() - 绘制背景├─ DrawCellBorder() - 绘制边框├─ DrawCellText() - 绘制文本└─ DrawCellContent() - 绘制内容↓
DrawSelection() - 绘制选择框↓
DrawFloatingObjects() - 绘制浮动对象↓
EndDraw() - 结束绘制

3.6.2 视口与虚拟化

using unvell.ReoGrid;public class ViewportManager
{private Worksheet sheet;public ViewportManager(Worksheet worksheet){sheet = worksheet;}/// <summary>/// 获取可见区域/// </summary>public RangePosition GetVisibleRange(){return sheet.VisibleRange;}/// <summary>/// 滚动到指定单元格/// </summary>public void ScrollToCell(string address){var pos = new CellPosition(address);sheet.ScrollToCell(pos);}/// <summary>/// 滚动到指定区域/// </summary>public void ScrollToRange(string range){var rangePos = new RangePosition(range);sheet.ScrollToRange(rangePos);}/// <summary>/// 设置缩放级别/// </summary>public void SetZoom(float scale){sheet.SetScale(scale);}
}

3.7 Action操作系统

3.7.1 Action概念

Action是ReoGrid中所有可撤销操作的基础,采用命令模式实现。

using unvell.ReoGrid.Actions;// Action的生命周期
DoAction()      // 执行操作↓
Undo()          // 撤销操作↓
Redo()          // 重做操作

3.7.2 使用Action

using unvell.ReoGrid;
using unvell.ReoGrid.Actions;public class ActionExample
{private ReoGridControl grid;public ActionExample(ReoGridControl gridControl){grid = gridControl;}/// <summary>/// 使用Action设置数据/// </summary>public void SetDataWithAction(int row, int col, object data){var action = new SetCellDataAction(row, col, data);grid.DoAction(action);}/// <summary>/// 撤销操作/// </summary>public void UndoLastAction(){if (grid.CanUndo()){grid.Undo();}}/// <summary>/// 重做操作/// </summary>public void RedoLastAction(){if (grid.CanRedo()){grid.Redo();}}/// <summary>/// 重复上次操作/// </summary>public void RepeatLastAction(RangePosition targetRange){grid.RepeatLastAction(targetRange);}
}

3.8 本章小结

✅ 本章学习内容

  1. ReoGrid架构

    • 整体架构层次
    • 核心组件关系
    • 数据流向
  2. Workbook工作簿

    • Workbook概念
    • 工作表管理
    • 全局设置
  3. Worksheet工作表

    • 工作表操作
    • 尺寸管理
    • 事件处理
  4. Cell单元格

    • 单元格结构
    • 数据操作
    • 样式设置
  5. Range区域

    • 区域概念
    • 区域操作
    • 批量处理
  6. 渲染机制

    • 渲染流程
    • 视口管理
    • 虚拟化技术
  7. Action系统

    • Action概念
    • 撤销重做
    • 操作管理

📚 下一章预告

在第四章中,我们将详细学习:

  • 单元格数据读写的各种方法
  • 数据类型与格式化
  • 批量数据操作
  • 数据验证
  • 导入导出

继续学习第四章:工作表与单元格操作!

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询