AnyLogic仿真中如何将Histogramdata直方图数据导出至Excel
直方图数据集导出Excel实现方案
不需要放弃Histogram类型数据集,也无需改用普通DataSet存储数据,可直接通过遍历Histogram内置的统计属性、分箱数据逐行写入Excel,同时完整保留Histogram数据集在用户交互界面自动展示均值等统计指标的能力。
原生方法不兼容的原因
excelFile.writeDataSet() 方法仅支持继承自标准DataSet类的二维表结构数据集,Histogram属于统计类专用数据集,内部存储结构为「全局统计值+分箱区间+分箱频数」,和普通DataSet的行列存储逻辑不匹配,因此无法直接调用该方法写入。
具体实现代码
在仿真结束触发的逻辑中写入如下代码,可完整导出直方图的统计指标和全量分箱数据:
// 定义Excel写入的起始位置 int initRow = 1; int initCol = 1; // 写入全局统计值(与UI界面展示的统计指标完全一致) excelFile.setCellValue("统计指标", initRow, initCol); excelFile.setCellValue("数值", initRow, initCol + 1); excelFile.setCellValue("样本总量", initRow + 1, initCol); excelFile.setCellValue(Histogramdata.size(), initRow + 1, initCol + 1); excelFile.setCellValue("均值", initRow + 2, initCol); excelFile.setCellValue(Histogramdata.mean(), initRow + 2, initCol + 1); excelFile.setCellValue("标准差", initRow + 3, initCol); excelFile.setCellValue(Histogramdata.stdDev(), initRow + 3, initCol + 1); excelFile.setCellValue("最小值", initRow + 4, initCol); excelFile.setCellValue(Histogramdata.min(), initRow + 4, initCol + 1); excelFile.setCellValue("最大值", initRow + 5, initCol); excelFile.setCellValue(Histogramdata.max(), initRow + 5, initCol + 1); // 偏移行位置,写入分箱明细数据表头 int binTableStartRow = initRow + 7; excelFile.setCellValue("分箱下限", binTableStartRow, initCol); excelFile.setCellValue("分箱上限", binTableStartRow, initCol + 1); excelFile.setCellValue("分箱频数", binTableStartRow, initCol + 2); excelFile.setCellValue("分箱占比", binTableStartRow, initCol + 3); // 遍历全部分箱,逐行写入明细数据 for (int binIdx = 0; binIdx < Histogramdata.getNumberOfBins(); binIdx++) { int curWriteRow = binTableStartRow + 1 + binIdx; excelFile.setCellValue(Histogramdata.getBinLowerBound(binIdx), curWriteRow, initCol); excelFile.setCellValue(Histogramdata.getBinUpperBound(binIdx), curWriteRow, initCol + 1); excelFile.setCellValue(Histogramdata.getBinHeight(binIdx), curWriteRow, initCol + 2); excelFile.setCellValue(Histogramdata.getBinHeight(binIdx) / Histogramdata.size(), curWriteRow, initCol + 3); } // 写入完成后保存Excel文件 excelFile.writeFile();
注意事项
- 代码中调用的
mean()、getBinLowerBound()等均为Histogram数据集的原生公开方法,不需要额外做类型转换,导出的统计值和交互界面展示的数值完全一致,无数据偏差。 - 如需导出多个直方图数据集,只需调整写入的起始行/起始列偏移量,重复上述逻辑即可,不需要修改原有Histogram数据集的配置。
- 该方案不需要额外将数据转存为普通DataSet,避免重复占用仿真内存,也不会出现普通DataSet无法自动计算展示统计值的问题。
内容的提问来源于stack exchange,提问作者Aron T.
相关产品推荐
相关产品推荐

