Я хотел бы экспортировать базу данных AnyLogic в Excel при возникновении определенного события.
Да, вы можете программно экспортировать таблицы из базы данных AnyLogic (т. Е. Делать то, что описано в руководстве »Экспорт таблиц в Excel »или автоматическое« Экспорт таблиц в конце выполнения модели »).Но, да, реальной документации по этому вопросу нет, и отработать логику, необходимую из справки по API в справке, нелегко (особенно в связи с тем, что в настоящее время есть ошибка в деталях для метода exportToExternalDB
, хотя AnyLogic должна исправитьэта документация скоро).
Пример кода приведен ниже.Помимо ваших требований, основная причина для этого заключается в том, что он позволяет вам динамически определять имя выходного файла (или динамически определять, какие таблицы выводятся).
NB : для этого требуется файл Excelсуществовать с необходимыми рабочими листами и уже существующими строками заголовков столбцов.Но вы можете вручную экспортировать пустые таблицы один раз, чтобы сгенерировать это (и, если вы хотите изменить имя выходного файла, вы можете добавить код до экспорта, который копирует этот экспортированный файл скелета в файл с требуемым именем, используя стандартную обработку файлов Java).код).
Существует также способ программно создать файл Excel и требуемое содержимое «скелета», используя более низкоуровневую Java и библиотеку Apache POI , которую AnyLogic использует подобложки для подключения к Excel.Это также может быть использовано для решения ваших вспомогательных вопросов (см. Далее).
Database outExcel = new Database(this, "ExcelOutput", "outputTest.xlsx");
outExcel.connect();
ModelDatabase modelDB = getEngine().getModelDatabase();
Connection connection = outExcel.getConnection();
// Do the actual per-table export; repeat per table to output
// This requires the Excel file to have the required sheets and header rows
// therein
modelDB.exportToExternalDB("output_sample", // Table name
connection, // External connection
"output_sample", // Target worksheet name
false, // Clear table prior to copy
true); // Auto-commit
outExcel.disconnect();
Можете ли вы из Anylogic: 1. Создать новые рабочие листы в Excel для записи данных?2. Пометьте рабочую таблицу так, чтобы имя могло включать, скажем, метку времени?
Пример кода, как показано ниже (где ваше выходное имя файла было сохранено в переменной String
fileName
).Обратите внимание, что это «AnyLogic-независимая» Java с использованием Apache POI;в этом коде нет ничего, что использовало бы какие-либо классы AnyLogic.Поскольку AnyLogic уже включает Apache POI как библиотеку для внутреннего использования, вам не нужно ничего добавлять в качестве зависимости модели.
try (FileOutputStream fileOut = new FileOutputStream(fileName)) {
Workbook wb = new XSSFWorkbook();
// Create a worksheet for the table
Sheet sheet = wb.createSheet("output_table");
// Create a header row with the required column names in. Row indices are 0 based
Row row = sheet.createRow(0);
row.createCell(0).setCellValue("col1");
row.createCell(1).setCellValue("col2");
row.createCell(2).setCellValue("col3");
// Write the output to a file
wb.write(fileOut);
} catch ( Exception e ) {
[Handle exceptions in some way]
}
Вам понадобятся некоторые обязательные операторы import
в агенте / эксперименте с этим кодомнаходится внутри (в разделе «Импорт» в Свойствах):
import org.apache.poi.ss.usermodel.Workbook;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;
import java.io.FileOutputStream;
import org.apache.poi.ss.usermodel.Sheet;
import org.apache.poi.ss.usermodel.Row;
import org.apache.poi.ss.usermodel.Cell;