diff --git a/jero-boot/jero-boot-modules/pom.xml b/jero-boot/jero-boot-modules/pom.xml index 1f4c12fa2..28338b917 100644 --- a/jero-boot/jero-boot-modules/pom.xml +++ b/jero-boot/jero-boot-modules/pom.xml @@ -124,7 +124,7 @@ cn.afterturn easypoi-base - 3.2.0 + 3.3.0 org.apache.poi @@ -143,12 +143,31 @@ cn.afterturn easypoi-web - 3.2.0 + 3.3.0 cn.afterturn easypoi-annotation - 3.2.0 + 3.3.0 + + + com.monitorjbl + xlsx-streamer + 1.2.0 + + + org.apache.poi + poi-ooxml-schemas + + + org.apache.poi + poi-ooxml + + + org.apache.poi + poi + + com.github.junrar diff --git a/jero-boot/jero-boot-modules/src/main/java/com/jero/modules/cert/template/service/impl/ParamsInfoEOServiceImpl.java b/jero-boot/jero-boot-modules/src/main/java/com/jero/modules/cert/template/service/impl/ParamsInfoEOServiceImpl.java index f41bf40a0..2d39a24d8 100644 --- a/jero-boot/jero-boot-modules/src/main/java/com/jero/modules/cert/template/service/impl/ParamsInfoEOServiceImpl.java +++ b/jero-boot/jero-boot-modules/src/main/java/com/jero/modules/cert/template/service/impl/ParamsInfoEOServiceImpl.java @@ -6,6 +6,7 @@ import cn.afterturn.easypoi.excel.entity.result.ExcelImportResult; import cn.hutool.core.collection.CollectionUtil; import cn.hutool.core.util.ObjectUtil; import cn.hutool.core.util.ZipUtil; +import cn.hutool.poi.excel.ExcelReader; import com.aliyuncs.utils.IOUtils; import com.baomidou.mybatisplus.core.conditions.Wrapper; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; @@ -25,6 +26,7 @@ import com.jero.modules.cert.template.mapper.ParamsInfoEOMapper; import com.jero.modules.cert.template.service.ICertCategoryParamsInfoEOService; import com.jero.modules.cert.template.service.IParamsInfoEOService; import com.jero.modules.cert.template.utils.CommonExcelExportStyler; +import com.jero.modules.cert.template.utils.RightSheetExcelImportUtil; import com.jero.modules.cert.template.vo.*; import com.jero.modules.oss.entity.OSSFile; import com.jero.modules.oss.service.IOSSFileService; @@ -34,6 +36,7 @@ import com.jero.modules.system.entity.SysCategory; import com.jero.modules.system.entity.SysDictItem; import com.jero.modules.system.service.ISysDictItemService; import com.jero.modules.system.service.impl.SysCategoryServiceImpl; +import com.monitorjbl.xlsx.StreamingReader; import org.apache.commons.io.FileUtils; import org.apache.commons.lang3.ObjectUtils; import org.apache.commons.lang3.StringUtils; @@ -904,8 +907,11 @@ public class ParamsInfoEOServiceImpl extends ServiceImpl paramsInfoEOList = new ArrayList<>(); Map> certCategoryParamsInfoEOListMap = new HashMap<>(); @@ -936,16 +942,16 @@ public class ParamsInfoEOServiceImpl extends ServiceImpl resultEn = ExcelImportUtil.importExcelMore(excelfile,ParamsInfoEnImport.class, params); - List paramsInfoEOListEn = resultEn.getList(); + // importExcelBySax 方法有bug,仅能导入第一个sheet页,所以仅针对numSheet为0的时候使用 + List paramsInfoEOListEn = RightSheetExcelImportUtil.importExcelBySax(new FileInputStream(excelfile), ParamsInfoCnImport.class, params); + copyParamsInfoList(paramsInfoEOListEn, paramsInfoEOList); } else { String fields[] ={ "*NIO编号", "*是否必填", "*参数名称","*参数批次","*责任领域", "参数说明", "*控件类型", "控件校验", "控件备选值", "默认值", "附件模板"}; params.setImportFields(fields); - - ExcelImportResult result = ExcelImportUtil.importExcelMore(excelfile, ParamsInfoCnImport.class, params); - paramsInfoEOList = result.getList(); + // importExcelBySax 方法有bug,仅能导入第一个sheet页,所以仅针对numSheet为0的时候使用 + paramsInfoEOList = RightSheetExcelImportUtil.importExcelBySax(new FileInputStream(excelfile), ParamsInfoCnImport.class, params); } } else { // 认证类别参数表 @@ -955,15 +961,13 @@ public class ParamsInfoEOServiceImpl extends ServiceImpl resultEn = ExcelImportUtil.importExcelMore(excelfile, CertCategoryParamsInfoEnImport.class, params); - List listEn = resultEn.getList(); + List listEn = RightSheetExcelImportUtil.importExcelBySax(new FileInputStream(excelfile), CertCategoryParamsInfoEnImport.class, params); copycertCategoryParamsInfoList(listEn, list); } else { String fields[] ={ "*NIO编号", "*编号", "*参数名称","参数说明"}; params.setImportFields(fields); - ExcelImportResult result = ExcelImportUtil.importExcelMore(excelfile, CertCategoryParamsInfoCnImport.class, params); - list = result.getList(); + list = RightSheetExcelImportUtil.importExcelBySax(new FileInputStream(excelfile), CertCategoryParamsInfoCnImport.class, params); } if (CollectionUtil.isNotEmpty(list)) { list.remove(0); // 去掉填写说明 diff --git a/jero-boot/jero-boot-modules/src/main/java/com/jero/modules/cert/template/utils/RightSheetExcelImportUtil.java b/jero-boot/jero-boot-modules/src/main/java/com/jero/modules/cert/template/utils/RightSheetExcelImportUtil.java new file mode 100644 index 000000000..bbf4b787d --- /dev/null +++ b/jero-boot/jero-boot-modules/src/main/java/com/jero/modules/cert/template/utils/RightSheetExcelImportUtil.java @@ -0,0 +1,20 @@ +package com.jero.modules.cert.template.utils; + +import cn.afterturn.easypoi.excel.entity.ImportParams; +import cn.afterturn.easypoi.excel.imports.sax.SaxReadExcel; +import cn.afterturn.easypoi.excel.imports.sax.parse.ISaxRowRead; +import cn.afterturn.easypoi.handler.inter.IExcelReadRowHandler; + +import java.io.InputStream; +import java.util.List; + +/** + * 覆写为正确的sheet读取的工具类 + */ +public class RightSheetExcelImportUtil { + + public static List importExcelBySax(InputStream inputstream, Class pojoClass, ImportParams params) { + return (new RightSheetSaxReadExcel()).readExcel(inputstream, pojoClass, params, (ISaxRowRead)null, (IExcelReadRowHandler)null); + } + +} diff --git a/jero-boot/jero-boot-modules/src/main/java/com/jero/modules/cert/template/utils/RightSheetSaxReadExcel.java b/jero-boot/jero-boot-modules/src/main/java/com/jero/modules/cert/template/utils/RightSheetSaxReadExcel.java new file mode 100644 index 000000000..ef2442881 --- /dev/null +++ b/jero-boot/jero-boot-modules/src/main/java/com/jero/modules/cert/template/utils/RightSheetSaxReadExcel.java @@ -0,0 +1,81 @@ +package com.jero.modules.cert.template.utils; + +import cn.afterturn.easypoi.excel.entity.ImportParams; +import cn.afterturn.easypoi.excel.imports.sax.SaxReadExcel; +import cn.afterturn.easypoi.excel.imports.sax.SheetHandler; +import cn.afterturn.easypoi.excel.imports.sax.parse.ISaxRowRead; +import cn.afterturn.easypoi.excel.imports.sax.parse.SaxRowRead; +import cn.afterturn.easypoi.exception.excel.ExcelImportException; +import cn.afterturn.easypoi.handler.inter.IExcelReadRowHandler; +import org.apache.poi.openxml4j.opc.OPCPackage; +import org.apache.poi.xssf.eventusermodel.XSSFReader; +import org.apache.poi.xssf.model.SharedStringsTable; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.xml.sax.ContentHandler; +import org.xml.sax.InputSource; +import org.xml.sax.SAXException; +import org.xml.sax.XMLReader; +import org.xml.sax.helpers.XMLReaderFactory; + +import java.io.InputStream; +import java.util.Iterator; +import java.util.List; + +/** + * 修复SaxReadExcel Sheet不正确的问题 + */ +public class RightSheetSaxReadExcel extends SaxReadExcel { + + private static final Logger LOGGER = LoggerFactory.getLogger(RightSheetSaxReadExcel.class); + + @Override + public List readExcel(InputStream inputstream, Class pojoClass, ImportParams params, ISaxRowRead rowRead, IExcelReadRowHandler hanlder) { + try { + OPCPackage opcPackage = OPCPackage.open(inputstream); + return this.readExcel(opcPackage, pojoClass, params, rowRead, hanlder); + } catch (Exception var7) { + LOGGER.error(var7.getMessage(), var7); + throw new ExcelImportException(var7.getMessage()); + } + } + + private List readExcel(OPCPackage opcPackage, Class pojoClass, ImportParams params, ISaxRowRead rowRead, IExcelReadRowHandler hanlder) { + try { + XSSFReader xssfReader = new XSSFReader(opcPackage); + SharedStringsTable sst = xssfReader.getSharedStringsTable(); + if (rowRead == null) { + rowRead = new SaxRowRead(pojoClass, params, hanlder); + } + + XMLReader parser = this.fetchSheetParser(sst, (ISaxRowRead)rowRead); + Iterator sheets = xssfReader.getSheetsData(); + int sheetIndex = 0; + + while (sheets.hasNext() && sheetIndex < params.getSheetNum() + params.getStartSheetIndex()) { + if (sheetIndex < params.getStartSheetIndex()) { + sheets.next(); + } else { + InputStream sheet = sheets.next(); + InputSource sheetSource = new InputSource(sheet); + parser.parse(sheetSource); + sheet.close(); + } + sheetIndex++; + } + + return ((ISaxRowRead)rowRead).getList(); + } catch (Exception var13) { + LOGGER.error(var13.getMessage(), var13); + throw new ExcelImportException("SAX导入数据失败"); + } + } + + private XMLReader fetchSheetParser(SharedStringsTable sst, ISaxRowRead rowRead) throws SAXException { + XMLReader parser = XMLReaderFactory.createXMLReader("org.apache.xerces.parsers.SAXParser"); + ContentHandler handler = new SheetHandler(sst, rowRead); + parser.setContentHandler(handler); + return parser; + } + +}