如何在AnyLogic参数变异实验中为Excel创建新工作表?
在AnyLogic参数变异实验中,每次运行后创建独立Excel工作表保存数据
核心解决思路
无需引入额外Java包,直接使用AnyLogic内置的Excel API(基于Apache POI封装,无需额外导入),在参数变异实验的「每次运行结束」回调中编写代码,完成新建工作表、写入数据的操作。
具体实现步骤
1. 准备Excel文件(可选,支持动态创建)
可以手动创建空Excel文件并存入模型的resources文件夹,方便路径引用;也可通过代码自动创建不存在的目标文件。
2. 配置参数变异实验的回调代码
打开参数变异实验的「高级」选项卡,找到「每次运行结束」(After each run)的代码框,写入以下代码:
// 1. 定义Excel文件路径,使用模型所在文件夹路径确保兼容性 String excelPath = getModelPath() + "/experiment_results.xlsx"; // 2. 初始化Excel对象,true表示启用写入权限 Excel excel = new Excel(excelPath, true); // 3. 生成唯一工作表名称,用实验内置运行索引区分(runIndex从0开始,+1让编号从1起始) String sheetName = "Run_" + (experiment.getRunIndex() + 1); // 4. 处理工作表名称重复问题(可选,避免覆盖已有数据) if (excel.getSheetNames().contains(sheetName)) { sheetName += "_" + System.currentTimeMillis(); // 追加时间戳保证唯一性 } // 5. 创建新工作表 excel.createSheet(sheetName); // 6. 写入数据(示例:替换为你实际收集的KPI变量) // 写入表头 excel.setCellValue(sheetName, 0, 0, "KPI名称"); excel.setCellValue(sheetName, 0, 1, "数值"); // 写入具体KPI数据 excel.setCellValue(sheetName, 1, 0, "平均等待时间"); excel.setCellValue(sheetName, 1, 1, averageWaitTime); // 替换为你的KPI变量名 excel.setCellValue(sheetName, 2, 0, "系统吞吐量"); excel.setCellValue(sheetName, 2, 1, systemThroughput); // 替换为你的KPI变量名 // 7. 必须执行保存+关闭,否则数据不会写入文件 excel.save(); excel.close();
3. 关键细节说明
- 运行索引使用:
experiment.getRunIndex()是参数变异实验内置的运行计数器,从0开始递增,可直接用来区分不同运行,无需自行维护计数器。 - 路径兼容性:
getModelPath()返回模型所在文件夹的绝对路径,避免因相对路径导致的文件找不到问题;如果使用自定义绝对路径,Windows系统需用双反斜杠\\或正斜杠/。 - 批量数据写入:如果运行中需要收集多条时序数据,可先在模型中定义
List或DataSet存储数据,运行结束后通过循环批量写入工作表:// 模型全局变量:List<Double> waitTimeSeries = new ArrayList<>(); // 运行中收集数据:waitTimeSeries.add(currentWaitTime); // 运行结束时批量写入 excel.setCellValue(sheetName, 0, 0, "仿真时间"); excel.setCellValue(sheetName, 0, 1, "等待时间"); for (int i = 0; i < waitTimeSeries.size(); i++) { excel.setCellValue(sheetName, i+1, 0, time()); excel.setCellValue(sheetName, i+1, 1, waitTimeSeries.get(i)); } waitTimeSeries.clear(); // 清空列表准备下一次运行 - 权限注意:运行模型时不要打开目标Excel文件,否则会因文件锁定导致写入失败。
内容的提问来源于stack exchange,提问作者Rui Gonçalves
相关产品推荐
相关产品推荐

