indic-search-service/src/main/java/ru/nbch/indicsearchservice/util/ExcelWriter.java
Ivan Nikolaev-Axenov ffca0f853c excel creation added
2026-05-21 10:36:02 +03:00

181 lines
6.5 KiB
Java

package ru.nbch.indicsearchservice.util;
import jakarta.annotation.Nullable;
import java.io.IOException;
import java.io.OutputStream;
import java.nio.file.Files;
import java.nio.file.Path;
import java.util.List;
import java.util.Map;
import java.util.Optional;
import java.util.stream.Collectors;
import org.apache.commons.lang3.mutable.MutableInt;
import org.apache.poi.ss.usermodel.BorderStyle;
import org.apache.poi.ss.usermodel.Cell;
import org.apache.poi.ss.usermodel.CellStyle;
import org.apache.poi.ss.usermodel.Row;
import org.apache.poi.ss.usermodel.Sheet;
import org.apache.poi.ss.usermodel.VerticalAlignment;
import org.apache.poi.ss.usermodel.Workbook;
import org.apache.poi.ss.util.CellRangeAddress;
import org.apache.poi.xssf.streaming.SXSSFWorkbook;
import org.apache.poi.xssf.usermodel.XSSFFont;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Component;
import ru.nbch.indicsearchservice.model.TableData;
@Component
public class ExcelWriter {
private static final Logger log = LoggerFactory.getLogger(ExcelWriter.class);
public void writeExcelFile(List<TableData> tableDataList) {
Map<String, List<TableData>> tableDataGroupedByTables = tableDataList.stream()
.collect(Collectors.groupingBy(TableData::getTableName));
Path excelFile = Path.of("2.xlsx");
try (SXSSFWorkbook workbook = new SXSSFWorkbook();
OutputStream os = Files.newOutputStream(excelFile)) {
CellStyle headerCellStyle = createHeaderCellStyle(workbook);
CellStyle cellStyle = createCellStyle(workbook);
for (Map.Entry<String, List<TableData>> entry : tableDataGroupedByTables.entrySet()) {
String tableName = entry.getKey();
List<TableData> tableRows = entry.getValue();
Sheet tableSheet = createSheet(workbook, tableName.toUpperCase());
MutableInt currentRow = new MutableInt(0);
for (TableData tableRow : tableRows) {
writeDataSheetIntoSheetRow(
tableRow,
tableSheet,
currentRow,
headerCellStyle,
cellStyle
);
}
}
workbook.write(os);
} catch (IOException e) {
log.error(e.getMessage(), e);
}
}
private CellStyle createHeaderCellStyle(Workbook workbook) {
CellStyle headerCellStyle = workbook.createCellStyle();
headerCellStyle.setVerticalAlignment(VerticalAlignment.CENTER);
XSSFFont font = (XSSFFont) workbook.createFont();
font.setFontName("SansSerif");
font.setFontHeightInPoints((short) 11);
font.setBold(true);
headerCellStyle.setFont(font);
return headerCellStyle;
}
private CellStyle createCellStyle(Workbook workbook) {
CellStyle cellStyle = workbook.createCellStyle();
cellStyle.setVerticalAlignment(VerticalAlignment.CENTER);
cellStyle.setBorderBottom(BorderStyle.THIN);
cellStyle.setBorderLeft(BorderStyle.THIN);
cellStyle.setBorderTop(BorderStyle.THIN);
cellStyle.setBorderRight(BorderStyle.THIN);
XSSFFont font = (XSSFFont) workbook.createFont();
font.setFontName("Calibri");
font.setFontHeightInPoints((short) 11);
cellStyle.setFont(font);
return cellStyle;
}
private Sheet createSheet(Workbook workbook, String sheetName) {
Sheet sheet = workbook.createSheet(sheetName);
sheet.setColumnWidth(0, 25 * 256);
sheet.setColumnWidth(1, 115 * 256);
sheet.setColumnWidth(2, 38 * 256);
return sheet;
}
private void createHeaderRow(String localizedTableName,
Sheet sheet,
MutableInt currentRow,
CellStyle headerCellStyle) {
Row headerRow = sheet.createRow(currentRow.intValue());
headerRow.setHeightInPoints(15);
Cell headerCell = headerRow.createCell(0);
headerCell.setCellValue(localizedTableName);
headerCell.setCellStyle(headerCellStyle);
sheet.addMergedRegion(new CellRangeAddress(currentRow.intValue(), currentRow.intValue(), 0, 2));
currentRow.increment();
}
public void writeDataSheetIntoSheetRow(TableData tableData,
Sheet sheet,
MutableInt currentRow,
CellStyle headerCellStyle,
CellStyle cellStyle) {
createHeaderRow(
tableData.getTableName(),
sheet,
currentRow,
headerCellStyle
);
for (TableData.FieldData fieldData : tableData.getFieldData()) {
writeFieldDataIntoSheetRow(
fieldData.columnName(),
fieldData.columnName(),
fieldData.columnValue(),
sheet,
currentRow,
cellStyle
);
}
currentRow.increment();
if (!tableData.getRelatedTableData().isEmpty()) {
for (TableData relatedTableData : tableData.getRelatedTableData()) {
writeDataSheetIntoSheetRow(
relatedTableData,
sheet,
currentRow,
headerCellStyle,
cellStyle
);
}
}
}
private void writeFieldDataIntoSheetRow(String fieldKey,
String localizedFieldKey,
@Nullable Object fieldValue,
Sheet sheet,
MutableInt currentRow,
CellStyle cellStyle) {
Row dataRow = sheet.createRow(currentRow.intValue());
dataRow.setHeightInPoints(15);
Cell dataFieldCell = dataRow.createCell(0);
dataFieldCell.setCellValue(fieldKey.toUpperCase());
dataFieldCell.setCellStyle(cellStyle);
Cell descriptionCell = dataRow.createCell(1);
descriptionCell.setCellValue(localizedFieldKey);
descriptionCell.setCellStyle(cellStyle);
Cell dataValueCell = dataRow.createCell(2);
dataValueCell.setCellValue(Optional.ofNullable(fieldValue).orElse("").toString());
dataValueCell.setCellStyle(cellStyle);
currentRow.increment();
}
}