设备导出excel 及模版下载

This commit is contained in:
jing's 2023-12-14 23:17:29 +08:00
parent 112a69babe
commit 946c2e27db
6 changed files with 468 additions and 63 deletions

View File

@ -9,8 +9,8 @@ public class ExcelExportField extends ImportExcelField {
@ExcelProperty(value="",index = 3)
private String cellFourth;
// @ExcelProperty(value="",index = 3)
// private String cellFourth;

View File

@ -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<String> head1 = new ArrayList<String>();
head1.add(customer);
List<String> head2 = new ArrayList<String>();
head2.add(customer);
head2.add("");
List<String> head3 = new ArrayList<String>();
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<String> cellList = new ArrayList<>();
cellList.add(String.format("%s %s", header.getDeviceNo(), header.getDeviceName()));
cellList.add(StrUtil.format("{} {}", header.getDeviceNo(), header.getDeviceName()));
List<String> cellList2 = new ArrayList<>();
cellList2.add("选配内容");
cellList2.add("");
cellList2.add("标配\\可选");
cellList2.add("备注");
List<List<String>> 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<OptionalEbomImportChildVO> 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();

View File

@ -21,7 +21,7 @@ public class ImportExcelField{
@ExcelProperty(value="",index = 3)
private String cellRemark;
private String cellFourth;

View File

@ -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文件类型如xlsxxls
.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<WriteCellData<?>> 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<CellRangeAddress> 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<List<String>> getHeader(String headStr) {
String customer = headStr;
List<List<String>> list = new ArrayList<List<String>>();
List<String> head0 = new ArrayList<String>();
head0.add(customer);
List<String> head1 = new ArrayList<String>();
head1.add(customer);
List<String> head2 = new ArrayList<String>();
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<String> cellList = new ArrayList<>();
cellList.add(String.format("%s %s", header.getDeviceNo(), header.getDeviceName()));
List<List<String>> rowList = new ArrayList<>();
rowList.add(cellList);
//写入表格
writer.write(rowList, sheet, table);
}
/**
* 构建列表部分
*/
public void buildList(List<OptionalEbomImportVO> listTable, WriteSheet sheet, ExcelWriter writer, AtomicInteger tableNoCounting) {
if (CollectionUtil.isEmpty(listTable)) {
return;
}
List<ImportExcelField> 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<OptionalEbomImportVO> list2 = item1.getChild();
// List<String> cellList = new ArrayList<>();
// cellList.add(opParentName);
for (OptionalEbomImportVO item2 : list2) {
{
String opChildName = item2.getOptionName();
String optionChildDrawingNoName = item2.getOptionDrawingNo();
List<OptionalEbomImportChildVO> 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();
}
}
}
}

View File

@ -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());