# dotNet.ReoGrid 扩展库 - RGF 文件格式

RGF 是一种包含 ReoGrid 工作表数据的文件格式，可保存[单元格样式](../cell/style.html)、[边框](../cell/border.html)、[公式](../formula.html)等信息。该格式可通过 ReoGrid 控件和 ReoGridEditor 编辑器进行读写。

RGF 是基于 XML 的文件格式，用于描述 ReoGrid 组件中的电子表格。要保存为 RGF 文件，可使用工作表的 `SaveRGF` 方法：

```aardio
// 保存工作表到 RGF 文件
sheet1.SaveRGF(文件路径或流对象);
```

要加载 RGF 文件，使用工作表的 `LoadRGF` 方法：

```aardio
// 从 RGF 文件加载工作表
sheet1.LoadRGF(文件路径或流对象);
```

## RGF 文件示例

以下是 RGF 文件的部分内容：

```xml
<?xml version="1.0"?>
<grid xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
  <head>
    <meta>
      <culture>en-US</culture>
      <editor>ReoGrid Core</editor>
      <core-ver>0.8.9.2</core-ver>
    </meta>
    <print-settings>
      <paper-size>A4</paper-size>
      ...
    </print-settings>
  </head>
  <style color="#000000" font="Arial" font-size="9.75" bold="true" align="left" valign="middle" />
  <rows>
    <row row="0" height="11" auto-height="false" />
    ...
  </rows>
  <cols>
    <col col="0" width="10" auto-width="false" />
    ...
  </cols>
  <v-borders>
    <v-border row="23" col="3" color="#000000" style="Solid" pos="left" rows="8" />
    ...
  </v-borders>
  <h-borders>
    <h-border row="3" col="1" color="#000000" style="BoldSolid" pos="top" cols="14" />
    ...
  </h-borders>
  <cells>
    <cell row="1" col="1" colspan="14" format="text">Project Cost Summary
      <style bgcolor="#00007d" color="#ffffff" font-size="20.25" align="center" />
    </cell>
    ...
  </cells>
</grid>
```

## RGF 文件 XML 结构

### 根元素

```xml
<grid>...</grid>
```

### head 元素

head 元素存储基本信息，如单元格数量、视图设置、打印设置等。

### meta 元素

meta 元素存储工作表的元信息，如区域信息和 ReoGrid 版本：

```xml
<meta>
  <culture>en-US</culture>
  <editor>ReoGrid Core</editor>
  <core-ver>0.8.9.2</core-ver>
</meta>
```

### rows 和 cols 元素

rows 和 cols 元素存储工作表的行数和列数：

```xml
<rows>100</rows>
<cols>50</cols>
```

### print-settings 元素

print-settings 元素存储当前工作表的打印和打印机设置：

```xml
<print-settings>
  <page-break-rows>0,42</page-break-rows>
  <page-break-cols>1,15</page-break-cols>
  <scale-factor>0.8637016</scale-factor>
  <paper-size>A4</paper-size>
  <landscape>true</landscape>
  <page-order>down-over</page-order>
</print-settings>
```

### settings 元素

settings 元素存储工作表设置，如是否显示网格线或分页符：

```xml
<settings meta="2087944062">
  <show-page-break>true</show-page-break>
</settings>
```

### style 元素

style 元素存储单元格、行和列的样式信息：

```xml
<style color="#000000" font="Arial" font-size="9.75" bold="true" align="left" valign="middle" />
```

### row 元素

row 元素存储行标题信息，如行高和行标题：

```xml
<row row="0" height="11" auto-height="false" />
```

### column 元素

column 元素存储列标题信息，如列宽和列标题：

```xml
<col col="0" width="10" auto-width="false" />
```

### h-border 和 v-border 元素

h-border 和 v-border 元素存储电子表格的边框信息：

```xml
<v-border row="24" col="4" color="#000000" style="Dotted" pos="all" rows="7" />
```

### cell 元素

cell 元素存储单元格信息，如单元格数据、样式和数据格式：

```xml
<cell row="1" col="1" colspan="14" format="text">
  <style bgcolor="#00007d" color="#ffffff" font-size="20.25" align="center" />
  Project Cost Summary
</cell>
```

### 保存图像

当使用 CellTypes.ImageCell 在单元格中显示图像时，图像也会保存在 RGF 中：

```xml
<cell row="0" col="0" body-type="ImageCell">image/png,iVBORw0KGgoAAAANSUhEUgA...M1P+eGgAAAABJRU5ErkJggg==</cell>
```

## 保存与加载

### 单个工作表

通过工作表实例调用方法保存或加载单个工作表：

```aardio
// 保存
sheet1.SaveRGF(文件或流对象);
// 加载
sheet1.LoadRGF(文件或流对象);
```

### 多个工作表或整个工作簿

当前版本的 ReoGrid 不支持将整个工作簿保存为 RGF 格式。应用程序应通过每个工作表调用方法来保存和加载。

以下是保存和加载工作簿中多个工作表的实践：

#### 保存多个工作表

```aardio
// 创建保存列表
var savingList = {};
for(i=1; #reoGridControl.Worksheets; 1){
    var sheet = reoGridControl.Worksheets[i];
    if( _ShouldSaveThisWorksheet(sheet) ){
        // 保存
        sheet.SaveRGF(io.localpath("/MyPath/"++sheet1.Name++".rgf"));
        // 添加工作表名到保存列表
        table.push(savingList, sheet.Name);
    }
}
```

#### 加载多个工作表

```aardio
for(i=1; #savingList; 1){
    var sheetName = savingList[i];
    // 按名称创建工作表实例
    var sheet = reoGridControl.CreateWorksheet(sheetName);
    // 从文件加载工作表
    sheet.LoadRGF(io.localpath("/MyPath/"++sheetName++".rgf"));
}
```

### 目标：通用流

```aardio
// 创建内存流
var ms = System.IO.MemoryStream();
try {
    // 保存
    sheet1.SaveRGF(ms);
    // 加载
    sheet1.LoadRGF(ms);
}
finally {
    ms.Dispose();
}
```

### 目标：文件

```aardio
// 保存
sheet1.SaveRGF(io.localpath("/MyPath/MyFile.rgf"));
// 加载
sheet1.LoadRGF(io.localpath("/MyPath/MyFile.rgf"));
```

### 目标：字节数组

```aardio
var buf = null;
// 保存
var ms = System.IO.MemoryStream();
try {
    sheet1.SaveRGF(ms);
    buf = ms.ToArray();
}
finally {
    ms.Dispose();
}

// 加载
var ms = System.IO.MemoryStream(buf);
try {
    sheet1.LoadRGF(ms);
}
finally {
    ms.Dispose();
}
```

### 目标：字符串

```aardio
var content = null;
// 保存
var ms = System.IO.MemoryStream();
try {
    sheet1.SaveRGF(ms);
    content = System.Text.Encoding.Default.GetString(ms.ToArray());
}
finally {
    ms.Dispose();
}

// 加载
var ms = System.IO.MemoryStream(System.Text.Encoding.Default.GetBytes(content));
try {
    sheet1.LoadRGF(ms);
}
finally {
    ms.Dispose();
}
```

### 与 Excel 文件格式的区别

ReoGrid 格式与 Excel 格式在保存工作表时存在一些差异，详情请参阅 [Excel 与 RGF 格式的区别](../io/difference-between-excel-and-rgf-format.html)。