execl合并表格的导入和自定义导出execl合并表格的导入和自定义导出

java 获取函数,与获取值

poi读取excel的时候判断空行-腾讯云开发者社区-腾讯云 (tencent.com)

poi小姿势:如何判断excel单元格Cell是否为空 - ForrestGump01 - 博客园 (cnblogs.com)

Java读取Excel数值内容带.0或变科学计数法的解决办法 - Yaaaaa - 博客园 (cnblogs.com)

Java读取Excel表格中的图片_java读取excel中的图片-CSDN博客

java使用POI读取Excel表格中的图片(包含嵌入单元格图片,浮动图片,xls-2003,xlsx-2007)_workbook解析excel中的图片-CSDN博客

java导入带图片的excel表格(工具HSSFWorkbook-HSSFSheet)(支持一条数据(单元格)可以导入多个图片,)_java导入excel带图片-CSDN博客

(72条消息) java导出Excel合并单元格_datangxiajun的博客-CSDN博客

(72条消息) JAVA对excle创建、读取、设置单元格颜色、背景色、跨行跨列_java设置excel背景色_谷同学的博客-CSDN博客

(72条消息) POI 设置Excel单元格背景色(setFillForegroundColor 与 setFillPattern 的使用)_行思坐忆,志凌云的博客-CSDN博客

(35条消息) Java使用POI获取Excel公式_ITarmi的博客-CSDN博客_poi读取excel公式

(72条消息) java 实现excel样式设置(居中、字体、大小、换行、合并行,列宽、指定特定字符串样式等)_cellstyle设置字体大小_时间 流逝的博客-CSDN博客

(35条消息) java.lang.ClassNotFoundException: org.apache.poi.hssf.usermodel.HSSFWorkbook 错误的原因和解决方法_wh445306的博客-CSDN博客

(35条消息) Java使用POI获取Excel公式并计算公式得到值-20220530_qq_40711092的博客-CSDN博客_java读取excel公式计算结果

(35条消息) 【Apache POI】Excel操作(六):Excel计算公式的读取和使用_古阙月的博客-CSDN博客

Java Pattern类和Matcher类的使用 (biancheng.net)

(43条消息) Java Pattern类的用法详解(正则表达式)_demon7552003的博客-CSDN博客_pattern类

(46条消息) 关于poi的NUMERIC读取excel单元格数值类型数字的问题_龙池小生的博客-CSDN博客_poi读取excel数字类型

Java实现Excel导入和导出,看这一篇就够了(珍藏版)(一) - 知乎 (zhihu.com)

(72条消息) Java 在Excel中添加筛选器并执行筛选_Eiceblue的博客-CSDN博客

通过 Maven 仓库安装 Spire 系列 Java 产品 (e-iceblue.cn)

