简体   繁体   中英

Java Export Collection of Collections to Excel

In project which uses OSWorkflow framework I had task to export user permissions to excel report. I fetched them all from database, completed all necessary checks and manipulations. At this step I have Collection containing other collections they also contains collections and so on.

In my mind structure of report is following: USER1 Permission1(for example journal types) JournalType1 new(these are available with this journal actions) edit delete view JournalType2 View Permission2 ConnectionPermission true Permission3 NavigationPermission menu_documents archiveCases archiveReport JournalGroups USER2... And so on.

So I have to Iterate thru my Collections and Export them to excel. I know what I will have to use recursion for iterations. But I don`t know which framework for exporting to excel to use. Can anyone show some examples of iterations thru object similar to mine and exporting to excel? Here like my structure looks in debugger: 在此处输入图片说明

After some research, I realized that recursion does not works here because of different Collections in my object(First i was thinking about some sort of two way recursions, one by Lists second by Maps but was unable to implement it). I know that, may be it is not the best solution, but I had to use iterations. So I had two tasks here, first iterate thru all data and second export to excel. I separated them and wrote iterations with output to console first(for easier debug) Then I added excel export using Apache POI. Iteration contains if`s{} because Collections have different depth levels. Here is code:

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;
}

May be someone will find it usefull.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM