Экспорт базы данных из Anylogic в Excel по событию триггер - PullRequest
0 голосов
/ 12 декабря 2018

Я хотел бы экспортировать базу данных AnyLogic в Excel при возникновении определенного события.Однако единственные параметры экспорта, которые я вижу, это вручную, когда модель приостановлена, или автоматически, когда модель закрывается.

Может ли кто-нибудь помочь с фрагментом Java или указать ссылку, пожалуйста?

Вспомогательные вопросы (если вышеизложенное возможно): Можете ли вы из Anylogic: 1. Создать новые рабочие листы в Excel для записи данных?2. Пересчитать рабочую таблицу, чтобы имя могло включать, скажем, метку времени?

Ответы [ 2 ]

0 голосов
/ 13 декабря 2018

Я хотел бы экспортировать базу данных 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;
0 голосов
/ 12 декабря 2018

Эрик, вы можете экспортировать данные в файл Excel в любой момент времени во время выполнения моделирования ... например, следующий код записывает «значение» на первом листе, в первой строке и первом столбце:

excelFile.readFile();
excelFile.setCellValue("the value",1,1, 1);//value,sheetName or number, row, column
excelFile.writeFile();

Нет ограничений по использованию.Вы можете найти все API Excel в справочной документации, чтобы узнать, как можно читать и записывать данные.

Но вы не можете контролировать имя рабочего листа или создавать новые через API... насколько я знаю

...