[(47条消息) Java实现Excel模板的复制,并利用Java反射往新的Excel文件中的指定行开始写入数据_风难追的博客-CSDN博客](https://blog.csdn.net/weixin_42023666/article/details/88681870?ops_request_misc=%7B%22request%5Fid%22%3A%22167098318316782388030582%22%2C%22scm%22%3A%2220140713.130102334..%22%7D&request_id=167098318316782388030582&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2~all~sobaiduend~default-2-88681870-null-null.142^v68^control,201^v4^add_ask,213^v2^t3_esquery_v1&utm_term=java 复制excel&spm=1018.2226.3001.4187)

https://blog.csdn.net/qq_32003379/article/details/123095339

[JAVA导出EXCEL表格 - 顾东城 - 博客园 (cnblogs.com)](https://www.cnblogs.com/gudongcheng/p/8268909.html#:~:text=JAVA导出EXCEL表格 1 1. 下载jar包: 官方下载: http%3A%2F%2Fpoi.apache.org%2Fdownload.html 这里可以下载到它的最新版本和文档,目前最新版本是3.7,这里使用比较稳定的3.6版。 …,首先,我们应该要知道的是,一个Excel文件对应一个workbook,一个workbook中有多个sheet组成,一个sheet是由多个行 (row)和列 (cell)组成。 … 5 5. 导出Excel应用实例: )

Java实现读取Excel多个Sheet数据_java读取excel多个sheet-CSDN博客

(91条消息) 关于poi的NUMERIC读取excel单元格数值类型数字的问题_poi numeric_龙池小生的博客-CSDN博客

NumberToTextConverter.toText() 方法会返回单元格的初始格式 然后转化为String类型;

Excel的后缀名不对,你java项目中的poi jar包是对2003版也就是后缀名为xls的excel进行操作的代码,如果这时候找到的excel是2007版的也就是后缀名为xlsx的excel时,代码就会报错,所以在操作前你需要判断一下操作的excel的后缀,如果是xls的就让他执行,要不然就告诉报错,告诉操作者把excel另存为后缀为xls格式的excel,另一种办法就是两种都写,先判断后缀名为什么,之后就进入对应的操作。

java通过poi读取excel中的日期类型数据或自定义类型日期 - 张亮java - 博客园 (cnblogs.com)

CellType类型以及值的对应关系
CellType 类型
CELL_TYPE_NUMERIC 数值 0
CELL_TYPE_STRING 字符串型 1
CELL_TYPE_FORMULA 公式型 2
CELL_TYPE_BLANK 空值 3
CELL_TYPE_BOOLEAN 布尔型 4
CELL_TYPE_ERROR 错误 5
 FormulaEvaluator formulaEvaluator;
String fileType = Objects.requireNonNull(file.getOriginalFilename(), "文件名不能为空").
substring(file.getOriginalFilename().lastIndexOf(".") + 1);
if ("xls".equalsIgnoreCase(fileType)){
book=new HSSFWorkbook(file.getInputStream());//2003版本office
formulaEvaluator = new HSSFFormulaEvaluator((HSSFWorkbook) book);
}else{
book=new XSSFWorkbook(file.getInputStream());//判断是否为2007版本office
formulaEvaluator =new XSSFFormulaEvaluator((XSSFWorkbook) book);
}
//获取到有多少个sheet页
int numberOfSheets = book.getNumberOfSheets();
//对多少页进行for循环,处理各个的业务层
//读取各个Sheet
for (int i = 0; i < numberOfSheets; i++) {
String sheetName = book.getSheetName(i);
Sheet sheet = book.getSheetAt(i);
int lastRowNum = sheet.getLastRowNum();
for (int j = 0; j <= lastRowNum; j++) {
Row row = sheet.getRow(j);
if (null == row) {
continue;
}
String data = "";
int lastCellNum = row.getLastCellNum();
for (int k = 0; k < lastCellNum; k++) {
Cell cell = row.getCell(k);
Object result = "";
if (cell != null) {
switch (cell.getCellType()) {
case STRING:
result = cell.getStringCellValue();
break;
case NUMERIC:
result = cell.getNumericCellValue();
break;
case BOOLEAN:
result = cell.getBooleanCellValue();
break;
case FORMULA:
result = cell.getCellFormula();
break;
case ERROR:
result = cell.getErrorCellValue();
break;
case BLANK:
break;
default:
break;
}
}
if (result != "") {
data += result + "|";
}
}
if (data.length() > 0) {
System.out.println("sheet" + sheetName + "第" + (j + 1) + "行:" + data);
}
}
}
//获取单元格各类型值,返回字符串类型
public static String getCellValueByCell(Cell cell) {
//判断是否为null或空串
if (cell == null || cell.toString().trim().equals("")) {
return "";
}
String cellValue = "";
CellType cellType = cell.getCellType();
switch (cellType) {
case NUMERIC: // 数字
short format = cell.getCellStyle().getDataFormat();
if (DateUtil.isCellDateFormatted(cell)) {
SimpleDateFormat sdf = null;
//System.out.println("cell.getCellStyle().getDataFormat()="+cell.getCellStyle().getDataFormat());
if (format == 20 || format == 32) {
sdf = new SimpleDateFormat("HH:mm");
} else if (format == 14 || format == 31 || format == 57 || format == 58) {
// 处理自定义日期格式:m月d日(通过判断单元格的格式id解决,id的值是58)
sdf = new SimpleDateFormat("yyyy-MM-dd");
double value = cell.getNumericCellValue();
Date date = org.apache.poi.ss.usermodel.DateUtil
.getJavaDate(value);
cellValue = sdf.format(date);
} else {// 日期
sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
}
try {
cellValue = sdf.format(cell.getDateCellValue());// 日期
} catch (Exception e) {
try {
throw new Exception("exception on get date data !".concat(e.toString()));
} catch (Exception e1) {
e1.printStackTrace();
}
} finally {
sdf = null;
}
} else {
BigDecimal bd = new BigDecimal(cell.getNumericCellValue());
cellValue = bd.toPlainString();// 数值 这种用BigDecimal包装再获取plainString,可以防止获取到科学计数值
}
break;
case STRING: // 字符串
cellValue = cell.getStringCellValue();
break;
case BOOLEAN: // Boolean
cellValue = cell.getBooleanCellValue() + "";
break;
case FORMULA: // 公式
cellValue = cell.getCellFormula();
break;
case BLANK: // 空值
cellValue = "";
break;
case ERROR: // 故障
cellValue = "ERROR VALUE";
break;
default:
cellValue = "UNKNOW VALUE";
break;
}
return cellValue;
}
https://blog.csdn.net/qq_38025219/article/details/82760471
// 创建一个 workbook 对象
Workbook workbook = new XSSFWorkbook();
// 创建一个 sheet
Sheet sheet = workbook.createSheet();
//创建一行
Row row = sheet.createRow((short) 1);
ellStyle style = workbook.createCellStyle();
//关键点 IndexedColors.AQUA.getIndex() 对应颜色
style.setFillForegroundColor(***IndexedColors.AQUA.getIndex()***);
style.setFillPattern(CellStyle.SOLID_FOREGROUND);
Cell cell = row.createCell((short) 1);
cell.setCellValue("X1");
cell.setCellStyle(style);

颜色
IndexedColors.AQUA.getIndex()
IndexedColors.AUTOMATIC.getIndex()
IndexedColors.BLUE.getIndex()
IndexedColors.BLUE_GREY.getIndex()
IndexedColors.BRIGHT_GREEN.getIndex()
IndexedColors.BROWN.getIndex()
IndexedColors.CORAL.getIndex()
IndexedColors.CORNFLOWER_BLUE.getIndex()
IndexedColors.DARK_BLUE.getIndex()
IndexedColors.DARK_GREEN.getIndex()
IndexedColors.DARK_RED.getIndex()
IndexedColors.DARK_TEAL.getIndex()
IndexedColors.DARK_YELLOW.getIndex()
IndexedColors.GOLD.getIndex()
IndexedColors.GREEN.getIndex()
IndexedColors.GREY_25_PERCENT.getIndex()
IndexedColors.GREY_40_PERCENT.getIndex()
IndexedColors.GREY_50_PERCENT.getIndex()
IndexedColors.GREY_80_PERCENT.getIndex()
IndexedColors.INDIGO.getIndex()
IndexedColors.LAVENDER.getIndex()
IndexedColors.LEMON_CHIFFON.getIndex()
IndexedColors.LIGHT_BLUE.getIndex()
IndexedColors.LEMON_CHIFFON.getIndex()
IndexedColors.LIGHT_BLUE.getIndex()
IndexedColors.LIGHT_CORNFLOWER_BLUE.getIndex()
IndexedColors.LIGHT_GREEN.getIndex()
IndexedColors.LIGHT_ORANGE.getIndex()
IndexedColors.LIGHT_TURQUOISE.getIndex()
IndexedColors.LIGHT_YELLOW.getIndex()
IndexedColors.LIME.getIndex()
IndexedColors.MAROON.getIndex()
IndexedColors.OLIVE_GREEN.getIndex()
IndexedColors.ORANGE.getIndex()
IndexedColors.ORCHID.getIndex()
IndexedColors.PALE_BLUE.getIndex()
IndexedColors.PINK.getIndex()
IndexedColors.PLUM.getIndex()
IndexedColors.RED.getIndex()
IndexedColors.ROSE.getIndex()
IndexedColors.ROYAL_BLUE.getIndex()
IndexedColors.SEA_GREEN.getIndex()
IndexedColors.SKY_BLUE.getIndex()
IndexedColors.TAN.getIndex()
IndexedColors.TEAL.getIndex()
IndexedColors.TURQUOISE.getIndex()
IndexedColors.VIOLET.getIndex()
IndexedColors.WHITE.getIndex()
IndexedColors.YELLOW.getIndex()

合并表格导入参考

/**
* @author hjx
* TODO判断是否为合并单元格
* @method isMergedRegion
* @param sheet
* @param row
* @param column
* @return
* @return Boolean
* @date 2022年11月16日 下午2:18:44
*/
private Boolean isMergedRegion(Sheet sheet, int row, int column){
int sheetMergeCount = sheet.getNumMergedRegions();
for (int i = 0; i < sheetMergeCount; i++) {
CellRangeAddress range = sheet.getMergedRegion(i);
int firstColumn = range.getFirstColumn();
int lastColumn = range.getLastColumn();
int firstRow = range.getFirstRow();
int lastRow = range.getLastRow();
if (row>=firstRow&&row<=lastRow) {
if (column>=firstColumn&&column<=lastColumn) {
return true;
}
}
}
return false;
}
/**
* @author hjx
* TODO获取合并单元格的值
* @method getMergedRegionValue
* @param sheet
* @param row
* @param column
* @return
* @return String
* @date 2022年11月16日 下午2:18:44
*/
public String getMergedRegionValue(Sheet sheet ,int row , int column){
int sheetMergeCount = sheet.getNumMergedRegions();

for(int i = 0 ; i < sheetMergeCount ; i++){
CellRangeAddress ca = sheet.getMergedRegion(i);
int firstColumn = ca.getFirstColumn();
int lastColumn = ca.getLastColumn();
int firstRow = ca.getFirstRow();
int lastRow = ca.getLastRow();
if(row >= firstRow && row <= lastRow){
if(column >= firstColumn && column <= lastColumn){
Row xRow = sheet.getRow(firstRow);
Cell xCell = xRow.getCell(firstColumn);
return xCell.getStringCellValue();
}
}
}
return null ;
}


代码参考
夏新bom 维护导入
@Override
@Transactional
public ResultData uploadBackup(MultipartFile file, BomMaster entity) {
if (null==file){
return ResultData.fail("文件不能为空");
}
try{
Workbook book;
//使用它来执行计算公式
FormulaEvaluator formulaEvaluator;
String fileType = Objects.requireNonNull(file.getOriginalFilename(), "文件名不能为空").
substring(file.getOriginalFilename().lastIndexOf(".") + 1);
if ("xls".equalsIgnoreCase(fileType)){
book=new HSSFWorkbook(file.getInputStream());//2003版本office
formulaEvaluator = new HSSFFormulaEvaluator((HSSFWorkbook) book);
}else{
book=new XSSFWorkbook(file.getInputStream());//判断是否为2007版本office
formulaEvaluator =new XSSFFormulaEvaluator((XSSFWorkbook) book);
}
ExcelUtil eu = new ExcelUtil();
List<Row> rows = eu.readExcel(book);
String[] cloums={"序号","工序","类别","新编码","名称","规格描述","用量","损耗率"};
for (int i =0; i < cloums.length ; i++){
if (!cloums[i].equals(rows.get(0).getCell(i).getStringCellValue())){
return ResultData.fail("表头的第"+(i+1)+"列与模板不一致,请核对");
}
}
StringBuilder message =new StringBuilder();
ArrayList<BomDetail> bomDetailList = new ArrayList<>();
ArrayList<BomReplace> bomReplaceList =new ArrayList<>();
//给BomMaster赋值
BomMaster bomMaster = new BomMaster();
bomMaster.setBomCode(entity.getBomCode());
bomMaster.setModelCode(entity.getModelCode());
bomMaster.setCreateUser(UserUtils.getUsername());
bomMaster.setEdition(entity.getEdition());
bomMaster.setCustomerCode(entity.getCustomerCode());
bomMaster.setEditionDate(entity.getTime());
String materialCode ="";
for (int i =1 ; i < rows.size() ; i++){
short lastCellNum = rows.get(i).getLastCellNum();
if (lastCellNum>8){
return ResultData.fail("表格的格式有误,列数超过8列,请核对表格,并删除多出的列");
}
if (isMergedRegion(book.getSheetAt(0),i,0)){
rows.get(i).getCell(0).setCellType(CellType.STRING);
rows.get(i).getCell(0).setCellValue(getMergedRegionValue(book.getSheetAt(0), i, 0));
}
if (isMergedRegion(book.getSheetAt(0),i,4)){
String value = getMergedRegionValue(book.getSheetAt(0), i, 4);
rows.get(i).getCell(4).setCellValue(value);
}
String s = rows.get(i).getCell(0).toString();
rows.get(i).getCell(0).setCellType(CellType.STRING);
rows.get(i).getCell(0).setCellValue(s);
if ("A".equals(ExcelUtil.getCellValue(rows.get(i).getCell(2)))) {
BomDetail bomDetail = new BomDetail();
bomDetail.setBomCode(entity.getBomCode());
bomDetail.setCreateUser(UserUtils.getUsername());
if ("".equals(ExcelUtil.getCellValue(rows.get(i).getCell(0)))) {
message.append("第" + (i + 1) + "行的序号不能为空\n");
} else {
int sno;
try{
sno = new BigDecimal(formulaEvaluator.evaluate(rows.get(i).getCell(0)).getStringValue()).intValue();
if (sno<=0){
message.append("第"+(i+1)+"行序号的数不能小于等于0\n");
}else{
bomDetail.setSno(sno);
}
}catch (Exception exception){
exception.printStackTrace();
message.append("第"+(i+1)+"行序号的数值格式有误\n");
}
}
if ("".equals(ExcelUtil.getCellValue(rows.get(i).getCell(1)))) {
message.append("第" + (i + 1) + "行的工序不能为空\n");
} else {
bomDetail.setParentProcess(ExcelUtil.getCellValue(rows.get(i).getCell(1)));
}
if ("".equals(ExcelUtil.getCellValue(rows.get(i).getCell(2)))) {
message.append("第" + (i + 1) + "行的类别不能为空\n");
} else {
bomDetail.setTypeclass(ExcelUtil.getCellValue(rows.get(i).getCell(2)));
}
if ("".equals(ExcelUtil.getCellValue(rows.get(i).getCell(3)))) {
message.append("第" + (i + 1) + "行的新编码不能为空\n");
} else {
if (rows.get(i).getCell(3).getCellType().equals(CellType.NUMERIC)){
bomDetail.setMaterialCode(NumberToTextConverter.toText(rows.get(i).getCell(3).getNumericCellValue()));
}else {
bomDetail.setMaterialCode(ExcelUtil.getCellValue(rows.get(i).getCell(3)));
}
bomDetail.setMaterialCode(bomDetail.getMaterialCode().trim());
}
if ("".equals(ExcelUtil.getCellValue(rows.get(i).getCell(4)))) {
message.append("第" + (i + 1) + "行的名称不能为空\n");
} else {
bomDetail.setMaterialName(ExcelUtil.getCellValue(rows.get(i).getCell(4)));
}
if ("".equals(ExcelUtil.getCellValue(rows.get(i).getCell(5)))) {
message.append("第" + (i + 1) + "行的规格描述不能为空\n");
} else {
bomDetail.setSpecifications(ExcelUtil.getCellValue(rows.get(i).getCell(5)));
}
if ("".equals(ExcelUtil.getCellValue(rows.get(i).getCell(6)))) {
message.append("第" + (i + 1) + "行的用量不能为空\n");
} else {
double useQty;
try{
useQty = formulaEvaluator.evaluate(rows.get(i).getCell(6)).getNumberValue();
if (useQty <=0){
message.append("第" + (i + 1) + "行的用量不能小于等于0\n");
}else{
bomDetail.setUseQty(useQty);
}
}catch (Exception exception){
exception.printStackTrace();
message.append("第" + (i + 1) + "行的用量的值格式有误\n");
}
}
if ("".equals(ExcelUtil.getCellValue(rows.get(i).getCell(7)))) {
message.append("第" + (i + 1) + "行的损耗率不能为空\n");
} else {
double loss;
try {
loss = formulaEvaluator.evaluate(rows.get(i).getCell(7)).getNumberValue();
if (loss<0){
message.append("第" + (i + 1) + "行的损耗率的值不能小于0\n");
}else {
bomDetail.setLossRate(loss);
}
}catch (Exception ex){
ex.printStackTrace();
message.append("第" + (i + 1) + "行的损耗率的值格式有误\n");
}
}
bomDetailList.add(bomDetail);
materialCode=ExcelUtil.getCellValue(rows.get(i).getCell(3));
}else{
BomReplace bomReplace = new BomReplace();
bomReplace.setBomCode(entity.getBomCode());
bomReplace.setMaterialCode(materialCode.trim());
bomReplace.setCreateUser(UserUtils.getUsername());
if ("".equals(ExcelUtil.getCellValue(rows.get(i).getCell(0)))) {
message.append("第" + (i + 1) + "行的序号不能为空\n");
} else {
int sno;
try{
sno = new BigDecimal(formulaEvaluator.evaluate(rows.get(i).getCell(0)).getStringValue()).intValue();
if (sno<=0){
message.append("第"+(i+1)+"行序号的数值不能小于等于0\n");
}else{
bomReplace.setSno(sno);
}
}catch (Exception exception){
exception.printStackTrace();
message.append("第"+(i+1)+"行序号的数值格式有误\n");
}
}
if ("".equals(ExcelUtil.getCellValue(rows.get(i).getCell(1)))) {
message.append("第" + (i + 1) + "行的工序不能为空\n");
} else {
bomReplace.setParentProcess(ExcelUtil.getCellValue(rows.get(i).getCell(1)));
}
if ("".equals(ExcelUtil.getCellValue(rows.get(i).getCell(2)))) {
message.append("第" + (i + 1) + "行的类别不能为空\n");
} else {
bomReplace.setTypeclass(ExcelUtil.getCellValue(rows.get(i).getCell(2)));
}
if ("".equals(ExcelUtil.getCellValue(rows.get(i).getCell(3)))) {
message.append("第" + (i + 1) + "行的新编码不能为空\n");
} else {
if (rows.get(i).getCell(3).getCellType().equals(CellType.NUMERIC)){
bomReplace.setMaterialReplace(NumberToTextConverter.toText(rows.get(i).getCell(3).getNumericCellValue()));
}else {
bomReplace.setMaterialReplace(ExcelUtil.getCellValue(rows.get(i).getCell(3)));
}
bomReplace.setMaterialReplace(bomReplace.getMaterialReplace().trim());
}
if ("".equals(ExcelUtil.getCellValue(rows.get(i).getCell(4)))) {
message.append("第" + (i + 1) + "行的名称不能为空\n");
} else {
bomReplace.setMaterialName(ExcelUtil.getCellValue(rows.get(i).getCell(4)));
}
if ("".equals(ExcelUtil.getCellValue(rows.get(i).getCell(5)))) {
message.append("第" + (i + 1) + "行的规格描述不能为空\n");
} else {
bomReplace.setSpecifications(ExcelUtil.getCellValue(rows.get(i).getCell(5)));
}
if ("".equals(ExcelUtil.getCellValue(rows.get(i).getCell(6)))) {
message.append("第" + (i + 1) + "行的用量不能为空\n");
} else {
double useQty;
try{
useQty = formulaEvaluator.evaluate(rows.get(i).getCell(6)).getNumberValue();
if (useQty <=0){
message.append("第" + (i + 1) + "行的用量的值不能小于等于0\n");
}else{
bomReplace.setUseQty(useQty);
}
}catch (Exception exception){
exception.printStackTrace();
message.append("第" + (i + 1) + "行的用量数值格式有误\n");
}
}
if ("".equals(ExcelUtil.getCellValue(rows.get(i).getCell(7)))) {
message.append("第" + (i + 1) + "行的损耗率不能为空\n");
} else {
double loss;
try {
loss = formulaEvaluator.evaluate(rows.get(i).getCell(7)).getNumberValue();
if (loss<0){
message.append("第" + (i + 1) + "行的损耗率为的值不能小于0\n");
}else {
bomReplace.setLossRate(loss);
}
}catch (Exception ex){
ex.printStackTrace();
message.append("第" + (i + 1) + "行的损耗率为的值格式有误\n");
}
}
bomReplaceList.add(bomReplace);
}
}
if (message.length()>0){
return ResultData.fail(message.toString());
}
BomMaster rowData = bomManagementMapper.getRowData(bomMaster);
if(rowData!=null){
bomManagementMapper.deleteRowBom(rowData);
BomDetail temp1=new BomDetail();
temp1.setBomCode(entity.getBomCode());
bomManagementMapper.deleteBomDetail(temp1);
BomReplace temp2=new BomReplace();
temp2.setBomCode(entity.getBomCode());
bomManagementMapper.deleteBomReplace(temp2);
bomManagementMapper.insertBomMaster(bomMaster);
if(bomDetailList.size() >0) {
bomManagementMapper.insertBomDetailBackup(bomDetailList);
}
if(bomReplaceList.size()>0) {
bomManagementMapper.insertBomReplaceBackup(bomReplaceList);
}
}else {
bomManagementMapper.insertBomMaster(bomMaster);
if(bomDetailList.size()>0) {
bomManagementMapper.insertBomDetailBackup(bomDetailList);
}
if(bomReplaceList.size()>0) {
bomManagementMapper.insertBomReplaceBackup(bomReplaceList);
}
}
}catch (Exception exception){
exception.printStackTrace();
TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
return ResultData.fail("在导入过程中出现了问题,请核对表格");
}
return ResultData.succeed("导入成功");
}

自定义导出excel参考

@Override
public ResponseEntity<byte[]> derive(ScheduleMaster scheduleMaster) {
List<Map<String, String>> dateList = new ArrayList<>();
List<Map<String, Object>> tableDataList = new ArrayList<>();
List<Map<String, Object>> dateDataList = new ArrayList<>();
List<Map<String, Object>> beforeDateDataList = new ArrayList<>();
SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd");
String[] weekDays = {"星期日", "星期一", "星期二", "星期三", "星期四", "星期五", "星期六"};
String sqlString = ",";
//选择的时间
String selectTime = scheduleMaster.getSelectTime();
Date parse = null;
try {
parse = simpleDateFormat.parse(selectTime);
} catch (ParseException e) {
e.printStackTrace();
}
Calendar instance = Calendar.getInstance();
instance.setTime(parse);
//选择的时间的后7天
instance.add(Calendar.DATE, 7);
Date endSelectTime = instance.getTime();
scheduleMaster.setEndSelectTime(simpleDateFormat.format(endSelectTime));
//选择的时间的后7天
instance.add(Calendar.DATE, -14);
Date startSelectTime = instance.getTime();
scheduleMaster.setStartSelectTime(simpleDateFormat.format(startSelectTime));
while (instance.getTime().compareTo(endSelectTime) <= 0) {
instance.add(Calendar.DATE, 1);
HashMap<String, String> dateMap = new HashMap<>();
dateMap.put("dateTime", simpleDateFormat.format(instance.getTime()));
sqlString = sqlString + "'' as '" + simpleDateFormat.format(instance.getTime()) + "',";
dateMap.put("weekDate", weekDays[instance.get(Calendar.DAY_OF_WEEK) - 1]);
dateList.add(dateMap);
}
String sqlDateString = "";
if (sqlString.length() > 1) {
sqlDateString = sqlString.substring(0, sqlString.length() - 1);
}
scheduleMaster.setSqlDateString(sqlDateString);
dateDataList = scheduleMasterMapper.getPlannedShipmentDetailsBySelectTimeProductionPLanCapacity(scheduleMaster);
tableDataList = scheduleMasterMapper.getPlannedShipmentDetails(scheduleMaster);
beforeDateDataList = scheduleMasterMapper.getPlannedShipmentDetailsBySelectTimeSmtProductTransaction(scheduleMaster);
if (!tableDataList.isEmpty()) {
for (int i = 0; i < tableDataList.size(); i++) {
Map<String, Object> map1 = tableDataList.get(i);
for (Map<String, String> date : dateList) {
String dateTime = date.get("dateTime");
List<Map<String, Object>> collect = dateDataList.stream().filter(h -> h.get("schedule_code").equals(map1.get("schedule_code"))
&& h.get("work_date").equals(dateTime)).collect(Collectors.toList());
if (null != collect && collect.size() > 0) {
tableDataList.get(i).remove(dateTime);
tableDataList.get(i).put(dateTime, String.valueOf(collect.get(0).get("plan_output_qty")));
} else {
List<Map<String, Object>> collect1 = beforeDateDataList.stream().filter(h -> h.get("schedule_code").equals(map1.get("schedule_code"))
&& h.get("create_time").equals(dateTime)).collect(Collectors.toList());
if (null != collect1 && collect1.size() > 0) {
tableDataList.get(i).remove(dateTime);
tableDataList.get(i).put(dateTime, String.valueOf(collect1.get(0).get("t_qty")));
}
}
}
}
}
try {
String fileName = "计划出货报表";
//1.创建工作簿
HSSFWorkbook workbook = new HSSFWorkbook();
HSSFSheet sheet = workbook.createSheet("计划出货报表");
//设置列宽
sheet.setDefaultColumnWidth(10);
//固定9列 + 时间的列数
String[] columnNames = {"状态", "产品型号", "批号", "产品编号", "设计号", "客户", "工单量", "出货数量", "未出货数量"};
//处理列的条数和数据
List<String> dateTimeList = dateList.stream().map(h -> h.get("dateTime")).collect(Collectors.toList());
//String[] dateList = {"2023-04-16", "2023-04-17", "2023-04-18", "2023-04-19", "2023-04-20", "2023-04-21", "2023-04-22", "2023-04-23", "2023-04-24", "2023-04-25", "2023-04-26", "2023-04-27", "2023-04-28", "2023-04-29", "2023-04-30"};
//String[] weekList = {"星期日", "星期一", "星期二", "星期三", "星期四", "星期五", "星期六", "星期日", "星期一", "星期二", "星期三", "星期四", "星期五", "星期六", "星期日"};
List<String> weekList = dateList.stream().map(h -> h.get("weekDate")).collect(Collectors.toList());
List<String> columnList = new ArrayList<>();
columnList.addAll(Arrays.asList(columnNames));
columnList.addAll(dateTimeList);
//设置列长(原来固定的加上动态时间的)
//已开始固定的字段9个(状态 产品型号 批号 产品编号 设计号 客户 工单量 出货数量 未出货数量)
//假设为22
int dataSize = columnList.size();
//1.1创建合并单元格对象
CellRangeAddress cellAddressesHead = new CellRangeAddress(0, 2, 0, dataSize - 1);
//合并表格
sheet.addMergedRegion(cellAddressesHead);
//创建标题样式
HSSFCellStyle titleStyle = workbook.createCellStyle();
//居中
titleStyle.setAlignment(HorizontalAlignment.CENTER);
//背景颜色
titleStyle.setFillForegroundColor(IndexedColors.LIGHT_GREEN.getIndex());
//填充方式,默认为NO_FILL,所以就算上面set了背景颜色,下面没设置填充色也没效果
titleStyle.setFillPattern(FillPatternType.SOLID_FOREGROUND);
//设置字体样式
HSSFFont titleFont = workbook.createFont();
//加粗
titleFont.setBold(true);
//字体大小
titleFont.setFontHeight((short) 500);
//将字体赋值给样式
titleStyle.setFont(titleFont);
//设置表列头的样式
HSSFCellStyle cellStyle = workbook.createCellStyle();
cellStyle.setAlignment(HorizontalAlignment.CENTER);
cellStyle.setVerticalAlignment(VerticalAlignment.CENTER);
HSSFFont font = workbook.createFont();
font.setFontName("宋体");
font.setFontHeight((short) 230);
font.setBold(true);
cellStyle.setFont(font);
//编写第一行
HSSFRow titleRow = sheet.createRow(0);
HSSFCell cell = titleRow.createCell(0);
cell.setCellStyle(titleStyle);
cell.setCellValue("计划出货报表");
HSSFRow columnRowZero = sheet.createRow(3);
HSSFCellStyle cellStyleZero = workbook.createCellStyle();
cellStyleZero.setAlignment(HorizontalAlignment.CENTER);
cellStyleZero.setVerticalAlignment(VerticalAlignment.CENTER);
CellRangeAddress cellAddressesZero = new CellRangeAddress(3, 3, 6, 8);
sheet.addMergedRegion(cellAddressesZero);
columnRowZero.createCell(6).setCellValue("AMOI-S-PM-003B V1.0");
columnRowZero.getCell(6).setCellStyle(cellStyleZero);
HSSFRow columnRow = sheet.createRow(4);
columnRow.setHeight((short) 400);
HSSFRow columnRowSecond = sheet.createRow(5);
columnRowSecond.setHeight((short) 400);
for (int i = 0; i < columnList.size(); i++) {
if (i < 9) {
CellRangeAddress cellAddresses = new CellRangeAddress(4, 5, i, i);
sheet.addMergedRegion(cellAddresses);
columnRow.createCell(i).setCellValue(columnNames[i]);
columnRow.getCell(i).setCellStyle(cellStyle);
} else {
columnRow.createCell(i).setCellValue(dateTimeList.get(i-9));
columnRowSecond.createCell(i).setCellValue(weekList.get(i-9));
}
}
for (int i = 6; i < tableDataList.size() + 6; i++) {
HSSFRow row = sheet.createRow(i);
row.createCell(0).setCellValue(tableDataList.get(i - 6).get("status").toString());
row.createCell(1).setCellValue(tableDataList.get(i - 6).get("model_code").toString());
row.createCell(2).setCellValue(tableDataList.get(i - 6).get("schedule_code").toString());
row.createCell(3).setCellValue(tableDataList.get(i - 6).get("material_code").toString());
row.createCell(4).setCellValue(tableDataList.get(i - 6).get("design_code")==null?"":tableDataList.get(i - 6).get("design_code").toString());
row.createCell(5).setCellValue(tableDataList.get(i - 6).get("to_customer").toString());
row.createCell(6).setCellValue(String.valueOf(tableDataList.get(i - 6).get("schedule_qty")));
row.createCell(7).setCellValue(String.valueOf(tableDataList.get(i - 6).get("shipment_qty")));
row.createCell(8).setCellValue(String.valueOf(tableDataList.get(i - 6).get("not_shipment_qty")));
for(int s=0 ; s<dateTimeList.size();s++){
row.createCell(s+9).setCellValue(String.valueOf(tableDataList.get(i - 6).get(dateTimeList.get(s))));
}
}
ByteArrayOutputStream os = new ByteArrayOutputStream();
workbook.write(os);
// 设置请求头内容,告诉浏览器代开下载窗口
HttpHeaders headers = new HttpHeaders();
headers.setContentType(MediaType.APPLICATION_OCTET_STREAM);
headers.setContentDispositionFormData("attachment", URLEncoder.encode(fileName, "UTF-8") + ".xlsx");
ResponseEntity<byte[]> responseEntity = new ResponseEntity<byte[]>(os.toByteArray(), headers, HttpStatus.OK);
return responseEntity;
} catch (Exception exception) {
exception.printStackTrace();
}
return null;
}

Java读取Excel表格中的图片_java读取excel中的图片-CSDN博客

读取图片

不同版本的excel有不同的拓展名(.[xls](https://so.csdn.net/so/search?q=xls&spm=1001.2101.3001.7020) .xlsx),对应不同的方法。

所有的图片在excel中保存在一个集合中,以行列号为key,图片为value,将结果封装到map集合中,图片的格式为“HSSFPictureData”“XSSFPictureData”。
/**
* 获取图片和位置 (xls)
* @param sheet
* @return
* @throws IOException
*/
public static Map<String, HSSFPictureData> getPictures (HSSFSheet sheet) throws IOException {
Map<String, HSSFPictureData> map = new HashMap<String, HSSFPictureData>();
List<HSSFShape> list = sheet.getDrawingPatriarch().getChildren();
for (HSSFShape shape : list) {
if (shape instanceof HSSFPicture) {
HSSFPicture picture = (HSSFPicture) shape;
HSSFClientAnchor cAnchor = picture.getClientAnchor();
HSSFPictureData pdata = picture.getPictureData();
String key = cAnchor.getRow1() + "-" + cAnchor.getCol1(); // 行号-列号
map.put(key, pdata);
}
}
return map;
}

/**
* 获取图片和位置 (xlsx)
* @param sheet
* @return
* @throws IOException
*/
public static Map<String, XSSFPictureData> getPictures (XSSFSheet sheet) throws IOException {
Map<String, XSSFPictureData> map = new HashMap<String, XSSFPictureData>();
List<POIXMLDocumentPart> list = sheet.getRelations();
for (POIXMLDocumentPart part : list) {
if (part instanceof XSSFDrawing) {
XSSFDrawing drawing = (XSSFDrawing) part;
List<XSSFShape> shapes = drawing.getShapes();
for (XSSFShape shape : shapes) {
XSSFPicture picture = (XSSFPicture) shape;
XSSFClientAnchor anchor = picture.getPreferredSize();
CTMarker marker = anchor.getFrom();
String key = marker.getRow() + "-" + marker.getCol();
map.put(key, picture.getPictureData());
}
}
}
return map;
}
从map拿到图片使用输出流将图片保存在本地
PictureData picData = map.get(hang-1+":"+20);
String ext = picData.suggestFileExtension();//获取图片的后缀名
byte[] data = picData.getData();
String fileName = UUID.randomUUID().toString();
//文件夹路径:temporarypath
String temporarypath = FtpPropertiesLoader.get("star");
FileOutputStream out = new FileOutputStream(star + fileName + ext);
out.write(data);
out.close();