Как реализовать структуру Excel для таблицы Side By Side Table, используя Apache POI - PullRequest
0 голосов
/ 30 апреля 2020

Я хочу реализовать изображенную ниже структуру (выделенную желтым цветом область), используя Apache POI, но все еще не понимаю, как мне это сделать

enter image description here

МОЯ ПОПЫТКА:

для каждой строки я создам две ячейки, затем занимаю промежуток в 2 ячейки и затем снова создаю две ячейки, одну для заголовка и соответствующих ему данных. это должно быть аналогично для следующих строк, но проблема здесь в том, что мне нужно перебрать заголовок, затем данные, затем снова мне нужно занять пространство из двух ячеек, а затем перебрать заголовок и затем данные, что, по-видимому, невозможно с помощью list

private void createSideBySideRecordTable(SXSSFSheet sheet, CellStyle titleStyle, CellStyle headStyle,
            CellStyle dateStyle,int rowCount,CellStyle rowStyle) {
        int headerColumnCount = 0;
        int columnShifted=3;
        for (String headerData : headers) {
            Row headerRow = sheet.createRow(rowCount);
            if(rowCount==0) {
            Cell cellC1 = headerRow.createCell(headerColumnCount);
            cellC1.setCellValue(headerData);
            cellC1.setCellStyle(headStyle);

            Cell cellC2 = headerRow.createCell(columnShifted);
            cellC2.setCellValue(headerData);
            cellC2.setCellStyle(headStyle);
            }
            Cell cellC1 = headerRow.createCell(headerColumnCount);
            if (null != listObjectData && !listObjectData.isEmpty()) {
                System.out.println("listObjectData Size : " + listObjectData.size());
                for (List<Object> listRow : listObjectData) {
                    int dataColumnCount=0;

                    Row dataRow = sheet.createRow(rowCount);
                    for (Object data : listRow) {
                    //data to be iterated

                        }
                    rowCount++;
                }
            }
            headerColumnCount++;
            columnShifted++;
            rowCount++;
        }

    }

ВЫШЕ ФУНКЦИЯ ВЫЗВАНА ОТ GENERI C ФУНКЦИЯ, СОЗДАЮЩАЯ XLS

public byte[] createGenericXlsFileNew(String coreProductId , boolean isTpUser , Locale userLocale) throws Exception {

        FileInputStream fileupload = null;
        byte[] bytes = null;
        SXSSFWorkbook workBook = new SXSSFWorkbook();
        FileOutputStream fileOut = null;
        try {
            File file = createTempXlsFile();
            fileOut = new FileOutputStream(file);
            fileupload = new FileInputStream(file);
            workBook.setCompressTempFiles(true);
            CreationHelper createHelper = workBook.getCreationHelper();
            CommonUtility commonUtility = new CommonUtility();
            DateUtility dateUtility = new DateUtility(coreProductId);
            SXSSFSheet sheet = (SXSSFSheet) workBook.createSheet(sheetName);
            sheet.setRandomAccessWindowSize(100);

            /**************** Title Style *****************/
            CellStyle titleStyle = workBook.createCellStyle();
            Font titleFont = workBook.createFont();
            titleFont.setBoldweight(Font.BOLDWEIGHT_BOLD);
            titleFont.setFontName("Arial");
            titleFont.setFontHeightInPoints((short) 8);
            titleStyle.setFont(titleFont);

            int rowCount = 0;

            /**************** Date Style *****************/
            CellStyle dateStyle = workBook.createCellStyle();
            Font dateFont = workBook.createFont();
            dateFont.setBoldweight(Font.BOLDWEIGHT_NORMAL);
            dateFont.setFontName("Arial");
            dateFont.setFontHeightInPoints((short) 8);
            dateStyle.setFont(dateFont);
            String localeDatePattern = dateUtility.getLocaleDatePattern(userLocale, isTpUser);
            String excelFormatPattern = DateFormatConverter.convert(userLocale, localeDatePattern);
            dateStyle.setDataFormat(createHelper.createDataFormat().getFormat(excelFormatPattern));

            /**************** Header Style *****************/
            CellStyle headStyle = workBook.createCellStyle();
            headStyle.setFillForegroundColor(IndexedColors.SKY_BLUE.getIndex());
            headStyle.setFillPattern(CellStyle.SOLID_FOREGROUND);
            Font font = workBook.createFont();
            font.setBoldweight(Font.BOLDWEIGHT_BOLD);
            font.setFontName("Arial");
            font.setFontHeightInPoints((short) 8);
            headStyle.setFont(font);


            CellStyle rowStyle = workBook.createCellStyle();
            Font dataFont = workBook.createFont();
            dataFont.setBoldweight(Font.BOLDWEIGHT_NORMAL);
            dataFont.setFontName("Arial");
            dataFont.setFontHeightInPoints((short) 8);
            rowStyle.setFont(dataFont);

            if(isMultiTableStructure) {
            createSideBySideRecordTable(sheet,titleStyle,headStyle,dateStyle,rowCount,rowStyle);
            }
            int headerColumnCount = 0;
            Row headerRow = sheet.createRow(rowCount);
            for (String data : headers) {
                Cell cellC1 = headerRow.createCell(headerColumnCount);
                cellC1.setCellValue(data);
                cellC1.setCellStyle(headStyle);
                headerColumnCount++;
            }
            rowCount++;


            if (null != listObjectData && !listObjectData.isEmpty()) {
                System.out.println("listObjectData Size : " + listObjectData.size());
                for (List<Object> listRow : listObjectData) {
                    int dataColumnCount=0;

                    Row dataRow = sheet.createRow(rowCount);
                    for (Object data : listRow) {
                        Cell cellC1 = dataRow.createCell(dataColumnCount);

                        if(null != data ) {
                         if (data instanceof Date) { 
                                cellC1.setCellValue((Date)data);
                                cellC1.setCellStyle(dateStyle);  
                            }else if(data instanceof Double ) {
                                if((Double)data > 0 ){
                                    cellC1.setCellValue((Double)data);
                                    cellC1.setCellType(Cell.CELL_TYPE_NUMERIC);
                                }else{
                                    cellC1.setCellValue((Double)data);
                                }
                                cellC1.setCellStyle(rowStyle);
                            }else if(data instanceof Integer ) {
                                if((Integer)data > 0 ){
                                    cellC1.setCellValue((Integer)data);
                                    cellC1.setCellType(Cell.CELL_TYPE_NUMERIC);
                                }else{
                                    cellC1.setCellValue((Integer)data);
                                }
                                cellC1.setCellStyle(rowStyle);
                            }else if(data instanceof Long ) {
                                if((Long)data > 0 ){
                                    cellC1.setCellValue((Long)data);
                                    cellC1.setCellType(Cell.CELL_TYPE_NUMERIC);
                                }else{
                                    cellC1.setCellValue((Long)data);
                                }
                                cellC1.setCellStyle(rowStyle);
                            }else if(data instanceof Float ) {
                                if((Float)data > 0 ){
                                    cellC1.setCellValue((Float)data);
                                    cellC1.setCellType(Cell.CELL_TYPE_NUMERIC);
                                }else{
                                    cellC1.setCellValue((Float)data);
                                }
                                cellC1.setCellStyle(rowStyle);
                            } else {
                                 /*** Added blank check for bug OCTOPUS-4545  ***/
                                if(!"".equals(((String)data).trim())) {
                                    cellC1.setCellValue((String)data);
                                    cellC1.setCellStyle(rowStyle);  
                                }                               
                            }
                         }else {

                         }
                        dataColumnCount++;

                        }
                    rowCount++;
                }
            }
            workBook.write(fileOut);
            fileOut.flush();
            fileOut.close();
            if (null != fileupload) {
                bytes = IOUtils.toByteArray(fileupload);
            }
        } catch (Exception e) {
            e.printStackTrace();
            LOGGER.error(e);
        } finally {
            if (null != fileupload) {
                fileupload.close();
            }
        }
        return bytes;
    }

