Сбор данных из коллекции Excel в Excel

В проекте, использующем инфраструктуру OSWorkflow, у меня была задача экспортировать разрешения пользователя для Excel. Я вытащил их всех из базы данных, выполнил все необходимые проверки и манипуляции. На этом этапе у меня есть коллекция, содержащая другие коллекции, в которой также есть коллекции и т. Д.

По моему мнению, структура отчета следующая: USER1 Permission1 (например, типы журналов) JournalType1 new (они доступны с этими действиями журнала) edit delete view JournalType2 View Permission2 ConnectionPermission true Permission3 NavigationPermission menu_documents archiveCases archiveReport JournalGroups USER2 … И так далее.

Поэтому я должен перебирать через свои коллекции и экспортировать их, чтобы преуспеть. Я знаю, что мне придется использовать рекурсию для итераций. Но я не знаю, какие рамки для экспорта в Excel. Может ли кто-нибудь показать некоторые примеры итераций через объект, похожий на мой, и экспортировать в Excel? Вот как моя структура выглядит в отладчике: введите описание изображения здесь

После некоторого исследования я понял, что рекурсия здесь не работает из-за разных Коллекций в моем объекте (сначала я думал о каких-то двухсторонних рекурсиях, один – по списку вторым по картам, но не смог его реализовать). Я знаю, что это может быть не лучшее решение, но мне пришлось использовать итерации. Таким образом, у меня было две задачи: сначала перебирайте все данные и второй экспорт в excel. Я отделил их и написал итерации с выходом на консоль сначала (для более легкого отладки). Затем я добавил экспорт excel с помощью Apache POI. Итерация содержит if `{}, потому что коллекции имеют разные уровни глубины. Вот код:

private void exportPermissionDataToExcel(SortedMap allPermissions, HttpServletResponse response) { PropertyManager props = ResourcesProperties.getInstance(); HSSFWorkbook wb = null; try { String headerString = "attachment; filename=\"" + EXCEL_FILE_NAME + ".xls\";"; wb = new HSSFWorkbook(); CellStyle style = wb.createCellStyle(); Font font = wb.createFont(); font.setBoldweight(Font.BOLDWEIGHT_BOLD); style.setFont(font); HSSFSheet workSheet = wb.createSheet(EXCEL_FILE_NAME); workSheet.createRow(1); int columnNumber = 0; for (Object pair : allPermissions.entrySet()) { Object key = ((Map.Entry) pair).getKey(); Object values = ((Map.Entry) pair).getValue(); int rowNumber = 0; Row row = workSheet.createRow(rowNumber); Cell cell = row.createCell(columnNumber); rowNumber++; if (key instanceof User) { cell.setCellValue(((User) key).getFullName() + " (" + ((User) key).getUsername() + ")"); } else { cell.setCellValue(((Group) key).getName()); } cell.setCellStyle(style); for (Object permissionsList : (List) values) { for (Object permissionValue : ((Map) permissionsList).entrySet()) { Object key1 = ((Map.Entry) permissionValue).getKey(); Object listOfValues1 = ((Map.Entry) permissionValue).getValue(); columnNumber = 1; row = workSheet.createRow(rowNumber); cell = row.createCell(columnNumber); rowNumber++; cell.setCellValue(props.getProperty(key1.toString())); cell.setCellStyle(style); for (Object permissionsList1 : (List) listOfValues1) { for (Object permissionMap : (List) permissionsList1) { for (Object permissionMap1 : ((Map) permissionMap).entrySet()) { Object key2 = ((Map.Entry) permissionMap1).getKey(); Object listOfValues2 = ((Map.Entry) permissionMap1).getValue(); columnNumber = 2; //if property not found returns null, some records can be already transalted, translations for translations cannot be found => null String message2 = props.getProperty(key2.toString()); if (message2 == null) { rowNumber = createCellAndSetValue(workSheet, row, cell, rowNumber, columnNumber,key2.toString()); } else { rowNumber = createCellAndSetValue(workSheet, row, cell, rowNumber, columnNumber, message2); } if (!key1.equals("lv.alise.usermanager.permissions.ConnectPermission")) { for (Object permissionValue3 : (List) listOfValues2) { if (key1.equals("lv.alise.usermanager.permissions.WorkflowPermission")) { for (Object permissionMap2 : ((Map) permissionValue3).entrySet()) { Object key3 = ((Map.Entry) permissionMap2).getKey(); Object listOfValues3 = ((Map.Entry) permissionMap2).getValue(); columnNumber = 3; rowNumber = createCellAndSetValue(workSheet, row, cell, rowNumber, columnNumber,props.getProperty(key3.toString()) ); for (Object permissionValue4 : (List) listOfValues3) { columnNumber = 4; rowNumber = createCellAndSetValue(workSheet, row, cell, rowNumber, columnNumber,props.getProperty(permissionValue4.toString()) ); } } } else { columnNumber = 3; rowNumber = createCellAndSetValue(workSheet, row, cell, rowNumber, columnNumber,props.getProperty(permissionValue3.toString()) ); } } } } } } } } } response.setContentType("application/octetstream"); response.setHeader("Content-Disposition", headerString); OutputStream out = response.getOutputStream(); wb.write(out); out.close(); wb.close(); } catch (Exception e) { System.out.println(e.getMessage()); } } private int createCellAndSetValue(HSSFSheet workSheet, Row row, Cell cell, int rowNumber, int columnNumber, String value) { row = workSheet.createRow(rowNumber); cell = row.createCell(columnNumber); rowNumber++; cell.setCellValue(value); return rowNumber; } 

Может быть, кто-то найдет это полезным.

  • Java Apache POI evaluationInCell не работает
  • Фильтрация столбца в excel с использованием java poi
  • Как защитить паролем файл ZIP на Java?
  • POI - Excel остается частью некоторого процесса и не может быть отредактирован
  • Как написать данные в нескольких ячейках в Excel с помощью java?
  • Ошибка при чтении листа Excel с использованием Java
  • Как экспортировать данные в CSV: динамический SQL-запрос и динамические имена столбцов и данные на JTable (Java / Netbeans)
  • Добавление листов в существующий файл excel без повторной записи полного файла, используя Apache-poi
  • Веб-приложение - импорт из файла excel
  • Работа с файлами Excel
  • Есть ли способ узнать, что CellStyle уже присутствует в Workbook (для повторного использования) с помощью POI или Копировать только Celstyle obj not reference
  • Interesting Posts

    «Ошибка времени выполнения« 424 »: требуется объект«

    Транспонирование данных в 1 столбце с помощью пользовательских разделителей

    Нормализовать конкатенированные данные Excel

    Excel: родительское дочернее дерево: добавьте динамически узловые (родительские) номера

    Кодировка данных отличается в обработчике ajax success

    Рабочий лист Excel сохранен как PDF – Изменения в области печати

    Оптимизация оптимизатора строк

    Продолжить код VBA на новую строку

    Меняйте переменную в цикле в Excel каждый раз, когда она выполняется с использованием значения в диапазоне

    Объедините данные из двух ячеек подряд в одну, повторите со всеми ячейками в столбце

    Совокупное количество отдельных дат в диапазонах дат с использованием DAX

    определить массив с использованием двух отдельных столбцов

    VBA Excel – ошибка переполнения 6 – неизвестный тип

    Найдите строку, содержащую частичное текстовое значение, верните номер строки

    Использование пользовательской формы VBA для фильтрации сводной таблицы (особенно в фильтрах отчетов и средах)

    Давайте будем гением компьютера.