Быстро генерируйте Excel / XLSX, записывая огромные данные в файл при загрузке Spring с помощью MongoDB - PullRequest
0 голосов
/ 18 июня 2020

Я хочу быстро экспортировать огромные данные в файл Excel. В настоящее время я использую Apache POI для экспорта файла Excel, но для записи данных в каждую строку требуется много времени в итерации. Я пытаюсь написать более 40 000 строк, чтобы преуспеть, но создание файла занимает более 10 минут.

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

Ниже мой код

public ByteArrayInputStream generateExcel(String fromDate, String toDate, String locationType, String locationId) throws IOException, ParseException {
        String[] columns = new String[]{"Role", "Name", "Phone Number", "ETC.."};

        SXSSFWorkbook wb = new SXSSFWorkbook(SXSSFWorkbook.DEFAULT_WINDOW_SIZE/* 100 */);
        wb.setCompressTempFiles(true);

        SXSSFSheet sh = wb.createSheet("Personal Details");
        sh.setRandomAccessWindowSize(100);

        ByteArrayOutputStream out = new ByteArrayOutputStream();
        Font headerFont = wb.createFont();
        headerFont.setBold(true);
        headerFont.setColor(IndexedColors.BLUE.getIndex());

        CellStyle headerCellStyle = wb.createCellStyle();
        headerCellStyle.setFont(headerFont);
        // Row for Header
        Row headerRow = sh.createRow(0);

        // Header
        for (int col = 0; col < columns.length; col++) {
            Cell cell = headerRow.createCell(col);
            cell.setCellValue(columns[col]);
            cell.setCellStyle(headerCellStyle);
        }
        // Fetch Data From MongoDB
        List<User> farmerList = userRepo.getFarmerList(fromDate, toDate, locationId);        
        int rowIdx = 1;

        Iterator<User> i = farmerList.iterator();
        while (i.hasNext()) {
            User farmer = i.next();
            SXSSFRow row = sh.createRow(rowIdx++);

            row.createCell(0).setCellValue(getUserMainRole(farmer));
            row.createCell(1).setCellValue(farmer.getFirstName() + " " + farmer.getLastName());
            row.createCell(2).setCellValue(farmer.getPrimaryPhone());
            row.createCell(3).setCellValue(agentName);
            i.remove();
        }

        wb.write(out);
        out.close();
        return new ByteArrayInputStream(out.toByteArray());
}

Я хочу улучшить скорость двух вещей:

  1. Получение данных из MongoDB: я использую индексацию
  2. Увеличить скорость итератора

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...