Ниже приведен объект, который используется для заполнения данных в две таблицы в Excel. Я не хочу фиксированный способ, например certificateInfo .getName() или certifcateInfo.getId(), я хочу реализовать своего рода обобщенную c реализацию. Я ищу реализацию типа MAP, будет ли эта работа работать над этим вариантом использования, пожалуйста, помогите мне достичь, предложив лучшую реализацию.

DATA

try {
                certificateInfo = certificateProcessHelper
                        .getMemberLicenseInformation(getCertificateId(),
                                coreProductId, languageId);

            } catch (Exception e) {
                 logger.error(e.getMessage(), e);
            }
            return generateExcel(request,exportViewVolumesDetailsList,certificateInfo,staticTranslator);
            //return SUCCESS;
        }

GENERATE EXCEL FUNCTION

private String generateExcel(HttpServletRequest request2, List<ViewVolumes> exportViewVolumesDetailsList2,
        CertificateInfo certificateInfo,StaticTranslation staticTranslator ) {
    try{
        isTPArea = (Boolean) session.get("tpArea");
        logger.debug("Inside generateExcel");
        fileName = STOCK_OVERVIEW_FILE_NAME;
        logger.debug("preparing prepareDataToExport");
        List<String> headers = null;
        headers = prepareHeaderList(staticTranslator);
        List<List<Object>> viewVolumeDetailExportList= prepareDataToExport(exportViewVolumesDetailsList2);
        List<Object> certificateInfoExportList= prepareMultiTabDataToExport(certificateInfo);
        logger.debug("preparing exit");
        HttpServletResponse response = ServletActionContext.getResponse();
        byte [] filebyteArray=null;
        fileName = fileName.concat(AppConstants.TOKEN_DOT).concat(AppConstants.XLSX_EXTENSION) ;
        response.setContentType(AppConstants.REPONSE_EXCEL_TYPE);
        final ExportExcelUtil exportExcelUtil = new ExportExcelUtil(fileName,viewVolumeDetailExportList,certificateInfoExportList,headers,null ,fileName,true); 
        logger.debug("generating excel");

        filebyteArray = exportExcelUtil.createGenericXlsFile(getCoreProduct(),isTPArea ,userLocale.ENGLISH);
        logger.debug("received bytes excel");

        if(filebyteArray!=null){  
            File file = exportExcelUtil.getFile();
            stream = new FileInputStream(file);
            exportExcelUtil.deleteTempFile(stream);
            logger.debug("received bytes exit");
            return AppConstants.EXPORT; 
        }
    }catch(Exception e){
        logger.error(e);
    }
    return null;

}

EXCORT EXCEL UTILITY CONTRUCTOR CALL:

public ExportExcelUtil(String argFileName, List<List<Object>> dataObj,List<Object> dataObject,List<String> headerList, String strTitle ,String strSheetName,Boolean isMultiTab){
        this.excleFileName = argFileName;
        this.listObjectData = dataObj;
        this.headers = headerList;
        this.fileTitle = strTitle;
        this.sheetName = strSheetName;
        this.data=dataObject;
        this.isMultiTableStructure=isMultiTab;
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...