package Visual_DVM_2021.Passes.All; import Common.Current; import Common.Global; import Common.UI.UI; import Common.Utils.Files.VDirectoryChooser; import Common.Utils.Index; import Common.Utils.Utils; import GlobalData.Tasks.TaskState; import TestingSystem.DVM.Tasks.TestRunTask; import TestingSystem.DVM.TasksPackage.TasksPackage; import TestingSystem.DVM.TasksPackage.TasksPackageState; import Visual_DVM_2021.Passes.Pass_2021; import org.apache.commons.io.FileUtils; import org.apache.poi.hssf.usermodel.HSSFWorkbook; import org.apache.poi.hssf.util.HSSFColor; import org.apache.poi.ss.usermodel.Font; import org.apache.poi.ss.usermodel.*; import java.awt.*; import java.io.File; import java.io.FileOutputStream; import java.util.Vector; public class ExportTasksPackageToExcel extends Pass_2021 { //https://tproger.ru/translations/how-to-read-write-excel-file-java-poi-example File dir; File res; VDirectoryChooser directoryChooser = new VDirectoryChooser("Выбор папки для сохранения таблицы Excel"); //--- final int max_columns = 16; Vector styles; //-- //-- Workbook book = null; Sheet sheet = null; //-- Vector tasks = null; //-- @Override public String getIconPath() { return "/icons/Excel.png"; } @Override public String getButtonText() { return ""; } @Override protected boolean needsAnimation() { return true; } @Override protected boolean canStart(Object... args) throws Exception { book = null; sheet = null; styles = null; tasks = null; //-- if (Current.Check(Log, Current.TasksPackage)) { target = Current.getTasksPackage(); if (!target.state.equals(TasksPackageState.Done)) { Log.Writeln_("Можно получить таблицу только завершенного пакета."); return false; } else { //--- tasks = new Vector<>(); for (TestRunTask task : Global.testingServer.account_db.testRunTasks.Data.values()) { if ((task.taskspackage_id == target.id) && (task.isVisible())) tasks.add(task); } if (tasks.isEmpty()) { Log.Writeln_("Не найдено ни одной видимой задачи."); return false; } //--- dir = directoryChooser.ShowDialog(); if (dir == null) { Log.Writeln_("Папка не выбрана."); return false; } res = new File(dir, Utils.getDateName("package_" + target.id) + ".xls"); return true; } } return false; } protected Row addRow(int row_num, boolean isHeader, Object... values) { Row row = sheet.createRow(row_num); int i = 0; for (Object value : values) { String cell_text = value.toString(); Cell cell = row.createCell(i); int style_index = 0; if (!isHeader) { switch (i) { case 4: case 5: TaskState state = (TaskState) value; cell_text = state.getDescription(); switch (state) { case FailedToQueue: case NoSuchTask: case AbortedByUser: case AbortedByTimeout: case DoneWithErrors: case WrongTestFormat: case InternalError: case Canceled: style_index = 3; break; case Queued: case Running: style_index = 5; break; case Done: style_index = 2; break; case Crushed: style_index = 4; break; case Finished: style_index = 6; break; } break; default: style_index = 1; break; } } cell.setCellStyle(styles.get(style_index)); cell.setCellValue(cell_text); //-- ++i; } return row; } protected void setBorder(CellStyle style, short border) { style.setBorderBottom(border); style.setBorderLeft(border); style.setBorderRight(border); style.setBorderTop(border); } protected String extractEnvironmentValue(String environmentsSet, String name) { if (environmentsSet.contains(name)) { int index = environmentsSet.lastIndexOf(name); if (index >= 0) { String s1 = environmentsSet.substring(index + name.length() + 1); String[] data = s1.split("\""); if (data.length > 0) { return data[1]; } } } return null; } protected Integer extractIntegerEnvironmentValue(String environmentsSet, String name) { Integer res = null; String s = extractEnvironmentValue(environmentsSet, name); if (s != null) { try { res = Integer.parseInt(s); } catch (NumberFormatException ex) { ex.printStackTrace(); } } return res; } void createStyles(){ styles = new Vector<>(); //0 - заголовок //1 - черный //2 - зеленый //3 - красный //4 - темно красный //5 - оранжевый //6 - серый for (int i = 0; i < 6; ++i) { CellStyle style = book.createCellStyle(); Font font = book.createFont(); switch (i) { case 0: font.setBold(true); setBorder(style, CellStyle.BORDER_THICK); break; default: setBorder(style, CellStyle.BORDER_THIN); switch (i) { case 1: font.setColor(HSSFColor.BLACK.index); break; case 2: font.setColor(HSSFColor.GREEN.index); break; case 3: font.setColor(HSSFColor.RED.index); break; case 4: font.setColor(HSSFColor.DARK_RED.index); break; case 5: font.setColor(HSSFColor.ORANGE.index); break; case 6: font.setColor(HSSFColor.GREY_40_PERCENT.index); break; } break; } style.setFont(font); styles.add(style); } } void exportPackage(TasksPackage tasksPackage, Index offset){ Row header = addRow(offset.getValue(), true, "Группа", "Тест", "Язык", "Флаги", "Компиляция", "Запуск", "NUM_THREADS", "NUM_CUDAS", "TOTAL_THREADS", "Матрица", "Окружение", "usr.par", "Время компиляции (с)", "Время запуска (с)", "Чистое время (с)", "Прогресс (%)"); //-- offset.Inc(); //-- for (TestRunTask task : tasks) { ShowMessage2(task.test_description); //--- Integer NUM_THREADS = extractIntegerEnvironmentValue(task.environments, "DVMH_NUM_THREADS"); if (NUM_THREADS == 0) NUM_THREADS = 1; Integer NUM_CUDAS = extractIntegerEnvironmentValue(task.environments, "DVMH_NUM_CUDAS"); //-- Object num_threads = (NUM_THREADS != null) ? NUM_THREADS : "undef"; Object num_cudas = (NUM_CUDAS != null) ? NUM_CUDAS : "undef"; Object total_threads = (NUM_THREADS != null) ? NUM_THREADS * Utils.getMatrixProcessors(task.matrix) : "undef"; //-- Row row = addRow(offset.getValue(), false, task.group_description, task.test_description, task.language.getDescription(), task.flags, task.compilation_state, task.state, num_threads, num_cudas, total_threads, task.matrix, task.environments, task.usr_par, task.compilation_time, task.Time, task.CleanTime, task.progress ); offset.Inc(); } } @Override protected void body() throws Exception { File file = Utils.getTempFileName("table"); //-- book = new HSSFWorkbook(); sheet = book.createSheet("Результаты тестирования"); //-- createStyles(); //-- Index offset = new Index(); exportPackage(target, offset); //-- for (int i = 0; i < max_columns; ++i) sheet.autoSizeColumn(i); // Записываем всё в файл FileOutputStream stream = new FileOutputStream(file); book.write(stream); book.close(); stream.close(); ///-- FileUtils.copyFile(file, res); book = null; stream = null; file = null; } @Override protected void performDone() throws Exception { super.performDone(); if (Desktop.isDesktopSupported()) { if (UI.Question("Таблица сформирована в файле\n" + Utils.DQuotes(res.getAbsolutePath()) + ".\nОткрыть её" )) { Desktop.getDesktop().open(res); } } } }