Я хочу реализовать изображенную ниже структуру (выделенную желтым цветом область), используя Apache POI, но все еще не понимаю, как мне это сделать
![enter image description here](https://i.stack.imgur.com/aNEu8.png)
МОЯ ПОПЫТКА:
для каждой строки я создам две ячейки, затем занимаю промежуток в 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;
}