
## 使用 NPOI 库访问 Excel 2003 文件 - 分步指南

以下代码片段使用 NPOI 库打印 Excel 2003 文件的全部内容。首先使用标准流读取器读取 XLS 文件。可以根据需要将常用的标准标志应用于流读取器。流从 POIFSFileSystem 类读取，该类读写 Microsoft 的 OLE 2 复合文档格式，这是 Excel 文件格式的基础格式。最后，HSSFWorkbook 反映了 Excel 用户可见的 Excel 文件结构。

```aardio
import NPOI;

// 读取 Excel 文件
var workbook = NPOI.Workbook.Create("/员工数据.xls")

if (!workbook) {
    print("无法打开 Excel 工作簿" );
    return;
}

```

接下来，计算公式并创建数据格式化程序实例：

```aardio
// 计算公式
var formulaEvaluator = NPOI.XSSF.UserModel.XSSFFormulaEvaluator(workbook);

// 创建数据格式化程序（使用英语区域设置）
var dataFormatter = NPOI.SS.UserModel.DataFormatter(System.Globalization.CultureInfo("en-US"));
```

可以通过编号、名称或迭代器访问工作簿的各个工作表。以下是基于迭代器的示例：

```aardio
// 遍历所有工作表
for i,sheet in workbook.each() {
	print("***   工作表 " + sheet.SheetName + "   ***");
    // ... 处理每张工作表
}
```

同样使用迭代器访问给定工作表的行。从 IRow 类型变量中获取行号并打印到控制台输出：

```aardio
// 遍历工作表中的行 
for i,row in sheet.each() {
    print("行 " + string.format("%2d", row.RowNum + 1) + ": ");
    // ... 处理每行
}
```

现在提取行中每个单元格的内容，格式化后写入控制台。同样处理与单元格关联的批注：

```aardio
// 遍历行中的单元格
for i,cell in row.each() { 
    var value = dataFormatter.FormatCellValue(cell, formulaEvaluator); 
    print( value );
} 
```

## 使用 NPOI 库访问 Excel 2003 文件 - 完整示例

以下是完整代码片段，可与上面的 COM 互操作代码片段进行比较：

```aardio
import NPOI;

// 读取 Excel 文件
var workbook = NPOI.Workbook.Create("/员工数据.xls")

if (!workbook) {
    print("无法打开 Excel 工作簿" );
    return;
}

// 计算公式
var formulaEvaluator = NPOI.XSSF.UserModel.XSSFFormulaEvaluator(workbook);

// 创建数据格式化程序（使用英语区域设置）
var dataFormatter = NPOI.SS.UserModel.DataFormatter(System.Globalization.CultureInfo("en-US"));

// 遍历所有工作表
for i,sheet in workbook.each() {
    // 遍历工作表中的行 
    for i,row in sheet.each() {
        print("行 " + string.format("%2d", row.RowNum + 1) + ": ");
        // ... 处理每行
        
        // 遍历行中的单元格
        for i,cell in row.each() { 
            var value = dataFormatter.FormatCellValue(cell, formulaEvaluator); 
            var comment = cell.CellComment ? cell.CellComment.String;
            print( value,comment );
        } 
    }
}
```