作为开发者,我们经常需要根据数据集生成 Excel 文件。虽然这类需求并不频繁,但每次需要时总会忘记部分实现细节。因此我决定记录一个示例并分享出来,希望能帮助到有需要的人。
首先需要安装 NPOI 库。在 aardio 中可以通过 NPOP 扩展库来调用 NPOI 组件:
import NPOI;
NPOI 包含多个命名空间,我们主要使用以下两个:
// 用于操作 HSSFWorkbook、HSSFFont、HSSFCellStyle 等对象
import NPOI.HSSF.UserModel;
// 用于定义 ISheet、IRow、ICell 等接口
import NPOI.SS.UserModel;
创建 Excel 的基本流程很简单:
为了简化单元格创建过程,我们可以先编写一个辅助函数:
// 创建单元格的辅助函数
createCell = function(currentRow, cellIndex, value, style){
var cell = currentRow.CreateCell(cellIndex);
cell.SetCellValue(value);
if(style) cell.CellStyle = style;
}
这样创建单元格时只需调用:
createCell(headerRow, cellIndex, "列标题", cellStyle);
下面是一个完整的示例,展示如何创建包含合并单元格和自动调整列宽的 Excel 文件:
import console;
import NPOI;
// 创建工作簿
var workbook = NPOI.HSSF.UserModel.HSSFWorkbook();
// 创建字体样式
var font = workbook.CreateFont();
font.FontHeightInPoints = 11;
font.FontName = "Tahoma";
// 创建单元格的辅助函数
createCell = function(currentRow, cellIndex, value, style){
var cell = currentRow.CreateCell(cellIndex);
cell.SetCellValue(value);
if(style) cell.CellStyle = style;
}
// 创建带边框的单元格样式
var cellStyle = workbook.CreateCellStyle();
cellStyle.SetFont(font);
cellStyle.BorderLeft = NPOI.SS.UserModel.BorderStyle.Medium;
cellStyle.BorderTop = NPOI.SS.UserModel.BorderStyle.Medium;
cellStyle.BorderRight = NPOI.SS.UserModel.BorderStyle.Medium;
cellStyle.BorderBottom = NPOI.SS.UserModel.BorderStyle.Medium;
cellStyle.VerticalAlignment = NPOI.SS.UserModel.VerticalAlignment.Center;
// 创建工作表
var sheet = workbook.CreateSheet("报表");
// 创建标题行
var headerRow = sheet.CreateRow(0);
// 添加表头
createCell(headerRow, 0, "批次名称", cellStyle);
createCell(headerRow, 1, "规则ID", cellStyle);
createCell(headerRow, 2, "规则类型", cellStyle);
createCell(headerRow, 3, "代码消息类型", cellStyle);
createCell(headerRow, 4, "严重程度", cellStyle);
// 数据起始行
var rowIndex = 1;
// 模拟数据集合
var batchErrorReports = {
{
Name = "批次1";
Rules = {
{RuleID="R001", RuleType="类型A", CodeMessageType="错误", Severity="高"},
{RuleID="R002", RuleType="类型B", CodeMessageType="警告", Severity="中"}
}
},
{
Name = "批次2";
Rules = {
{RuleID="R003", RuleType="类型C", CodeMessageType="信息", Severity="低"}
}
}
};
// 遍历数据集合
for i,batchErrorReport in batchErrorReports {
// 创建当前数据行
var currentRow = sheet.CreateRow(rowIndex);
createCell(currentRow, 0, batchErrorReport.Name, cellStyle);
// 计算需要合并的行数
var ruleCount = #batchErrorReport.Rules;
if(ruleCount > 1) {
var mergeIndex = (ruleCount - 1) + rowIndex;
// 合并单元格
var mergeRange = NPOI.SS.Util.CellRangeAddress(rowIndex, mergeIndex, 0, 0);
sheet.AddMergedRegion(mergeRange);
}
// 遍历规则集合
for j,rule in batchErrorReport.Rules {
if(j > 1) {
currentRow = sheet.CreateRow(rowIndex);
}
createCell(currentRow, 1, rule.RuleID, cellStyle);
createCell(currentRow, 2, rule.RuleType, cellStyle);
createCell(currentRow, 3, rule.CodeMessageType, cellStyle);
createCell(currentRow, 4, rule.Severity, cellStyle);
rowIndex++;
}
rowIndex = ruleCount >= 1 ? rowIndex : rowIndex + 1;
}
// 自动调整列宽
var lastColumn = sheet.GetRow(0).LastCellNum;
for(i=0; lastColumn;1){
sheet.AutoSizeColumn(i);
}
// 保存 Excel 文件
workbook.Write("/报表.xls"));
console.log("Excel 文件已生成:", filePath);
console.pause(true);
CellRangeAddress 类,参数依次是:起始行、结束行、起始列、结束列workbook.Write() 方法,不需要像 C# 中那样使用 FileStream通过这个示例,你可以快速掌握在 aardio 中使用 NPOI 生成 Excel 文件的基本方法。根据实际需求,你可以进一步扩展这个基础框架,添加更多样式和功能。