From 946c2e27dbd778308626d65ba0739d7818ad2720 Mon Sep 17 00:00:00 2001 From: jing's Date: Thu, 14 Dec 2023 23:17:29 +0800 Subject: [PATCH] =?UTF-8?q?=20=E8=AE=BE=E5=A4=87=E5=AF=BC=E5=87=BAexcel=20?= =?UTF-8?q?=20=E5=8F=8A=E6=A8=A1=E7=89=88=E4=B8=8B=E8=BD=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../bomnew/excel/ExcelExportField.java | 4 +- .../bomnew/excel/ExportDeviceHelper.java | 139 ++++--- .../bomnew/excel/ImportExcelField.java | 2 +- .../bomnew/excel/OldExportDeviceHelper.java | 384 ++++++++++++++++++ .../service/aggreg/OptionalExcelService.java | 2 +- .../template/importDataTemplate.xlsx | Bin 10901 -> 10761 bytes 6 files changed, 468 insertions(+), 63 deletions(-) create mode 100644 nflg_project_dev/nflg-bom-new/src/main/java/com/nflg/product/bomnew/excel/OldExportDeviceHelper.java diff --git a/nflg_project_dev/nflg-bom-new/src/main/java/com/nflg/product/bomnew/excel/ExcelExportField.java b/nflg_project_dev/nflg-bom-new/src/main/java/com/nflg/product/bomnew/excel/ExcelExportField.java index 1ead2ac2..41e81682 100644 --- a/nflg_project_dev/nflg-bom-new/src/main/java/com/nflg/product/bomnew/excel/ExcelExportField.java +++ b/nflg_project_dev/nflg-bom-new/src/main/java/com/nflg/product/bomnew/excel/ExcelExportField.java @@ -9,8 +9,8 @@ public class ExcelExportField extends ImportExcelField { - @ExcelProperty(value="",index = 3) - private String cellFourth; +// @ExcelProperty(value="",index = 3) +// private String cellFourth; diff --git a/nflg_project_dev/nflg-bom-new/src/main/java/com/nflg/product/bomnew/excel/ExportDeviceHelper.java b/nflg_project_dev/nflg-bom-new/src/main/java/com/nflg/product/bomnew/excel/ExportDeviceHelper.java index 63aff154..2a45d27b 100644 --- a/nflg_project_dev/nflg-bom-new/src/main/java/com/nflg/product/bomnew/excel/ExportDeviceHelper.java +++ b/nflg_project_dev/nflg-bom-new/src/main/java/com/nflg/product/bomnew/excel/ExportDeviceHelper.java @@ -46,7 +46,7 @@ public class ExportDeviceHelper { .needHead(false)//是否需要head .build(); buildHeader(2, voObj.getDeviceInfo(), sheet, writer, tableNoCounting); - buildList(voObj.getSingleList(), sheet, writer, tableNoCounting); + buildList(voObj.getSingleList(), sheet, writer, tableNoCounting); writer.finish(); @@ -170,13 +170,18 @@ public class ExportDeviceHelper { int columnWidth = cell.getStringCellValue().getBytes().length; switch (cellIndex) { case 0: - columnWidth = 30; + columnWidth = 50; break; case 1: - columnWidth = 40; + columnWidth = 70; break; case 2: - columnWidth = 80; + columnWidth = 20; + break; + case 3: + + columnWidth = 40; + break; default: break; @@ -190,57 +195,58 @@ public class ExportDeviceHelper { // 自定义表头样式处理 if (context.getHead() != null && context.getHead().booleanValue()) { - WriteSheetHolder writeSheetHolder = context.getWriteSheetHolder(); - Workbook workbook = writeSheetHolder.getSheet().getWorkbook(); - CellStyle cellStyle = initCellStyle(workbook); + if(cellIndex==0 || cellIndex ==1) { + WriteSheetHolder writeSheetHolder = context.getWriteSheetHolder(); + Workbook workbook = writeSheetHolder.getSheet().getWorkbook(); - XSSFCellStyle xssfCellStyle = (XSSFCellStyle) workbook.createCellStyle(); - xssfCellStyle.cloneStyleFrom(cellStyle); - xssfCellStyle.getFont().setBold(true); - xssfCellStyle.setAlignment(HorizontalAlignment.LEFT); - xssfCellStyle.setFillForegroundColor(new XSSFColor(new java.awt.Color(255, 255, 0))); - xssfCellStyle.setFillPattern(FillPatternType.SOLID_FOREGROUND); - cell.setCellStyle(xssfCellStyle); - context.getFirstCellData().setWriteCellStyle(null); //必须 + CellStyle cellStyle = initCellStyle(workbook); + XSSFCellStyle xssfCellStyle = (XSSFCellStyle) workbook.createCellStyle(); + xssfCellStyle.cloneStyleFrom(cellStyle); + xssfCellStyle.getFont().setBold(true); + + xssfCellStyle.setAlignment(HorizontalAlignment.LEFT); + xssfCellStyle.setFillForegroundColor(new XSSFColor(new java.awt.Color(255, 255, 0))); + xssfCellStyle.setFillPattern(FillPatternType.SOLID_FOREGROUND); + cell.setCellStyle(xssfCellStyle); + + + + // WriteCellStyle.merge( xssfCellStyle., context.getFirstCellData().getOrCreateStyle()); + context.getFirstCellData().setWriteCellStyle(null); //必须 + + + + } + if(cellIndex ==1){ + WriteSheetHolder writeSheetHolder = context.getWriteSheetHolder(); + Sheet sheet = writeSheetHolder.getSheet(); + CellRangeAddress cellRangeAddress = new CellRangeAddress(rowIndex, rowIndex, 0, 1); + sheet.addMergedRegion(cellRangeAddress); + } } - if (context.getHead() == null || !context.getHead().booleanValue()) { - - if (cellIndex == 1 || cellIndex == 2) { - WriteSheetHolder writeSheetHolder = context.getWriteSheetHolder(); - Workbook workbook = writeSheetHolder.getSheet().getWorkbook(); - -// WriteCellStyle contentWriteCellStyle = EasyExcelUtil.getBodyStyle(); -// CellStyle cellStyle = StyleUtil.buildCellStyle(workbook, null, contentWriteCellStyle); +// if (context.getHead() == null || !context.getHead().booleanValue()) { // -// XSSFCellStyle xssfCellStyle = (XSSFCellStyle) workbook.createCellStyle(); -// xssfCellStyle.cloneStyleFrom(cellStyle); -// xssfCellStyle.setAlignment(HorizontalAlignment.LEFT); -// xssfCellStyle.setFont(new XSSFFont()); -// xssfCellStyle.getFont().setBold(false); -// xssfCellStyle.getFont().setFontName("宋体"); -// xssfCellStyle.getFont().setFontHeightInPoints((short) 11); +// if (cellIndex == 1 || cellIndex == 2) { +// WriteSheetHolder writeSheetHolder = context.getWriteSheetHolder(); +// Workbook workbook = writeSheetHolder.getSheet().getWorkbook(); // -// context.getFirstCellData().setWriteCellStyle(null); //必须 -// cell.setCellStyle(xssfCellStyle); - - - WriteCellData writeCellData = context.getFirstCellData(); - WriteCellStyle customCellStyle = EasyExcelUtil.getBodyStyle(); - - WriteFont customFont = new WriteFont(); - customFont.setFontName("宋体"); - customFont.setFontHeightInPoints((short) 11); - customFont.setBold(false); - customCellStyle.setWriteFont(customFont); - customCellStyle.setHorizontalAlignment(HorizontalAlignment.LEFT); - WriteCellStyle.merge(customCellStyle, writeCellData.getOrCreateStyle()); - - } - } +// WriteCellData writeCellData = context.getFirstCellData(); +// WriteCellStyle customCellStyle = EasyExcelUtil.getBodyStyle(); +// +// WriteFont customFont = new WriteFont(); +// customFont.setFontName("宋体"); +// customFont.setFontHeightInPoints((short) 11); +// customFont.setBold(false); +// customCellStyle.setWriteFont(customFont); +// customCellStyle.setHorizontalAlignment(HorizontalAlignment.LEFT); +// WriteCellStyle.merge(customCellStyle, writeCellData.getOrCreateStyle()); +// +// } +// } } @@ -256,13 +262,14 @@ public class ExportDeviceHelper { List head1 = new ArrayList(); head1.add(customer); List head2 = new ArrayList(); - head2.add(customer); - + head2.add(""); + List head3 = new ArrayList(); + head3.add(""); list.add(head0); list.add(head1); list.add(head2); - + list.add(head3); return list; } @@ -282,7 +289,10 @@ public class ExportDeviceHelper { .writerTable(tableNoCounting.get()) .needHead(Boolean.FALSE) .registerWriteHandler( - new OnceAbsoluteMergeStrategy(tableNoCounting.get(), tableNoCounting.get(), 0, maxColumn) + new OnceAbsoluteMergeStrategy(0, 0, 0, maxColumn) + ) + .registerWriteHandler( + new OnceAbsoluteMergeStrategy(1, 1, 0, 1) ) .registerWriteHandler(new CellWriteHandler() { @Override @@ -298,10 +308,17 @@ public class ExportDeviceHelper { }) .registerWriteHandler(new HorizontalCellStyleStrategy(EasyExcelUtil.getHeadStyle(), body)) .build(); + List cellList = new ArrayList<>(); - cellList.add(String.format("%s %s", header.getDeviceNo(), header.getDeviceName())); + cellList.add(StrUtil.format("{} {}", header.getDeviceNo(), header.getDeviceName())); + List cellList2 = new ArrayList<>(); + cellList2.add("选配内容"); + cellList2.add(""); + cellList2.add("标配\\可选"); + cellList2.add("备注"); List> rowList = new ArrayList<>(); rowList.add(cellList); + rowList.add(cellList2); //写入表格 writer.write(rowList, sheet, table); } @@ -335,18 +352,21 @@ public class ExportDeviceHelper { for (OptionalEbomImportVO item2 : list2) { { String opChildName = item2.getOptionName(); - String optionChildDrawingNoName = item2.getOptionDrawingNo(); + String optionChildDrawingNo = item2.getOptionDrawingNo(); List list3 = item2.getChild(); for (OptionalEbomImportChildVO item3 : list3) { ImportExcelField excelField = new ImportExcelField(); - excelField.setCellFirst(optionParentDrawingNoName); - excelField.setCellSecond(String.format("%s %s", optionChildDrawingNoName, opChildName)); + excelField.setCellFirst(StrUtil.format("{} {}",optionChildDrawingNo,opChildName)); + if(StrUtil.isEmpty(item3.getDrawingNo())) { - excelField.setCellThird(String.format("%s:(%s)", item3.getMaterialName(), item3.getChooseStatus() == 1 ? "标配" : "可选")); + excelField.setCellSecond(StrUtil.format("{}", item3.getMaterialName())); }else { - excelField.setCellThird(String.format("%s:%s(%s)", item3.getDrawingNo(), item3.getMaterialName(), item3.getChooseStatus() == 1 ? "标配" : "可选")); + excelField.setCellSecond(StrUtil.format ("{}:{}", item3.getDrawingNo(), item3.getMaterialName())); } + + excelField.setCellThird(StrUtil.format("{}",item3.getChooseStatus() == 1 ? "标配" : "可选")) ; + excelField.setCellFourth(item3.getRemak()); ; items.add(excelField); } @@ -358,11 +378,12 @@ public class ExportDeviceHelper { if (CollectionUtil.isNotEmpty(items)) { tableNoCounting.getAndIncrement(); WriteTable table = EasyExcel.writerTable(tableNoCounting.get()) - .head(getHeader(opParentName)) + .head(getHeader(StrUtil.format("{} {}",opParentName,optionParentDrawingNoName))) .needHead(Boolean.TRUE)//需要Header + .automaticMergeHead(false) .registerWriteHandler(EasyExcelUtil.getDefaultStyle())//传入自定义样式 .registerWriteHandler(new HeaderStyleCustomCellWriteHandler()) - .registerWriteHandler(new ColumnMergeStrategy(0, new int[]{0, 1})) + .registerWriteHandler(new ColumnMergeStrategy(1, new int[]{0})) .build(); writer.write(items, sheet, table); items.clear(); diff --git a/nflg_project_dev/nflg-bom-new/src/main/java/com/nflg/product/bomnew/excel/ImportExcelField.java b/nflg_project_dev/nflg-bom-new/src/main/java/com/nflg/product/bomnew/excel/ImportExcelField.java index 1f2d4a6a..5f015c74 100644 --- a/nflg_project_dev/nflg-bom-new/src/main/java/com/nflg/product/bomnew/excel/ImportExcelField.java +++ b/nflg_project_dev/nflg-bom-new/src/main/java/com/nflg/product/bomnew/excel/ImportExcelField.java @@ -21,7 +21,7 @@ public class ImportExcelField{ @ExcelProperty(value="",index = 3) - private String cellRemark; + private String cellFourth; diff --git a/nflg_project_dev/nflg-bom-new/src/main/java/com/nflg/product/bomnew/excel/OldExportDeviceHelper.java b/nflg_project_dev/nflg-bom-new/src/main/java/com/nflg/product/bomnew/excel/OldExportDeviceHelper.java new file mode 100644 index 00000000..f6a70eae --- /dev/null +++ b/nflg_project_dev/nflg-bom-new/src/main/java/com/nflg/product/bomnew/excel/OldExportDeviceHelper.java @@ -0,0 +1,384 @@ +package com.nflg.product.bomnew.excel; + +import cn.hutool.core.collection.CollectionUtil; +import cn.hutool.core.util.StrUtil; +import com.alibaba.excel.EasyExcel; +import com.alibaba.excel.ExcelWriter; +import com.alibaba.excel.metadata.Head; +import com.alibaba.excel.metadata.data.WriteCellData; +import com.alibaba.excel.support.ExcelTypeEnum; +import com.alibaba.excel.util.StyleUtil; +import com.alibaba.excel.write.handler.AbstractCellWriteHandler; +import com.alibaba.excel.write.handler.CellWriteHandler; +import com.alibaba.excel.write.handler.context.CellWriteHandlerContext; +import com.alibaba.excel.write.merge.OnceAbsoluteMergeStrategy; +import com.alibaba.excel.write.metadata.WriteSheet; +import com.alibaba.excel.write.metadata.WriteTable; +import com.alibaba.excel.write.metadata.holder.WriteSheetHolder; +import com.alibaba.excel.write.metadata.holder.WriteTableHolder; +import com.alibaba.excel.write.metadata.style.WriteCellStyle; +import com.alibaba.excel.write.metadata.style.WriteFont; +import com.alibaba.excel.write.style.HorizontalCellStyleStrategy; +import com.nflg.product.bomnew.pojo.vo.OptionalEbomConfigAggregVO; +import com.nflg.product.bomnew.pojo.vo.OptionalEbomImportChildVO; +import com.nflg.product.bomnew.pojo.vo.OptionalEbomImportVO; +import com.nflg.product.bomnew.pojo.vo.OptionalEbomMainVO; +import org.apache.poi.ss.usermodel.*; +import org.apache.poi.ss.util.CellRangeAddress; +import org.apache.poi.xssf.usermodel.XSSFCellStyle; +import org.apache.poi.xssf.usermodel.XSSFColor; + +import java.io.OutputStream; +import java.util.ArrayList; +import java.util.List; +import java.util.concurrent.atomic.AtomicInteger; + +public class OldExportDeviceHelper { + + + public void export(OutputStream filePath, OptionalEbomConfigAggregVO voObj) { + + //使用一个计数器记录当前已经写了几个表格 + AtomicInteger tableNoCounting = new AtomicInteger(0); + ExcelWriter writer = EasyExcel.write(filePath)//指定写入的流 + .excelType(ExcelTypeEnum.XLSX)//指定Excel文件类型,如xlsx、xls + .autoCloseStream(Boolean.FALSE) + .build(); + + WriteSheet sheet = EasyExcel + .writerSheet("EBOM导出")//指定写入的sheet + .needHead(false)//是否需要head + .build(); + buildHeader(2, voObj.getDeviceInfo(), sheet, writer, tableNoCounting); + buildList(voObj.getSingleList(), sheet, writer, tableNoCounting); + writer.finish(); + + + } + + + + + + + + + + + public static class ColumnMergeStrategy implements CellWriteHandler { + + + private int[] mergeColumnIndex; + private int mergeRowIndex; + + public ColumnMergeStrategy(int mergeRowIndex, int[] mergeColumnIndex) { + this.mergeRowIndex = mergeRowIndex; + this.mergeColumnIndex = mergeColumnIndex; + } + + @Override + public void beforeCellCreate(WriteSheetHolder writeSheetHolder, WriteTableHolder writeTableHolder, Row row, Head head, Integer columnIndex, Integer relativeRowIndex, Boolean isHead) { + + } + + @Override + public void afterCellCreate(WriteSheetHolder writeSheetHolder, WriteTableHolder writeTableHolder, Cell cell, Head head, Integer relativeRowIndex, Boolean isHead) { + + } + + @Override + public void afterCellDispose(WriteSheetHolder writeSheetHolder, WriteTableHolder writeTableHolder, List> cellDataList, Cell cell, Head head, Integer relativeRowIndex, Boolean isHead) { + if (!isHead) { + //当前行 + int curRowIndex = cell.getRowIndex(); + //当前列 + int curColIndex = cell.getColumnIndex(); + // System.out.println(StrUtil.format("curRowIndex {} curColIndex {}",curRowIndex,curColIndex)); + if (curRowIndex > mergeRowIndex) { + for (int i = 0; i < mergeColumnIndex.length; i++) { + if (curColIndex == mergeColumnIndex[i]) { + mergeWithPrevRow(writeSheetHolder, cell, curRowIndex, curColIndex); + break; + } + } + } + + } + } + + + /** + * 当前单元格向上合并 + * + * @param writeSheetHolder + * @param cell 当前单元格 + * @param curRowIndex 当前行 + * @param curColIndex 当前列 + */ + private void mergeWithPrevRow(WriteSheetHolder writeSheetHolder, Cell cell, int curRowIndex, int curColIndex) { + Object curData = cell.getCellTypeEnum() == CellType.STRING ? cell.getStringCellValue() : cell.getNumericCellValue(); + Cell preCell = cell.getSheet().getRow(curRowIndex - 1).getCell(curColIndex); + Object preData = preCell.getCellTypeEnum() == CellType.STRING ? preCell.getStringCellValue() : preCell.getNumericCellValue(); + // 将当前单元格数据与上一个单元格数据比较 + Boolean dataBool = preData.equals(curData); + if (dataBool) { + Sheet sheet = writeSheetHolder.getSheet(); + List mergeRegions = sheet.getMergedRegions(); + boolean isMerged = false; + for (int i = 0; i < mergeRegions.size() && !isMerged; i++) { + CellRangeAddress cellRangeAddr = mergeRegions.get(i); + // 若上一个单元格已经被合并,则先移出原有的合并单元,再重新添加合并单元 + if (cellRangeAddr.isInRange(curRowIndex - 1, curColIndex)) { + sheet.removeMergedRegion(i); + cellRangeAddr.setLastRow(curRowIndex); + sheet.addMergedRegion(cellRangeAddr); + isMerged = true; + } + } + // 若上一个单元格未被合并,则新增合并单元 + if (!isMerged) { + CellRangeAddress cellRangeAddress = new CellRangeAddress(curRowIndex - 1, curRowIndex, curColIndex, curColIndex); + sheet.addMergedRegion(cellRangeAddress); + } + } + } + } + + + public class HeaderStyleCustomCellWriteHandler extends AbstractCellWriteHandler { + @Override + public void beforeCellCreate(WriteSheetHolder writeSheetHolder, WriteTableHolder writeTableHolder, + Row row, Head head, Integer columnIndex, Integer relativeRowIndex, Boolean isHead) { + // 设置行高 + int rowIndex = row.getRowNum(); + short height = 400; + row.setHeight(height); + } + + private CellStyle initCellStyle(Workbook workbook) { + WriteCellStyle contentWriteCellStyle = EasyExcelUtil.getHeadStyle(); + CellStyle headWriteCellStyle = StyleUtil.buildCellStyle(workbook, null, contentWriteCellStyle); + return headWriteCellStyle; + } + + + @Override + public void afterCellDispose(CellWriteHandlerContext context) { + Cell cell = context.getCell(); + int rowIndex = cell.getRowIndex(); + + int cellIndex = cell.getColumnIndex(); + + // 自定义宽度处理 + if (!context.getHead()) { + int columnWidth = cell.getStringCellValue().getBytes().length; + switch (cellIndex) { + case 0: + columnWidth = 30; + break; + case 1: + columnWidth = 40; + break; + case 2: + columnWidth = 80; + break; + default: + break; + } + + if (columnWidth > 255) { + columnWidth = 255; + } + context.getWriteSheetHolder().getSheet().setColumnWidth(cellIndex, columnWidth * 256); + } + // 自定义表头样式处理 + + if (context.getHead() != null && context.getHead().booleanValue()) { + WriteSheetHolder writeSheetHolder = context.getWriteSheetHolder(); + Workbook workbook = writeSheetHolder.getSheet().getWorkbook(); + CellStyle cellStyle = initCellStyle(workbook); + + XSSFCellStyle xssfCellStyle = (XSSFCellStyle) workbook.createCellStyle(); + xssfCellStyle.cloneStyleFrom(cellStyle); + xssfCellStyle.getFont().setBold(true); + + xssfCellStyle.setAlignment(HorizontalAlignment.LEFT); + xssfCellStyle.setFillForegroundColor(new XSSFColor(new java.awt.Color(255, 255, 0))); + xssfCellStyle.setFillPattern(FillPatternType.SOLID_FOREGROUND); + cell.setCellStyle(xssfCellStyle); + context.getFirstCellData().setWriteCellStyle(null); //必须 + + + } + + if (context.getHead() == null || !context.getHead().booleanValue()) { + + if (cellIndex == 1 || cellIndex == 2) { + WriteSheetHolder writeSheetHolder = context.getWriteSheetHolder(); + Workbook workbook = writeSheetHolder.getSheet().getWorkbook(); + +// WriteCellStyle contentWriteCellStyle = EasyExcelUtil.getBodyStyle(); +// CellStyle cellStyle = StyleUtil.buildCellStyle(workbook, null, contentWriteCellStyle); +// +// XSSFCellStyle xssfCellStyle = (XSSFCellStyle) workbook.createCellStyle(); +// xssfCellStyle.cloneStyleFrom(cellStyle); +// xssfCellStyle.setAlignment(HorizontalAlignment.LEFT); +// xssfCellStyle.setFont(new XSSFFont()); +// xssfCellStyle.getFont().setBold(false); +// xssfCellStyle.getFont().setFontName("宋体"); +// xssfCellStyle.getFont().setFontHeightInPoints((short) 11); +// +// context.getFirstCellData().setWriteCellStyle(null); //必须 +// cell.setCellStyle(xssfCellStyle); + + + WriteCellData writeCellData = context.getFirstCellData(); + WriteCellStyle customCellStyle = EasyExcelUtil.getBodyStyle(); + + WriteFont customFont = new WriteFont(); + customFont.setFontName("宋体"); + customFont.setFontHeightInPoints((short) 11); + customFont.setBold(false); + customCellStyle.setWriteFont(customFont); + customCellStyle.setHorizontalAlignment(HorizontalAlignment.LEFT); + WriteCellStyle.merge(customCellStyle, writeCellData.getOrCreateStyle()); + + } + } + + + } + + } + + + public List> getHeader(String headStr) { + String customer = headStr; + List> list = new ArrayList>(); + List head0 = new ArrayList(); + head0.add(customer); + List head1 = new ArrayList(); + head1.add(customer); + List head2 = new ArrayList(); + head2.add(customer); + + + list.add(head0); + list.add(head1); + list.add(head2); + + return list; + } + + public void buildHeader(int maxColumn, OptionalEbomMainVO header, WriteSheet sheet, ExcelWriter writer, AtomicInteger tableNoCounting) { + if (header == null) { + return; + } + + + WriteCellStyle body = EasyExcelUtil.getBodyStyle(); + if (body.getWriteFont() != null) { + body.getWriteFont().setBold(true); + } + + + WriteTable table = EasyExcel + .writerTable(tableNoCounting.get()) + .needHead(Boolean.FALSE) + .registerWriteHandler( + new OnceAbsoluteMergeStrategy(tableNoCounting.get(), tableNoCounting.get(), 0, maxColumn) + ) + .registerWriteHandler(new CellWriteHandler() { + @Override + public void afterCellDispose(CellWriteHandlerContext context) { + Cell cell = context.getCell(); + int rowIndex = cell.getRowIndex(); + int cellIndex = cell.getColumnIndex(); + if (rowIndex == 0) { + short height = 500; + context.getRow().setHeight(height); + } + } + }) + .registerWriteHandler(new HorizontalCellStyleStrategy(EasyExcelUtil.getHeadStyle(), body)) + .build(); + List cellList = new ArrayList<>(); + cellList.add(String.format("%s %s", header.getDeviceNo(), header.getDeviceName())); + List> rowList = new ArrayList<>(); + rowList.add(cellList); + //写入表格 + writer.write(rowList, sheet, table); + } + + /** + * 构建列表部分 + */ + public void buildList(List listTable, WriteSheet sheet, ExcelWriter writer, AtomicInteger tableNoCounting) { + + if (CollectionUtil.isEmpty(listTable)) { + return; + } + + List items = new ArrayList<>(); + String opParentName=""; + String optionParentDrawingNoName=""; + + for ( int row =0;row< listTable.size();row++ ) { + + OptionalEbomImportVO item1=listTable.get(row); + opParentName = item1.getOptionName(); + optionParentDrawingNoName = item1.getOptionDrawingNo(); + + List list2 = item1.getChild(); +// List cellList = new ArrayList<>(); +// cellList.add(opParentName); + + + + + for (OptionalEbomImportVO item2 : list2) { + { + String opChildName = item2.getOptionName(); + String optionChildDrawingNoName = item2.getOptionDrawingNo(); + List list3 = item2.getChild(); + for (OptionalEbomImportChildVO item3 : list3) { + ImportExcelField excelField = new ImportExcelField(); + excelField.setCellFirst(optionParentDrawingNoName); + excelField.setCellSecond(String.format("%s %s", optionChildDrawingNoName, opChildName)); + if(StrUtil.isEmpty(item3.getDrawingNo())) { + excelField.setCellThird(String.format("%s:(%s)", item3.getMaterialName(), item3.getChooseStatus() == 1 ? "标配" : "可选")); + }else { + excelField.setCellThird(String.format("%s:%s(%s)", item3.getDrawingNo(), item3.getMaterialName(), item3.getChooseStatus() == 1 ? "标配" : "可选")); + + } + items.add(excelField); + + } + } + } + + + + if (CollectionUtil.isNotEmpty(items)) { + tableNoCounting.getAndIncrement(); + WriteTable table = EasyExcel.writerTable(tableNoCounting.get()) + .head(getHeader(opParentName)) + .needHead(Boolean.TRUE)//需要Header + .registerWriteHandler(EasyExcelUtil.getDefaultStyle())//传入自定义样式 + .registerWriteHandler(new HeaderStyleCustomCellWriteHandler()) + .registerWriteHandler(new ColumnMergeStrategy(0, new int[]{0, 1})) + .build(); + writer.write(items, sheet, table); + items.clear(); + } + + + + + } + + + } + + +} diff --git a/nflg_project_dev/nflg-bom-new/src/main/java/com/nflg/product/bomnew/service/aggreg/OptionalExcelService.java b/nflg_project_dev/nflg-bom-new/src/main/java/com/nflg/product/bomnew/service/aggreg/OptionalExcelService.java index 7ceccd0f..1ba56dfc 100644 --- a/nflg_project_dev/nflg-bom-new/src/main/java/com/nflg/product/bomnew/service/aggreg/OptionalExcelService.java +++ b/nflg_project_dev/nflg-bom-new/src/main/java/com/nflg/product/bomnew/service/aggreg/OptionalExcelService.java @@ -128,7 +128,7 @@ public class OptionalExcelService { levelDto3.setChooseStatus(OptionalBomConstant.ChooseStatusEnum.CHOOSE_STATUS_NO.getValue()); } - levelDto3.setRemak(item.getCellRemark()); + levelDto3.setRemak(item.getCellFourth()); optionalEbomImportLevel2Dto.getChild().add(levelDto3); // levelDto3.setMaterialName(materialName.replace("(标配)", "").replace("(可选)", "")); // levelDto3.setMaterialDesc(levelDto3.getMaterialDesc()); diff --git a/nflg_project_dev/nflg-bom-new/src/main/resources/template/importDataTemplate.xlsx b/nflg_project_dev/nflg-bom-new/src/main/resources/template/importDataTemplate.xlsx index 549dbc3903db148670564eff9ae494844d249b7e..d5e225e548060011bf1326ad22484dd890ac3244 100644 GIT binary patch delta 7019 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 KBreAPoc<4DT_$e; delta 7286 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 BTd)8C