# 使用 NPOI 处理 Excel 97-2003 文档格式

NPOI 可使用 `NPOI.XSSF.Extractor.XSSFExcelExtractor` 类来提取 Excel 2007 格式（.xlsx）的工作簿内容。但对于 Excel 97-2003 格式（.xls 文件扩展名），需要改用不同的 API。要读取这类工作簿，你需要使用 `NPOI.HSSF.Extractor.ExcelExtractor` 类。这个类继承自基类 `NPOI.POIOLE2TextExtractor` 并实现了 `NPOI.SS.Extractor.IExcelExtractor` 接口，其公开的 `Text` 属性可以获取包含所有工作表内容的文档文本。

## API 使用方法

`ExcelExtractor` 接收一个 `NPOI.POIFS.FileSystem.POIFSFileSystem` 类型的输入参数，而该参数又需要一个 `System.IO.FileStream` 类型的输入。要读取 Excel 工作簿内容，首先需要创建 `FileStream` 实例（传入文件路径作为参数），然后创建 `POIFSFileSystem` 实例并将其传递给 `ExcelExtractor`，最后调用 `Text` 属性获取文档内容。

以下是 aardio 实现代码（注意处理访问/读取内容时可能出现的异常）：

```aardio
import NPOI;

var fileStream = System.IO.FileStream("/员工数据.xls", "r");
 
        
// 创建 POI 文件系统对象
var fileSystem = NPOI.POIFS.FileSystem.POIFSFileSystem(fileStream);

// 创建 Excel 提取器
var excelExtractor = NPOI.HSSF.Extractor.ExcelExtractor(fileSystem);

// 设置提取选项（均为可选参数）
excelExtractor.IncludeBlankCells = false;    // 是否包含空白单元格
excelExtractor.IncludeCellComments = false;   // 是否包含单元格批注
excelExtractor.IncludeHeaderFooter = false;   // 是否包含页眉页脚
excelExtractor.IncludeSheetNames = false;     // 是否包含工作表名称

print(excelExtractor.Text);
```

## 代码说明

1. **资源管理**：aardio 中不需要像 C# 那样显式使用 `using` 语句块，但需要手动在 `finally` 块中释放资源。

2. **异常处理**：使用 `try-catch` 捕获异常，aardio 的异常对象 `e` 会自动转换为字符串显示错误信息。

3. **可选参数**：所有 `Include*` 属性都是可选的，默认值为 `false`，可以根据需要调整。

4. **文件流**：`FileStream` 在 aardio 中创建后需要手动关闭和释放，这与 C# 的 `IDisposable` 模式一致。

5. **返回值**：函数返回提取的文本内容，如果出错则返回空字符串。

这个函数可以方便地提取旧版 Excel 文件中的所有文本内容，适用于数据迁移、内容分析等场景。