From 9de2cb5d5c15b0fa27bf3d7093dcd09801ab8a3e Mon Sep 17 00:00:00 2001 From: "qrb.jueyue@gmail.com" Date: Thu, 28 Dec 2017 17:28:25 +0800 Subject: [PATCH] =?UTF-8?q?=E5=AF=BC=E5=85=A5=E5=88=B6=E5=AE=9A=E5=88=97,?= =?UTF-8?q?=E5=AF=BC=E5=85=A5,=E8=A7=A3=E5=86=B3=E5=A4=8D=E6=9D=82?= =?UTF-8?q?=E8=A1=A8=E5=A4=B4=E7=9A=84=E5=AF=BC=E5=85=A5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../easypoi/excel/annotation/Excel.java | 6 ++ .../easypoi/excel/ExcelExportUtil.java | 2 +- .../easypoi/excel/ExcelImportUtil.java | 8 +-- .../excel/entity/params/ExcelBaseEntity.java | 13 +++- .../excel/imports/ExcelImportService.java | 66 +++++++++++++------ .../excel/imports/base/ImportBaseService.java | 7 +- 6 files changed, 74 insertions(+), 28 deletions(-) diff --git a/easypoi-annotation/src/main/java/cn/afterturn/easypoi/excel/annotation/Excel.java b/easypoi-annotation/src/main/java/cn/afterturn/easypoi/excel/annotation/Excel.java index cd27fd5..bc6cac5 100644 --- a/easypoi-annotation/src/main/java/cn/afterturn/easypoi/excel/annotation/Excel.java +++ b/easypoi-annotation/src/main/java/cn/afterturn/easypoi/excel/annotation/Excel.java @@ -150,4 +150,10 @@ public @interface Excel { * @return */ public String isImportField() default "false"; + + /** + * 固定的某一列,解决不好解析的问题 + * @return + */ + public int fixedIndex() default -1; } diff --git a/easypoi-base/src/main/java/cn/afterturn/easypoi/excel/ExcelExportUtil.java b/easypoi-base/src/main/java/cn/afterturn/easypoi/excel/ExcelExportUtil.java index 0f8a4c1..ad49448 100644 --- a/easypoi-base/src/main/java/cn/afterturn/easypoi/excel/ExcelExportUtil.java +++ b/easypoi-base/src/main/java/cn/afterturn/easypoi/excel/ExcelExportUtil.java @@ -100,7 +100,7 @@ public class ExcelExportUtil { * Excel对象数据List */ public static Workbook exportExcel(ExportParams entity, List entityList, - Collection> dataSet) { + Collection dataSet) { Workbook workbook = getWorkbook(entity.getType(),dataSet.size());; new ExcelExportService().createSheetForMap(workbook, entity, entityList, dataSet); return workbook; diff --git a/easypoi-base/src/main/java/cn/afterturn/easypoi/excel/ExcelImportUtil.java b/easypoi-base/src/main/java/cn/afterturn/easypoi/excel/ExcelImportUtil.java index 7c74371..95bf741 100644 --- a/easypoi-base/src/main/java/cn/afterturn/easypoi/excel/ExcelImportUtil.java +++ b/easypoi-base/src/main/java/cn/afterturn/easypoi/excel/ExcelImportUtil.java @@ -59,7 +59,7 @@ public class ExcelImportUtil { FileInputStream in = null; try { in = new FileInputStream(file); - return new ExcelImportService().importExcelByIs(in, pojoClass, params).getList(); + return new ExcelImportService().importExcelByIs(in, pojoClass, params, false).getList(); } catch (ExcelImportException e) { throw new ExcelImportException(e.getType(), e); } catch (Exception e) { @@ -81,7 +81,7 @@ public class ExcelImportUtil { */ public static List importExcel(InputStream inputstream, Class pojoClass, ImportParams params) throws Exception { - return new ExcelImportService().importExcelByIs(inputstream, pojoClass, params).getList(); + return new ExcelImportService().importExcelByIs(inputstream, pojoClass, params, false).getList(); } /** @@ -97,7 +97,7 @@ public class ExcelImportUtil { public static ExcelImportResult importExcelMore(InputStream inputstream, Class pojoClass, ImportParams params) throws Exception { - return new ExcelImportService().importExcelByIs(inputstream, pojoClass, params); + return new ExcelImportService().importExcelByIs(inputstream, pojoClass, params, true); } /** @@ -113,7 +113,7 @@ public class ExcelImportUtil { FileInputStream in = null; try { in = new FileInputStream(file); - return new ExcelImportService().importExcelByIs(in, pojoClass, params); + return new ExcelImportService().importExcelByIs(in, pojoClass, params, true); } catch (ExcelImportException e) { throw new ExcelImportException(e.getType(), e); } catch (Exception e) { diff --git a/easypoi-base/src/main/java/cn/afterturn/easypoi/excel/entity/params/ExcelBaseEntity.java b/easypoi-base/src/main/java/cn/afterturn/easypoi/excel/entity/params/ExcelBaseEntity.java index 2901bfa..90f8feb 100644 --- a/easypoi-base/src/main/java/cn/afterturn/easypoi/excel/entity/params/ExcelBaseEntity.java +++ b/easypoi-base/src/main/java/cn/afterturn/easypoi/excel/entity/params/ExcelBaseEntity.java @@ -57,7 +57,11 @@ public class ExcelBaseEntity { /** * 这个是不是超链接,如果是需要实现接口返回对象 */ - private boolean hyperlink; + private boolean hyperlink; + /** + * 固定的列 + */ + private Integer fixedIndex; private List methods; @@ -134,4 +138,11 @@ public class ExcelBaseEntity { this.hyperlink = hyperlink; } + public int getFixedIndex() { + return fixedIndex; + } + + public void setFixedIndex(int fixedIndex) { + this.fixedIndex = fixedIndex; + } } diff --git a/easypoi-base/src/main/java/cn/afterturn/easypoi/excel/imports/ExcelImportService.java b/easypoi-base/src/main/java/cn/afterturn/easypoi/excel/imports/ExcelImportService.java index b38d987..d95f899 100644 --- a/easypoi-base/src/main/java/cn/afterturn/easypoi/excel/imports/ExcelImportService.java +++ b/easypoi-base/src/main/java/cn/afterturn/easypoi/excel/imports/ExcelImportService.java @@ -17,6 +17,10 @@ import org.apache.commons.lang3.StringUtils; import org.apache.commons.lang3.builder.ReflectionToStringBuilder; import org.apache.poi.hssf.usermodel.HSSFSheet; import org.apache.poi.hssf.usermodel.HSSFWorkbook; +import org.apache.poi.openxml4j.exceptions.InvalidFormatException; +import org.apache.poi.openxml4j.opc.OPCPackage; +import org.apache.poi.poifs.filesystem.DocumentFactoryHelper; +import org.apache.poi.poifs.filesystem.NPOIFSFileSystem; import org.apache.poi.ss.formula.functions.T; import org.apache.poi.ss.usermodel.Cell; import org.apache.poi.ss.usermodel.CellStyle; @@ -37,14 +41,9 @@ import java.io.ByteArrayOutputStream; import java.io.File; import java.io.FileOutputStream; import java.io.InputStream; +import java.io.PushbackInputStream; import java.lang.reflect.Field; -import java.util.ArrayList; -import java.util.Collection; -import java.util.HashMap; -import java.util.Iterator; -import java.util.LinkedHashMap; -import java.util.List; -import java.util.Map; +import java.util.*; import cn.afterturn.easypoi.excel.annotation.ExcelTarget; import cn.afterturn.easypoi.excel.entity.ImportParams; @@ -173,7 +172,7 @@ public class ExcelImportService extends ImportBaseService { for (int j = 0; j < params.getTitleRows(); j++) { rows.next(); } - Map titlemap = getTitleMap(rows, params, excelCollection); + Map titlemap = getTitleMap(rows, params, excelCollection,excelParams); checkIsValidTemplate(titlemap, excelParams, params, excelCollection); Row row = null; Object object = null; @@ -206,13 +205,14 @@ public class ExcelImportService extends ImportBaseService { } else { object = PoiPublicUtil.createObject(pojoClass, targetId); try { - for (int i = row.getFirstCellNum(), le = titlemap.size(); i < le; i++) { - Cell cell = row.getCell(i); - String titleString = (String) titlemap.get(i); + Set keys = titlemap.keySet(); + for (Integer cn:keys) { + Cell cell = row.getCell(cn); + String titleString = (String) titlemap.get(cn); if (excelParams.containsKey(titleString) || Map.class.equals(pojoClass)) { if (excelParams.get(titleString) != null && excelParams.get(titleString).getType() == 2) { - picId = row.getRowNum() + "_" + i; + picId = row.getRowNum() + "_" + cn; saveImage(object, picId, excelParams, titleString, pictures, params); } else { @@ -220,6 +220,9 @@ public class ExcelImportService extends ImportBaseService { } } } + //for (int i = row.getFirstCellNum(), le = titlemap.size(); i < le; i++) { + + //} for (ExcelCollectionParams param : excelCollection) { addListContinue(object, param, row, titlemap, targetId, pictures, params); @@ -294,7 +297,8 @@ public class ExcelImportService extends ImportBaseService { * 获取表格字段列名对应信息 */ private Map getTitleMap(Iterator rows, ImportParams params, - List excelCollection) { + List excelCollection, + Map excelParams) { Map titlemap = new LinkedHashMap(); Iterator cellTitle; String collectionName = null; @@ -331,6 +335,15 @@ public class ExcelImportService extends ImportBaseService { } } } + + // 处理指定列的情况 + Set keys = excelParams.keySet(); + for (String key : keys){ + if (key.startsWith("FIXED_")){ + String [] arr = key.split("_"); + titlemap.put(Integer.parseInt(arr[1]),key); + } + } return titlemap; } @@ -351,7 +364,7 @@ public class ExcelImportService extends ImportBaseService { * Excel 导入 field 字段类型 Integer,Long,Double,Date,String,Boolean */ public ExcelImportResult importExcelByIs(InputStream inputstream, Class pojoClass, - ImportParams params) throws Exception { + ImportParams params, boolean needMore) throws Exception { if (LOGGER.isDebugEnabled()) { LOGGER.debug("Excel import start ,class is {}", pojoClass); } @@ -365,8 +378,15 @@ public class ExcelImportService extends ImportBaseService { baos.flush(); InputStream userIs = new ByteArrayInputStream(baos.toByteArray()); + if (LOGGER.isDebugEnabled()) { + LOGGER.debug("Excel clone success"); + } Workbook book = WorkbookFactory.create(userIs); + boolean isXSSFWorkbook = !(book instanceof HSSFWorkbook); + if (LOGGER.isDebugEnabled()) { + LOGGER.debug("Workbook create success"); + } ExcelImportResult importResult = new ExcelImportResult(); createErrorCellStyle(book); Map pictures; @@ -387,7 +407,7 @@ public class ExcelImportService extends ImportBaseService { } result.addAll(importExcel(result, book.getSheetAt(i), pojoClass, params, pictures)); if (LOGGER.isDebugEnabled()) { - LOGGER.debug(" end to read excel list by pos ,endTime is {}", System.currentTimeMillis()); + LOGGER.debug(" end to read excel list by sheet ,endTime is {}", System.currentTimeMillis()); } if (params.isReadSingleCell()) { readSingleCell(importResult, book.getSheetAt(i), params); @@ -399,13 +419,17 @@ public class ExcelImportService extends ImportBaseService { if (params.isNeedSave()) { saveThisExcel(params, pojoClass, isXSSFWorkbook, book); } - InputStream successIs = new ByteArrayInputStream(baos.toByteArray()); - Workbook successBook = WorkbookFactory.create(successIs); - importResult.setWorkbook(removeSuperfluousRows(successBook, failRow, params)); - importResult.setFailWorkbook(removeSuperfluousRows(book, successRow, params)); importResult.setList(result); - importResult.setFailList(failCollection); - importResult.setVerfiyFail(verfiyFail); + if (needMore) { + InputStream successIs = new ByteArrayInputStream(baos.toByteArray()); + Workbook successBook = WorkbookFactory.create(successIs); + importResult.setWorkbook(removeSuperfluousRows(successBook, failRow, params)); + importResult.setFailWorkbook(removeSuperfluousRows(book, successRow, params)); + importResult.setFailList(failCollection); + importResult.setVerfiyFail(verfiyFail); + successIs.close(); + } + baos.close(); return importResult; } diff --git a/easypoi-base/src/main/java/cn/afterturn/easypoi/excel/imports/base/ImportBaseService.java b/easypoi-base/src/main/java/cn/afterturn/easypoi/excel/imports/base/ImportBaseService.java index 2611537..805947b 100644 --- a/easypoi-base/src/main/java/cn/afterturn/easypoi/excel/imports/base/ImportBaseService.java +++ b/easypoi-base/src/main/java/cn/afterturn/easypoi/excel/imports/base/ImportBaseService.java @@ -76,6 +76,7 @@ public class ImportBaseService { excelEntity.setSuffix(excel.suffix()); excelEntity.setImportField(Boolean .valueOf(PoiPublicUtil.getValueByTargetId(excel.isImportField(), targetId, "false"))); + excelEntity.setFixedIndex(excel.fixedIndex()); getExcelField(targetId, field, excelEntity, excel, pojoClass, excelEntityAnn); if (getMethods != null) { List newMethods = new ArrayList(); @@ -83,7 +84,11 @@ public class ImportBaseService { newMethods.add(excelEntity.getMethod()); excelEntity.setMethods(newMethods); } - temp.put(excelEntity.getName(), excelEntity); + if(excelEntity.getFixedIndex() != -1){ + temp.put("FIXED_"+excelEntity.getFixedIndex() , excelEntity); + } else { + temp.put(excelEntity.getName(), excelEntity); + } }