Я хочу быстро экспортировать огромные данные в файл 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());
}
Я хочу улучшить скорость двух вещей:
- Получение данных из MongoDB: я использую индексацию
- Увеличить скорость итератора
Может кто-нибудь предлагает мне лучший способ сделать это, или есть ли другой способ создания файла excel?