# dotNet.ReoGrid 扩展库 - 内存工作簿（Memory Workbook）

创建内存工作簿是一种高效的选择，特别适用于需要从Excel文件加载数据、编辑工作表内容，然后另存为新Excel文件的场景。与传统创建屏幕控件的方式不同，内存工作簿无需屏幕控件实例，也不包含视口控制器、鼠标键盘控制器等界面模块。这使得它比基于屏幕控件的实现方式更加轻量高效。

![342](../images/342.png) 图示：从浏览器上传Excel或CSV文件并将数据处理到数据库中

![343](../images/343.png) 图示：从ASP.NET表单页面下载生成的Excel或CSV文件

在aardio中初始化内存工作簿的语法如下：

```aardio
import dotNet.ReoGrid;
var workbook = ReoGrid.ReoGridControl.CreateMemoryWorkbook();
```

将工作簿保存为Excel文件到下载流：

```aardio
// 参数1指定输出流，参数2指定文件格式（Excel2007对应数值30）
workbook.Save(stream, 30);
```

加载Excel文件到内存工作簿：

```aardio
// 参数1指定文件路径，参数2可选指定格式（0表示自动检测）
workbook.Load("C:\MyTemplate.xlsx");
```

### 可用API

加载/保存Excel文件的API，以及访问工作表中数据和样式的所有方法，都与屏幕组件保持完全一致。

* **工作表管理API**
    * 创建和添加：`CreateWorksheet`, `AddWorksheet`
    * 插入和移除：`InsertWorksheet`, `RemoveWorksheet`
    * 复制和移动：`CopyWorksheet`, `MoveWorksheet`
    * 查询获取：`GetWorksheetByName`, `GetWorksheetIndex`
* **Worksheets集合**
    * 访问工作簿中的工作表集合
* **加载/保存操作**
    * 支持加载/保存Excel模板文件或RGF文件
* **工作簿事件**
    * 所有工作簿相关事件
* **内部操作异常通知**
    * 内部操作发生异常时的通知

### 不可用API

由于内存工作簿的特性，以下API不被支持：

* **CurrentWorksheet属性**  
  内存工作簿没有工作表标签页，因此不存在"当前激活工作表"的概念，应通过工作簿对象的`Worksheets`集合属性访问工作表。

* **滚动相关方法和事件**  
  内存工作簿不包含滚动条组件。

* **外观样式**  
  内存工作簿不提供任何外观样式设置。

* **UI相关方法**  
  如`FitWidthToCells`和`FitHeightToCells`等需要图形信息的方法不可用，因为内存工作簿没有图形对象。

* **操作相关方法**  
  如`DoAction`, `Undo`, `Redo`, `RepeatLastAction`等方法不可用。所有对内存工作簿的操作都是即时执行的且不可撤销。

## 在Web应用中使用内存工作簿

在Web应用中，ReoGrid内存工作簿非常适合处理从网页客户端上传的电子表格数据，或生成供下载的Excel文件。

![344](../images/344.png)

### [示例：创建并下载Excel文件](#示例创建并下载excel文件)

在ASP.NET应用中，可以在页面类中实现以下代码来生成Excel文件并提示用户下载：

```aardio
// 创建内存工作簿实例
var grid = ReoGrid.ReoGridControl.CreateMemoryWorkbook();

// 获取默认的第一个工作表（新工作簿包含一个空白工作表）
var sheet1 = grid.Worksheets[0];

// 在A1单元格填入文本
sheet1["A1"] = "Hello World";

// 在A2到E2区域填入数据和公式
sheet1["A2:D2"] = [ 
    [10, 20, "=A2+B2", "=SUM(A2:C2)"] 
];

// 准备文件下载响应（此处为伪代码，实际web开发需结合具体框架）
/*
Response.Clear();
Response.ContentType = "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet";
Response.AddHeader("Content-Disposition", "attachment; filename=SampleData.xlsx");
*/

// 以Excel 2007格式保存工作簿到输出流
grid.Save(io.open("SampleData.xlsx","w+b"), 30/*Excel2007*/);

/*
Response.Flush();
Response.End();
*/
```

> **aardio使用说明**：
> 1. 实际web开发中需要根据具体web框架处理响应流
> 2. `FileFormat.Excel2007`在aardio中对应数值30，直接使用数值更高效
> 3. 公式语法与Excel完全一致，可直接使用
> 4. 多维数组赋值时注意aardio数组起始索引为1，但ReoGrid接口保持.NET习惯使用0起始索引