| @@ -28,6 +28,9 @@ public class ExcelToHtmlParams { | |||
| */ | |||
| private String path = null; | |||
| private boolean showRowNum = false; | |||
| private boolean showColumnHead = false; | |||
| public ExcelToHtmlParams(Workbook wb) { | |||
| this.wb = wb; | |||
| } | |||
| @@ -98,6 +101,22 @@ public class ExcelToHtmlParams { | |||
| this.path = path; | |||
| } | |||
| public boolean isShowRowNum() { | |||
| return showRowNum; | |||
| } | |||
| public void setShowRowNum(boolean showRowNum) { | |||
| this.showRowNum = showRowNum; | |||
| } | |||
| public boolean isShowColumnHead() { | |||
| return showColumnHead; | |||
| } | |||
| public void setShowColumnHead(boolean showColumnHead) { | |||
| this.showColumnHead = showColumnHead; | |||
| } | |||
| @Override | |||
| public boolean equals(Object obj) { | |||
| if (obj instanceof ExcelToHtmlParams) { | |||
| @@ -102,6 +102,14 @@ public class ImportParams extends ExcelBaseParams { | |||
| * 仅仅支持titleRows + headRows + startRows 以及 lastOfInvalidRow | |||
| */ | |||
| private boolean readSingleCell = false; | |||
| /** | |||
| * 是否并行计算 | |||
| */ | |||
| private boolean concurrentTask = false; | |||
| /** | |||
| * 最小截取大小 | |||
| */ | |||
| private Integer critical = 1000; | |||
| public int getHeadRows() { | |||
| return headRows; | |||
| @@ -238,4 +246,20 @@ public class ImportParams extends ExcelBaseParams { | |||
| public void setNeedCheckOrder(boolean needCheckOrder) { | |||
| this.needCheckOrder = needCheckOrder; | |||
| } | |||
| public boolean isConcurrentTask() { | |||
| return concurrentTask; | |||
| } | |||
| public void setConcurrentTask(boolean concurrentTask) { | |||
| this.concurrentTask = concurrentTask; | |||
| } | |||
| public Integer getCritical() { | |||
| return critical; | |||
| } | |||
| public void setCritical(Integer critical) { | |||
| this.critical = critical; | |||
| } | |||
| } | |||
| @@ -621,11 +621,15 @@ public final class ExcelExportOfTemplateUtil extends BaseExportService { | |||
| private void setMergedRegionStyle(Row row, int ci, ExcelForEachParams params) { | |||
| //第一行数据 | |||
| for (int i = 1; i < params.getColspan(); i++) { | |||
| row.getCell(ci + i).setCellStyle(params.getCellStyle()); | |||
| if(params.getCellStyle() != null){ | |||
| row.getCell(ci + i).setCellStyle(params.getCellStyle()); | |||
| } | |||
| } | |||
| for (int i = 1; i < params.getRowspan(); i++) { | |||
| for (int j = 0; j < params.getColspan(); j++) { | |||
| row.getCell(ci + j).setCellStyle(params.getCellStyle()); | |||
| if(params.getCellStyle() != null){ | |||
| row.getCell(ci + j).setCellStyle(params.getCellStyle()); | |||
| } | |||
| } | |||
| } | |||
| } | |||
| @@ -785,6 +789,9 @@ public final class ExcelExportOfTemplateUtil extends BaseExportService { | |||
| try { | |||
| this.teplateParams = params; | |||
| wb = getCloneWorkBook(); | |||
| // 创建表格样式 | |||
| setExcelExportStyler((IExcelExportStyler) teplateParams.getStyle() | |||
| .getConstructor(Workbook.class).newInstance(wb)); | |||
| // step 3. 解析模板 | |||
| for (int i = 0, le = params.isScanAllsheet() ? wb.getNumberOfSheets() | |||
| : params.getSheetNum().length; i < le; i++) { | |||
| @@ -34,19 +34,21 @@ public class ExcelToHtmlService { | |||
| private String today; | |||
| private Workbook wb; | |||
| private int sheetNum; | |||
| private int cssRandom; | |||
| private int sheetNum; | |||
| private int cssRandom; | |||
| /*是不是完成界面*/ | |||
| private boolean completeHTML; | |||
| private Formatter out; | |||
| private boolean completeHTML; | |||
| private Formatter out; | |||
| /*已经完成范围处理*/ | |||
| private boolean gotBounds; | |||
| private int firstColumn; | |||
| private int endColumn; | |||
| private String imageCachePath; | |||
| private static final String COL_HEAD_CLASS = "colHeader"; | |||
| //private static final String ROW_HEAD_CLASS = "rowHeader"; | |||
| private boolean gotBounds; | |||
| private int firstColumn; | |||
| private int endColumn; | |||
| private String imageCachePath; | |||
| private boolean showRowNum; | |||
| private boolean showColumnHead; | |||
| private static final String COL_HEAD_CLASS = "colHeader"; | |||
| private static final String ROW_HEAD_CLASS = "rowHeader"; | |||
| private static final String DEFAULTS_CLASS = "excelDefaults"; | |||
| @@ -57,9 +59,11 @@ public class ExcelToHtmlService { | |||
| this.wb = params.getWb(); | |||
| this.completeHTML = params.isCompleteHTML(); | |||
| this.sheetNum = params.getSheetNum(); | |||
| cssRandom = (int) Math.ceil(Math.random() * 1000); | |||
| this.cssRandom = (int) Math.ceil(Math.random() * 1000); | |||
| this.imageCachePath = params.getPath(); | |||
| today = new SimpleDateFormat("yyyy_MM_dd").format(new Date()); | |||
| this.showRowNum = params.isShowRowNum(); | |||
| this.showColumnHead = params.isShowColumnHead(); | |||
| this.today = new SimpleDateFormat("yyyy_MM_dd").format(new Date()); | |||
| } | |||
| public String printPage() { | |||
| @@ -125,17 +129,19 @@ public class ExcelToHtmlService { | |||
| } | |||
| private void printSheet(Sheet sheet) { | |||
| out.format("<table class='%s' width='%s'>%n", DEFAULTS_CLASS, getTableWidth(sheet)); | |||
| out.format("<table class='%s' width='%spx;'>%n", DEFAULTS_CLASS, getTableWidth(sheet)); | |||
| printCols(sheet); | |||
| printSheetContent(sheet); | |||
| out.format("</table>%n"); | |||
| } | |||
| private void printCols(Sheet sheet) { | |||
| //out.format("<col/>%n"); | |||
| if (showRowNum) { | |||
| out.format("<col style='width:%spx;'/>%n", PoiPublicUtil.getNumDigits(sheet.getLastRowNum()) * 18); | |||
| } | |||
| ensureColumnBounds(sheet); | |||
| for (int i = firstColumn; i < endColumn; i++) { | |||
| out.format("<col style='width:%spx;' />%n", sheet.getColumnWidth(i) / 32); | |||
| out.format("<col style='width:%spx;' />%n", sheet.getColumnWidth(i) / 16); | |||
| } | |||
| } | |||
| @@ -143,7 +149,7 @@ public class ExcelToHtmlService { | |||
| ensureColumnBounds(sheet); | |||
| int width = 0; | |||
| for (int i = firstColumn; i < endColumn; i++) { | |||
| width = width + (sheet.getColumnWidth(i) / 32); | |||
| width = width + (sheet.getColumnWidth(i) / 16); | |||
| } | |||
| return width; | |||
| } | |||
| @@ -153,11 +159,11 @@ public class ExcelToHtmlService { | |||
| return; | |||
| } | |||
| Iterator<Row> iter = sheet.rowIterator(); | |||
| firstColumn = (iter.hasNext() ? Integer.MAX_VALUE : 0); | |||
| int lastRow = sheet.getLastRowNum(); | |||
| firstColumn = (lastRow > 1 ? Integer.MAX_VALUE : 0); | |||
| endColumn = 0; | |||
| while (iter.hasNext()) { | |||
| Row row = iter.next(); | |||
| for (int i = 0; i < lastRow; i++) { | |||
| Row row = sheet.getRow(lastRow); | |||
| short firstCell = row.getFirstCellNum(); | |||
| if (firstCell >= 0) { | |||
| firstColumn = Math.min(firstColumn, firstCell); | |||
| @@ -188,20 +194,24 @@ public class ExcelToHtmlService { | |||
| } | |||
| private void printSheetContent(Sheet sheet) { | |||
| //printColumnHeads(sheet); | |||
| if (showColumnHead) { | |||
| printColumnHeads(sheet); | |||
| } | |||
| MergedRegionHelper mergedRegionHelper = new MergedRegionHelper(sheet); | |||
| CellValueHelper cellValueHelper = new CellValueHelper(wb, cssRandom); | |||
| CellValueHelper cellValueHelper = new CellValueHelper(wb, cssRandom); | |||
| out.format("<tbody>%n"); | |||
| Iterator<Row> rows = sheet.rowIterator(); | |||
| int rowIndex = 1; | |||
| Iterator<Row> rows = sheet.rowIterator(); | |||
| int rowIndex = 1; | |||
| while (rows.hasNext()) { | |||
| Row row = rows.next(); | |||
| out.format(" <tr style='height:%spx;'>%n", row.getHeight() / 15); | |||
| //out.format(" <td class='%s'>%d</td>%n", ROW_HEAD_CLASS, row.getRowNum() + 1); | |||
| if (showRowNum) { | |||
| out.format(" <td style='font-size:12px;' >%d</td>%n", row.getRowNum() + 1); | |||
| } | |||
| for (int i = firstColumn; i < endColumn; i++) { | |||
| if (mergedRegionHelper.isNeedCreate(rowIndex, i)) { | |||
| String content = " "; | |||
| CellStyle style = null; | |||
| String content = " "; | |||
| CellStyle style = null; | |||
| if (i >= row.getFirstCellNum() && i < row.getLastCellNum()) { | |||
| Cell cell = row.getCell(i); | |||
| if (cell != null) { | |||
| @@ -15,6 +15,22 @@ | |||
| */ | |||
| package cn.afterturn.easypoi.excel.imports; | |||
| import cn.afterturn.easypoi.excel.entity.params.ExcelImportEntity; | |||
| import cn.afterturn.easypoi.excel.entity.sax.SaxReadCellEntity; | |||
| import cn.afterturn.easypoi.exception.excel.ExcelImportException; | |||
| import cn.afterturn.easypoi.exception.excel.enums.ExcelImportEnum; | |||
| import cn.afterturn.easypoi.handler.inter.IExcelDataHandler; | |||
| import cn.afterturn.easypoi.handler.inter.IExcelDictHandler; | |||
| import cn.afterturn.easypoi.util.PoiPublicUtil; | |||
| import cn.afterturn.easypoi.util.PoiReflectorUtil; | |||
| import org.apache.commons.lang3.StringUtils; | |||
| import org.apache.commons.lang3.time.DateUtils; | |||
| import org.apache.poi.ss.usermodel.Cell; | |||
| import org.apache.poi.ss.usermodel.CellType; | |||
| import org.apache.poi.ss.usermodel.DateUtil; | |||
| import org.slf4j.Logger; | |||
| import org.slf4j.LoggerFactory; | |||
| import java.lang.reflect.Method; | |||
| import java.lang.reflect.Type; | |||
| import java.math.BigDecimal; | |||
| @@ -27,29 +43,12 @@ import java.util.Date; | |||
| import java.util.List; | |||
| import java.util.Map; | |||
| import cn.afterturn.easypoi.handler.inter.IExcelDictHandler; | |||
| import cn.afterturn.easypoi.util.PoiReflectorUtil; | |||
| import org.apache.commons.lang3.StringUtils; | |||
| import org.apache.commons.lang3.time.DateUtils; | |||
| import org.apache.poi.ss.usermodel.Cell; | |||
| import org.apache.poi.ss.usermodel.CellType; | |||
| import org.apache.poi.ss.usermodel.DateUtil; | |||
| import org.slf4j.Logger; | |||
| import org.slf4j.LoggerFactory; | |||
| import cn.afterturn.easypoi.excel.entity.params.ExcelImportEntity; | |||
| import cn.afterturn.easypoi.excel.entity.sax.SaxReadCellEntity; | |||
| import cn.afterturn.easypoi.exception.excel.ExcelImportException; | |||
| import cn.afterturn.easypoi.exception.excel.enums.ExcelImportEnum; | |||
| import cn.afterturn.easypoi.handler.inter.IExcelDataHandler; | |||
| import cn.afterturn.easypoi.util.PoiPublicUtil; | |||
| /** | |||
| * Cell 取值服务 | |||
| * 判断类型处理数据 1.判断Excel中的类型 2.根据replace替换值 3.handler处理数据 4.判断返回类型转化数据返回 | |||
| * | |||
| * @author JueYue | |||
| * 2014年6月26日 下午10:42:28 | |||
| * 2014年6月26日 下午10:42:28 | |||
| */ | |||
| public class CellValueService { | |||
| @@ -93,14 +92,15 @@ public class CellValueService { | |||
| } | |||
| result = getDateData(entity, val); | |||
| if (result == null) { | |||
| return null; | |||
| } | |||
| } | |||
| if (("class java.sql.Date").equals(classFullName)) { | |||
| result = new java.sql.Date(((Date) result).getTime()); | |||
| } | |||
| if (("class java.sql.Time").equals(classFullName)) { | |||
| } else if (("class java.sql.Time").equals(classFullName)) { | |||
| result = new Time(((Date) result).getTime()); | |||
| } | |||
| if (("class java.sql.Timestamp").equals(classFullName)) { | |||
| } else if (("class java.sql.Timestamp").equals(classFullName)) { | |||
| result = new Timestamp(((Date) result).getTime()); | |||
| } | |||
| } else if (CellType.NUMERIC == cell.getCellType() && DateUtil.isCellDateFormatted(cell)) { | |||
| @@ -148,7 +148,7 @@ public class CellValueService { | |||
| private Object readNumericCell(Cell cell) { | |||
| Object result = null; | |||
| double value = cell.getNumericCellValue(); | |||
| double value = cell.getNumericCellValue(); | |||
| if (((int) value) == value) { | |||
| result = (int) value; | |||
| } else { | |||
| @@ -160,11 +160,11 @@ public class CellValueService { | |||
| /** | |||
| * 获取日期类型数据 | |||
| * | |||
| * @author JueYue | |||
| * 2013年11月26日 | |||
| * @param entity | |||
| * @param value | |||
| * @return | |||
| * @author JueYue | |||
| * 2013年11月26日 | |||
| */ | |||
| private Date getDateData(ExcelImportEntity entity, String value) { | |||
| if (StringUtils.isNotEmpty(entity.getFormat()) && StringUtils.isNotEmpty(value)) { | |||
| @@ -190,7 +190,8 @@ public class CellValueService { | |||
| /** | |||
| * 获取cell的值 | |||
| * @param object | |||
| * | |||
| * @param object | |||
| * @param cell | |||
| * @param excelParams | |||
| * @param titleString | |||
| @@ -199,9 +200,9 @@ public class CellValueService { | |||
| public Object getValue(IExcelDataHandler<?> dataHandler, Object object, String cell, | |||
| Map<String, ExcelImportEntity> excelParams, | |||
| String titleString, IExcelDictHandler dictHandler) throws Exception { | |||
| ExcelImportEntity entity = excelParams.get(titleString); | |||
| String classFullName = "class java.lang.Object"; | |||
| Class clazz = null; | |||
| ExcelImportEntity entity = excelParams.get(titleString); | |||
| String classFullName = "class java.lang.Object"; | |||
| Class clazz = null; | |||
| if (!(object instanceof Map)) { | |||
| Method setMethod = entity.getMethods() != null && entity.getMethods().size() > 0 | |||
| ? entity.getMethods().get(entity.getMethods().size() - 1) : entity.getMethod(); | |||
| @@ -224,7 +225,8 @@ public class CellValueService { | |||
| /** | |||
| * 获取cell的值 | |||
| * @param object | |||
| * | |||
| * @param object | |||
| * @param cell | |||
| * @param excelParams | |||
| * @param titleString | |||
| @@ -233,9 +235,9 @@ public class CellValueService { | |||
| public Object getValue(IExcelDataHandler<?> dataHandler, Object object, Cell cell, | |||
| Map<String, ExcelImportEntity> excelParams, | |||
| String titleString, IExcelDictHandler dictHandler) throws Exception { | |||
| ExcelImportEntity entity = excelParams.get(titleString); | |||
| String classFullName = "class java.lang.Object"; | |||
| Class clazz = null; | |||
| ExcelImportEntity entity = excelParams.get(titleString); | |||
| String classFullName = "class java.lang.Object"; | |||
| Class clazz = null; | |||
| if (!(object instanceof Map)) { | |||
| Method setMethod = entity.getMethods() != null && entity.getMethods().size() > 0 | |||
| ? entity.getMethods().get(entity.getMethods().size() - 1) : entity.getMethod(); | |||
| @@ -258,6 +260,7 @@ public class CellValueService { | |||
| /** | |||
| * 获取cell值 | |||
| * | |||
| * @param dataHandler | |||
| * @param object | |||
| * @param cellEntity | |||
| @@ -271,9 +274,9 @@ public class CellValueService { | |||
| ExcelImportEntity entity = excelParams.get(titleString); | |||
| Method setMethod = entity.getMethods() != null && entity.getMethods().size() > 0 | |||
| ? entity.getMethods().get(entity.getMethods().size() - 1) : entity.getMethod(); | |||
| Type[] ts = setMethod.getGenericParameterTypes(); | |||
| Type[] ts = setMethod.getGenericParameterTypes(); | |||
| String classFullName = ts[0].toString(); | |||
| Object result = cellEntity.getValue(); | |||
| Object result = cellEntity.getValue(); | |||
| result = handlerSuffix(entity.getSuffix(), result); | |||
| result = replaceValue(entity.getReplace(), result); | |||
| result = handlerValue(dataHandler, object, result, titleString); | |||
| @@ -282,6 +285,7 @@ public class CellValueService { | |||
| /** | |||
| * 把后缀删除掉 | |||
| * | |||
| * @param result | |||
| * @param suffix | |||
| * @return | |||
| @@ -405,7 +409,7 @@ public class CellValueService { | |||
| */ | |||
| private Object replaceValue(String[] replace, Object result) { | |||
| if (replace != null && replace.length > 0) { | |||
| String temp = String.valueOf(result); | |||
| String temp = String.valueOf(result); | |||
| String[] tempArr; | |||
| for (int i = 0; i < replace.length; i++) { | |||
| tempArr = replace[i].split("_"); | |||
| @@ -13,34 +13,6 @@ | |||
| */ | |||
| package cn.afterturn.easypoi.excel.imports; | |||
| import cn.afterturn.easypoi.handler.inter.IExcelDataModel; | |||
| 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.ss.formula.functions.T; | |||
| import org.apache.poi.ss.usermodel.Cell; | |||
| import org.apache.poi.ss.usermodel.CellStyle; | |||
| import org.apache.poi.ss.usermodel.Font; | |||
| import org.apache.poi.ss.usermodel.PictureData; | |||
| import org.apache.poi.ss.usermodel.Row; | |||
| import org.apache.poi.ss.usermodel.Sheet; | |||
| import org.apache.poi.ss.usermodel.Workbook; | |||
| import org.apache.poi.ss.usermodel.WorkbookFactory; | |||
| import org.apache.poi.util.IOUtils; | |||
| import org.apache.poi.xssf.usermodel.XSSFSheet; | |||
| import org.apache.poi.xssf.usermodel.XSSFWorkbook; | |||
| import org.slf4j.Logger; | |||
| import org.slf4j.LoggerFactory; | |||
| import java.io.ByteArrayInputStream; | |||
| import java.io.ByteArrayOutputStream; | |||
| import java.io.File; | |||
| import java.io.FileOutputStream; | |||
| import java.io.InputStream; | |||
| import java.lang.reflect.Field; | |||
| import java.util.*; | |||
| import cn.afterturn.easypoi.excel.annotation.ExcelTarget; | |||
| import cn.afterturn.easypoi.excel.entity.ImportParams; | |||
| import cn.afterturn.easypoi.excel.entity.params.ExcelCollectionParams; | |||
| @@ -48,13 +20,31 @@ import cn.afterturn.easypoi.excel.entity.params.ExcelImportEntity; | |||
| import cn.afterturn.easypoi.excel.entity.result.ExcelImportResult; | |||
| import cn.afterturn.easypoi.excel.entity.result.ExcelVerifyHandlerResult; | |||
| import cn.afterturn.easypoi.excel.imports.base.ImportBaseService; | |||
| import cn.afterturn.easypoi.excel.imports.recursive.ExcelImportForkJoinWork; | |||
| import cn.afterturn.easypoi.exception.excel.ExcelImportException; | |||
| import cn.afterturn.easypoi.exception.excel.enums.ExcelImportEnum; | |||
| import cn.afterturn.easypoi.handler.inter.IExcelDataModel; | |||
| import cn.afterturn.easypoi.handler.inter.IExcelModel; | |||
| import cn.afterturn.easypoi.util.PoiCellUtil; | |||
| import cn.afterturn.easypoi.util.PoiPublicUtil; | |||
| import cn.afterturn.easypoi.util.PoiReflectorUtil; | |||
| import cn.afterturn.easypoi.util.PoiValidationUtil; | |||
| 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.ss.formula.functions.T; | |||
| import org.apache.poi.ss.usermodel.*; | |||
| import org.apache.poi.util.IOUtils; | |||
| import org.apache.poi.xssf.usermodel.XSSFSheet; | |||
| import org.apache.poi.xssf.usermodel.XSSFWorkbook; | |||
| import org.slf4j.Logger; | |||
| import org.slf4j.LoggerFactory; | |||
| import java.io.*; | |||
| import java.lang.reflect.Field; | |||
| import java.util.*; | |||
| import java.util.concurrent.ForkJoinPool; | |||
| /** | |||
| * Excel 导入服务 | |||
| @@ -68,7 +58,7 @@ public class ExcelImportService extends ImportBaseService { | |||
| private CellValueService cellValueServer; | |||
| private boolean verifyFail = false; | |||
| private boolean verifyFail = false; | |||
| /** | |||
| * 异常数据styler | |||
| */ | |||
| @@ -76,7 +66,7 @@ public class ExcelImportService extends ImportBaseService { | |||
| private List<Row> successRow; | |||
| private List<Row> failRow; | |||
| private List failCollection = new ArrayList(); | |||
| private List failCollection = new ArrayList(); | |||
| public ExcelImportService() { | |||
| successRow = new ArrayList<Row>(); | |||
| @@ -95,10 +85,10 @@ public class ExcelImportService extends ImportBaseService { | |||
| * @param pictures | |||
| * @param params | |||
| */ | |||
| private void addListContinue(Object object, ExcelCollectionParams param, Row row, | |||
| Map<Integer, String> titlemap, String targetId, | |||
| Map<String, PictureData> pictures, | |||
| ImportParams params, StringBuilder errorMsg) throws Exception { | |||
| public void addListContinue(Object object, ExcelCollectionParams param, Row row, | |||
| Map<Integer, String> titlemap, String targetId, | |||
| Map<String, PictureData> pictures, | |||
| ImportParams params, StringBuilder errorMsg) throws Exception { | |||
| Collection collection = (Collection) PoiReflectorUtil.fromCache(object.getClass()) | |||
| .getValue(object, param.getName()); | |||
| Object entity = PoiPublicUtil.createObject(param.getType(), targetId); | |||
| @@ -109,7 +99,7 @@ public class ExcelImportService extends ImportBaseService { | |||
| // 是否需要加上这个对象 | |||
| boolean isUsed = false; | |||
| for (int i = row.getFirstCellNum(); i < titlemap.size(); i++) { | |||
| Cell cell = row.getCell(i); | |||
| Cell cell = row.getCell(i); | |||
| String titleString = (String) titlemap.get(i); | |||
| if (param.getExcelParams().containsKey(titleString)) { | |||
| if (param.getExcelParams().get(titleString).getType() == 2) { | |||
| @@ -120,7 +110,7 @@ public class ExcelImportService extends ImportBaseService { | |||
| saveFieldValue(params, entity, cell, param.getExcelParams(), titleString, row); | |||
| } catch (ExcelImportException e) { | |||
| // 如果需要去校验就忽略,这个错误,继续执行 | |||
| if(params.isNeedVerify() && ExcelImportEnum.GET_VALUE_ERROR.equals(e.getType())){ | |||
| if (params.isNeedVerify() && ExcelImportEnum.GET_VALUE_ERROR.equals(e.getType())) { | |||
| errorMsg.append(" ").append(titleString).append(ExcelImportEnum.GET_VALUE_ERROR.getMsg()); | |||
| } | |||
| } | |||
| @@ -163,13 +153,13 @@ public class ExcelImportService extends ImportBaseService { | |||
| private <T> List<T> importExcel(Collection<T> result, Sheet sheet, Class<?> pojoClass, | |||
| ImportParams params, | |||
| Map<String, PictureData> pictures) throws Exception { | |||
| List collection = new ArrayList(); | |||
| Map<String, ExcelImportEntity> excelParams = new HashMap<String, ExcelImportEntity>(); | |||
| List<ExcelCollectionParams> excelCollection = new ArrayList<ExcelCollectionParams>(); | |||
| String targetId = null; | |||
| List collection = new ArrayList(); | |||
| Map<String, ExcelImportEntity> excelParams = new HashMap<String, ExcelImportEntity>(); | |||
| List<ExcelCollectionParams> excelCollection = new ArrayList<ExcelCollectionParams>(); | |||
| String targetId = null; | |||
| i18nHandler = params.getI18nHandler(); | |||
| if (!Map.class.equals(pojoClass)) { | |||
| Field[] fileds = PoiPublicUtil.getClassFields(pojoClass); | |||
| Field[] fileds = PoiPublicUtil.getClassFields(pojoClass); | |||
| ExcelTarget etarget = pojoClass.getAnnotation(ExcelTarget.class); | |||
| if (etarget != null) { | |||
| targetId = etarget.value(); | |||
| @@ -182,10 +172,10 @@ public class ExcelImportService extends ImportBaseService { | |||
| } | |||
| Map<Integer, String> titlemap = getTitleMap(rows, params, excelCollection, excelParams); | |||
| checkIsValidTemplate(titlemap, excelParams, params, excelCollection); | |||
| Row row = null; | |||
| Object object = null; | |||
| Row row = null; | |||
| Object object = null; | |||
| String picId; | |||
| int readRow = 0; | |||
| int readRow = 0; | |||
| //跳过无效行 | |||
| for (int i = 0; i < params.getStartRows(); i++) { | |||
| rows.next(); | |||
| @@ -194,78 +184,90 @@ public class ExcelImportService extends ImportBaseService { | |||
| if (excelCollection.size() > 0 && params.getKeyIndex() == null) { | |||
| params.setKeyIndex(0); | |||
| } | |||
| StringBuilder errorMsg; | |||
| while (rows.hasNext() | |||
| && (row == null | |||
| || sheet.getLastRowNum() - row.getRowNum() > params.getLastOfInvalidRow())) { | |||
| if (params.getReadRows() > 0 && readRow > params.getReadRows()) { | |||
| break; | |||
| if (params.isConcurrentTask()) { | |||
| ForkJoinPool forkJoinPool = new ForkJoinPool(); | |||
| int endRow = sheet.getLastRowNum() - params.getLastOfInvalidRow(); | |||
| if (params.getReadRows() > 0) { | |||
| endRow = params.getReadRows(); | |||
| } | |||
| row = rows.next(); | |||
| // Fix 如果row为无效行时候跳出 | |||
| if (sheet.getLastRowNum() - row.getRowNum() < params.getLastOfInvalidRow()) { | |||
| break; | |||
| } | |||
| errorMsg = new StringBuilder(); | |||
| // 判断是集合元素还是不是集合元素,如果是就继续加入这个集合,不是就创建新的对象 | |||
| // keyIndex 如果为空就不处理,仍然处理这一行 | |||
| if (params.getKeyIndex() != null | |||
| && (row.getCell(params.getKeyIndex()) == null | |||
| || StringUtils.isEmpty(getKeyValue(row.getCell(params.getKeyIndex())))) | |||
| && object != null) { | |||
| for (ExcelCollectionParams param : excelCollection) { | |||
| addListContinue(object, param, row, titlemap, targetId, pictures, params, errorMsg); | |||
| ExcelImportForkJoinWork task = new ExcelImportForkJoinWork(params.getStartRows() + params.getHeadRows() + params.getTitleRows(), endRow, sheet, params, pojoClass, this, targetId, titlemap, excelParams); | |||
| ExcelImportResult forkJoinResult = forkJoinPool.invoke(task); | |||
| collection = forkJoinResult.getList(); | |||
| failCollection = forkJoinResult.getFailList(); | |||
| } else { | |||
| StringBuilder errorMsg; | |||
| while (rows.hasNext() | |||
| && (row == null | |||
| || sheet.getLastRowNum() - row.getRowNum() > params.getLastOfInvalidRow())) { | |||
| if (params.getReadRows() > 0 && readRow > params.getReadRows()) { | |||
| break; | |||
| } | |||
| } else { | |||
| object = PoiPublicUtil.createObject(pojoClass, targetId); | |||
| try { | |||
| Set<Integer> 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() + "_" + cn; | |||
| saveImage(object, picId, excelParams, titleString, pictures, | |||
| params); | |||
| } else { | |||
| try { | |||
| saveFieldValue(params, object, cell, excelParams, titleString, row); | |||
| } catch (ExcelImportException e) { | |||
| // 如果需要去校验就忽略,这个错误,继续执行 | |||
| if(params.isNeedVerify() && ExcelImportEnum.GET_VALUE_ERROR.equals(e.getType())){ | |||
| errorMsg.append(" ").append(titleString).append(ExcelImportEnum.GET_VALUE_ERROR.getMsg()); | |||
| row = rows.next(); | |||
| // Fix 如果row为无效行时候跳出 | |||
| if (sheet.getLastRowNum() - row.getRowNum() < params.getLastOfInvalidRow()) { | |||
| break; | |||
| } | |||
| errorMsg = new StringBuilder(); | |||
| // 判断是集合元素还是不是集合元素,如果是就继续加入这个集合,不是就创建新的对象 | |||
| // keyIndex 如果为空就不处理,仍然处理这一行 | |||
| if (params.getKeyIndex() != null | |||
| && (row.getCell(params.getKeyIndex()) == null | |||
| || StringUtils.isEmpty(getKeyValue(row.getCell(params.getKeyIndex())))) | |||
| && object != null) { | |||
| for (ExcelCollectionParams param : excelCollection) { | |||
| addListContinue(object, param, row, titlemap, targetId, pictures, params, errorMsg); | |||
| } | |||
| } else { | |||
| object = PoiPublicUtil.createObject(pojoClass, targetId); | |||
| try { | |||
| Set<Integer> 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() + "_" + cn; | |||
| saveImage(object, picId, excelParams, titleString, pictures, | |||
| params); | |||
| } else { | |||
| try { | |||
| saveFieldValue(params, object, cell, excelParams, titleString, row); | |||
| } catch (ExcelImportException e) { | |||
| // 如果需要去校验就忽略,这个错误,继续执行 | |||
| if (params.isNeedVerify() && ExcelImportEnum.GET_VALUE_ERROR.equals(e.getType())) { | |||
| errorMsg.append(" ").append(titleString).append(ExcelImportEnum.GET_VALUE_ERROR.getMsg()); | |||
| } | |||
| } | |||
| } | |||
| } | |||
| } | |||
| } | |||
| //for (int i = row.getFirstCellNum(), le = titlemap.size(); i < le; i++) { | |||
| //for (int i = row.getFirstCellNum(), le = titlemap.size(); i < le; i++) { | |||
| //} | |||
| if (object instanceof IExcelDataModel) { | |||
| ((IExcelDataModel) object).setRowNum(row.getRowNum()); | |||
| } | |||
| for (ExcelCollectionParams param : excelCollection) { | |||
| addListContinue(object, param, row, titlemap, targetId, pictures, params, errorMsg); | |||
| } | |||
| if (verifyingDataValidity(object, row, params, pojoClass, errorMsg)) { | |||
| collection.add(object); | |||
| } else { | |||
| failCollection.add(object); | |||
| } | |||
| } catch (ExcelImportException e) { | |||
| LOGGER.error("excel import error , row num:{},obj:{}", readRow, ReflectionToStringBuilder.toString(object)); | |||
| if (!e.getType().equals(ExcelImportEnum.VERIFY_ERROR)) { | |||
| throw new ExcelImportException(e.getType(), e); | |||
| //} | |||
| if (object instanceof IExcelDataModel) { | |||
| ((IExcelDataModel) object).setRowNum(row.getRowNum()); | |||
| } | |||
| for (ExcelCollectionParams param : excelCollection) { | |||
| addListContinue(object, param, row, titlemap, targetId, pictures, params, errorMsg); | |||
| } | |||
| if (verifyingDataValidity(object, row, params, pojoClass, errorMsg)) { | |||
| collection.add(object); | |||
| } else { | |||
| failCollection.add(object); | |||
| } | |||
| } catch (ExcelImportException e) { | |||
| LOGGER.error("excel import error , row num:{},obj:{}", readRow, ReflectionToStringBuilder.toString(object)); | |||
| if (!e.getType().equals(ExcelImportEnum.VERIFY_ERROR)) { | |||
| throw new ExcelImportException(e.getType(), e); | |||
| } | |||
| } catch (Exception e) { | |||
| LOGGER.error("excel import error , row num:{},obj:{}", readRow, ReflectionToStringBuilder.toString(object)); | |||
| throw new RuntimeException(e); | |||
| } | |||
| } catch (Exception e) { | |||
| LOGGER.error("excel import error , row num:{},obj:{}", readRow, ReflectionToStringBuilder.toString(object)); | |||
| throw new RuntimeException(e); | |||
| } | |||
| readRow++; | |||
| } | |||
| readRow++; | |||
| } | |||
| return collection; | |||
| } | |||
| @@ -273,10 +275,10 @@ public class ExcelImportService extends ImportBaseService { | |||
| /** | |||
| * 校验数据合法性 | |||
| */ | |||
| private boolean verifyingDataValidity(Object object, Row row, ImportParams params, | |||
| Class<?> pojoClass, StringBuilder fieldErrorMsg) { | |||
| public boolean verifyingDataValidity(Object object, Row row, ImportParams params, | |||
| Class<?> pojoClass, StringBuilder fieldErrorMsg) { | |||
| boolean isAdd = true; | |||
| Cell cell = null; | |||
| Cell cell = null; | |||
| if (params.isNeedVerify()) { | |||
| String errorMsg = PoiValidationUtil.validation(object, params.getVerifyGroup()); | |||
| if (StringUtils.isNotEmpty(errorMsg)) { | |||
| @@ -307,7 +309,7 @@ public class ExcelImportService extends ImportBaseService { | |||
| verifyFail = true; | |||
| } | |||
| } | |||
| if((params.isNeedVerify() || params.getVerifyHandler() != null) && fieldErrorMsg.length() > 0){ | |||
| if ((params.isNeedVerify() || params.getVerifyHandler() != null) && fieldErrorMsg.length() > 0) { | |||
| if (object instanceof IExcelModel) { | |||
| IExcelModel model = (IExcelModel) object; | |||
| model.setErrorMsg((StringUtils.isNoneBlank(model.getErrorMsg()) | |||
| @@ -317,7 +319,7 @@ public class ExcelImportService extends ImportBaseService { | |||
| cell = row.createCell(row.getLastCellNum()); | |||
| } | |||
| cell.setCellValue((StringUtils.isNoneBlank(cell.getStringCellValue()) | |||
| ? cell.getStringCellValue() + "," : "")+ fieldErrorMsg.toString()); | |||
| ? cell.getStringCellValue() + "," : "") + fieldErrorMsg.toString()); | |||
| isAdd = false; | |||
| verifyFail = true; | |||
| } | |||
| @@ -336,11 +338,11 @@ public class ExcelImportService extends ImportBaseService { | |||
| private Map<Integer, String> getTitleMap(Iterator<Row> rows, ImportParams params, | |||
| List<ExcelCollectionParams> excelCollection, | |||
| Map<String, ExcelImportEntity> excelParams) { | |||
| Map<Integer, String> titlemap = new LinkedHashMap<Integer, String>(); | |||
| Iterator<Cell> cellTitle; | |||
| String collectionName = null; | |||
| Map<Integer, String> titlemap = new LinkedHashMap<Integer, String>(); | |||
| Iterator<Cell> cellTitle; | |||
| String collectionName = null; | |||
| ExcelCollectionParams collectionParams = null; | |||
| Row row = null; | |||
| Row row = null; | |||
| for (int j = 0; j < params.getHeadRows(); j++) { | |||
| row = rows.next(); | |||
| if (row == null) { | |||
| @@ -348,7 +350,7 @@ public class ExcelImportService extends ImportBaseService { | |||
| } | |||
| cellTitle = row.cellIterator(); | |||
| while (cellTitle.hasNext()) { | |||
| Cell cell = cellTitle.next(); | |||
| Cell cell = cellTitle.next(); | |||
| String value = getKeyValue(cell); | |||
| value = value.replace("\n", ""); | |||
| int i = cell.getColumnIndex(); | |||
| @@ -405,12 +407,12 @@ public class ExcelImportService extends ImportBaseService { | |||
| if (LOGGER.isDebugEnabled()) { | |||
| LOGGER.debug("Excel import start ,class is {}", pojoClass); | |||
| } | |||
| List<T> result = new ArrayList<T>(); | |||
| ByteArrayOutputStream baos = new ByteArrayOutputStream(); | |||
| ExcelImportResult importResult; | |||
| List<T> result = new ArrayList<T>(); | |||
| ByteArrayOutputStream baos = new ByteArrayOutputStream(); | |||
| ExcelImportResult importResult; | |||
| try { | |||
| byte[] buffer = new byte[1024]; | |||
| int len; | |||
| int len; | |||
| while ((len = inputstream.read(buffer)) > -1) { | |||
| baos.write(buffer, 0, len); | |||
| } | |||
| @@ -432,7 +434,7 @@ public class ExcelImportService extends ImportBaseService { | |||
| for (int i = params.getStartSheetIndex(); i < params.getStartSheetIndex() | |||
| + params.getSheetNum(); i++) { | |||
| if (LOGGER.isDebugEnabled()) { | |||
| LOGGER.debug(" start to read excel by is ,startTime is {}", System.currentTimeMillis()); | |||
| LOGGER.debug(" start to read excel by is ,startTime is {}", new Date()); | |||
| } | |||
| if (isXSSFWorkbook) { | |||
| pictures = PoiPublicUtil.getSheetPictrues07((XSSFSheet) book.getSheetAt(i), | |||
| @@ -442,11 +444,11 @@ public class ExcelImportService extends ImportBaseService { | |||
| (HSSFWorkbook) book); | |||
| } | |||
| if (LOGGER.isDebugEnabled()) { | |||
| LOGGER.debug(" end to read excel by is ,endTime is {}", System.currentTimeMillis()); | |||
| LOGGER.debug(" end to read excel by is ,endTime is {}", new Date()); | |||
| } | |||
| result.addAll(importExcel(result, book.getSheetAt(i), pojoClass, params, pictures)); | |||
| if (LOGGER.isDebugEnabled()) { | |||
| LOGGER.debug(" end to read excel list by sheet ,endTime is {}", System.currentTimeMillis()); | |||
| LOGGER.debug(" end to read excel list by sheet ,endTime is {}", new Date()); | |||
| } | |||
| if (params.isReadSingleCell()) { | |||
| readSingleCell(importResult, book.getSheetAt(i), params); | |||
| @@ -585,9 +587,9 @@ public class ExcelImportService extends ImportBaseService { | |||
| /** | |||
| * 保存字段值(获取值,校验值,追加错误信息) | |||
| */ | |||
| private void saveFieldValue(ImportParams params, Object object, Cell cell, | |||
| Map<String, ExcelImportEntity> excelParams, String titleString, | |||
| Row row) throws Exception { | |||
| public void saveFieldValue(ImportParams params, Object object, Cell cell, | |||
| Map<String, ExcelImportEntity> excelParams, String titleString, | |||
| Row row) throws Exception { | |||
| Object value = cellValueServer.getValue(params.getDataHandler(), object, cell, excelParams, | |||
| titleString, params.getDictHandler()); | |||
| if (object instanceof Map) { | |||
| @@ -620,12 +622,12 @@ public class ExcelImportService extends ImportBaseService { | |||
| if (image == null) { | |||
| return; | |||
| } | |||
| byte[] data = image.getData(); | |||
| byte[] data = image.getData(); | |||
| String fileName = "pic" + Math.round(Math.random() * 100000000000L); | |||
| fileName += "." + PoiPublicUtil.getFileExtendName(data); | |||
| if (excelParams.get(titleString).getSaveType() == 1) { | |||
| String path = getSaveUrl(excelParams.get(titleString), object); | |||
| File savefile = new File(path); | |||
| String path = getSaveUrl(excelParams.get(titleString), object); | |||
| File savefile = new File(path); | |||
| if (!savefile.exists()) { | |||
| savefile.mkdirs(); | |||
| } | |||
| @@ -0,0 +1,132 @@ | |||
| package cn.afterturn.easypoi.excel.imports.recursive; | |||
| import cn.afterturn.easypoi.excel.entity.ImportParams; | |||
| import cn.afterturn.easypoi.excel.entity.params.ExcelImportEntity; | |||
| import cn.afterturn.easypoi.excel.entity.result.ExcelImportResult; | |||
| import cn.afterturn.easypoi.excel.imports.ExcelImportService; | |||
| import cn.afterturn.easypoi.exception.excel.ExcelImportException; | |||
| import cn.afterturn.easypoi.exception.excel.enums.ExcelImportEnum; | |||
| import cn.afterturn.easypoi.handler.inter.IExcelDataModel; | |||
| import cn.afterturn.easypoi.util.PoiPublicUtil; | |||
| import org.apache.commons.lang3.builder.ReflectionToStringBuilder; | |||
| import org.apache.poi.ss.usermodel.Cell; | |||
| import org.apache.poi.ss.usermodel.Row; | |||
| import org.apache.poi.ss.usermodel.Sheet; | |||
| import org.slf4j.Logger; | |||
| import org.slf4j.LoggerFactory; | |||
| import java.util.ArrayList; | |||
| import java.util.Map; | |||
| import java.util.Set; | |||
| import java.util.concurrent.RecursiveTask; | |||
| /** | |||
| * 并行导入计算 | |||
| * 支持校验 | |||
| * 不支持图片 | |||
| * 不支持集合 | |||
| * | |||
| * @author by jueyue on 19-6-9. | |||
| */ | |||
| public class ExcelImportForkJoinWork extends RecursiveTask<ExcelImportResult> { | |||
| private final static Logger LOGGER = LoggerFactory.getLogger(ExcelImportForkJoinWork.class); | |||
| private int startRow; | |||
| private int endRow; | |||
| private Sheet sheet; | |||
| private ImportParams params; | |||
| private Class<?> pojoClass; | |||
| private ExcelImportService importService; | |||
| private String targetId; | |||
| private Map<Integer, String> titlemap; | |||
| private Map<String, ExcelImportEntity> excelParams; | |||
| public ExcelImportForkJoinWork(int startRow, int endRow, Sheet sheet, ImportParams params, | |||
| Class<?> pojoClass, ExcelImportService importService, String targetId, | |||
| Map<Integer, String> titlemap, Map<String, ExcelImportEntity> excelParams) { | |||
| this.startRow = startRow; | |||
| this.endRow = endRow; | |||
| this.sheet = sheet; | |||
| this.params = params; | |||
| this.pojoClass = pojoClass; | |||
| this.importService = importService; | |||
| this.targetId = targetId; | |||
| this.titlemap = titlemap; | |||
| this.excelParams = excelParams; | |||
| } | |||
| @Override | |||
| protected ExcelImportResult compute() { | |||
| long length = endRow - startRow; | |||
| ExcelImportResult result = null; | |||
| if (length <= params.getCritical()) { | |||
| LOGGER.debug("excel import concurrent task start {} , end {}", startRow, endRow); | |||
| return readRow(); | |||
| } else { | |||
| int middle = (startRow + endRow) / 2; | |||
| ExcelImportForkJoinWork right = new ExcelImportForkJoinWork(startRow, middle, sheet, params, pojoClass, importService, targetId, titlemap, excelParams); | |||
| right.fork(); | |||
| ExcelImportForkJoinWork left = new ExcelImportForkJoinWork(middle + 1, endRow, sheet, params, pojoClass, importService, targetId, titlemap, excelParams); | |||
| left.fork(); | |||
| //合并 | |||
| result = right.join(); | |||
| ExcelImportResult leftResult = left.join(); | |||
| result.getList().addAll(leftResult.getList()); | |||
| result.getFailList().addAll(leftResult.getFailList()); | |||
| } | |||
| return result; | |||
| } | |||
| private ExcelImportResult readRow() { | |||
| StringBuilder errorMsg; | |||
| Row row; | |||
| Object object; | |||
| ExcelImportResult result = new ExcelImportResult(); | |||
| result.setFailList(new ArrayList()); | |||
| result.setList(new ArrayList()); | |||
| for (int i = startRow; i <= endRow; i++) { | |||
| row = sheet.getRow(i); | |||
| errorMsg = new StringBuilder(); | |||
| if (params.getKeyIndex() != null && (row.getCell(params.getKeyIndex()) == null)) { | |||
| continue; | |||
| } | |||
| object = PoiPublicUtil.createObject(pojoClass, targetId); | |||
| try { | |||
| Set<Integer> 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)) { | |||
| try { | |||
| importService.saveFieldValue(params, object, cell, excelParams, titleString, row); | |||
| } catch (ExcelImportException e) { | |||
| // 如果需要去校验就忽略,这个错误,继续执行 | |||
| if (params.isNeedVerify() && ExcelImportEnum.GET_VALUE_ERROR.equals(e.getType())) { | |||
| errorMsg.append(" ").append(titleString).append(ExcelImportEnum.GET_VALUE_ERROR.getMsg()); | |||
| } | |||
| } | |||
| } | |||
| } | |||
| if (object instanceof IExcelDataModel) { | |||
| ((IExcelDataModel) object).setRowNum(row.getRowNum()); | |||
| } | |||
| if (importService.verifyingDataValidity(object, row, params, pojoClass, errorMsg)) { | |||
| result.getList().add(object); | |||
| } else { | |||
| result.getFailList().add(object); | |||
| } | |||
| } catch (ExcelImportException e) { | |||
| LOGGER.error("excel import error , row num:{},obj:{}", i, ReflectionToStringBuilder.toString(object)); | |||
| if (!e.getType().equals(ExcelImportEnum.VERIFY_ERROR)) { | |||
| throw new ExcelImportException(e.getType(), e); | |||
| } | |||
| } catch (Exception e) { | |||
| LOGGER.error("excel import error , row num:{},obj:{}", i, ReflectionToStringBuilder.toString(object)); | |||
| throw new RuntimeException(e); | |||
| } | |||
| } | |||
| return result; | |||
| } | |||
| } | |||
| @@ -1,13 +1,13 @@ | |||
| /** | |||
| * Copyright 2013-2015 JueYue (qrb.jueyue@gmail.com) | |||
| * | |||
| * Licensed under the Apache License, Version 2.0 (the "License"); | |||
| * you may not use this file except in compliance with the License. | |||
| * You may obtain a copy of the License at | |||
| * | |||
| * http://www.apache.org/licenses/LICENSE-2.0 | |||
| * | |||
| * Unless required by applicable law or agreed to in writing, software | |||
| * <p> | |||
| * Licensed under the Apache License, Version 2.0 (the "License"); | |||
| * you may not use this file except in compliance with the License. | |||
| * You may obtain a copy of the License at | |||
| * <p> | |||
| * http://www.apache.org/licenses/LICENSE-2.0 | |||
| * <p> | |||
| * Unless required by applicable law or agreed to in writing, software | |||
| * distributed under the License is distributed on an "AS IS" BASIS, | |||
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | |||
| * See the License for the specific language governing permissions and | |||
| @@ -15,51 +15,32 @@ | |||
| */ | |||
| package cn.afterturn.easypoi.util; | |||
| import static cn.afterturn.easypoi.util.PoiElUtil.*; | |||
| import java.awt.image.BufferedImage; | |||
| import java.io.*; | |||
| import java.lang.reflect.Field; | |||
| import java.math.BigDecimal; | |||
| import java.net.URISyntaxException; | |||
| import java.util.ArrayList; | |||
| import java.util.Collection; | |||
| import java.util.HashMap; | |||
| import java.util.LinkedHashMap; | |||
| import java.util.List; | |||
| import java.util.Map; | |||
| import javax.imageio.ImageIO; | |||
| import cn.afterturn.easypoi.cache.ImageCache; | |||
| import cn.afterturn.easypoi.entity.ImageEntity; | |||
| import cn.afterturn.easypoi.excel.annotation.Excel; | |||
| import cn.afterturn.easypoi.excel.annotation.ExcelCollection; | |||
| import cn.afterturn.easypoi.excel.annotation.ExcelEntity; | |||
| import cn.afterturn.easypoi.excel.annotation.ExcelIgnore; | |||
| import cn.afterturn.easypoi.word.entity.params.ExcelListEntity; | |||
| import org.apache.commons.lang3.StringUtils; | |||
| import org.apache.poi.hssf.usermodel.HSSFClientAnchor; | |||
| import org.apache.poi.hssf.usermodel.HSSFPicture; | |||
| import org.apache.poi.hssf.usermodel.HSSFPictureData; | |||
| import org.apache.poi.hssf.usermodel.HSSFShape; | |||
| import org.apache.poi.hssf.usermodel.HSSFSheet; | |||
| import org.apache.poi.hssf.usermodel.HSSFWorkbook; | |||
| import org.apache.poi.hssf.usermodel.*; | |||
| import org.apache.poi.ooxml.POIXMLDocumentPart; | |||
| import org.apache.poi.ss.usermodel.PictureData; | |||
| import org.apache.poi.util.IOUtils; | |||
| import org.apache.poi.xssf.usermodel.XSSFClientAnchor; | |||
| import org.apache.poi.xssf.usermodel.XSSFDrawing; | |||
| import org.apache.poi.xssf.usermodel.XSSFPicture; | |||
| import org.apache.poi.xssf.usermodel.XSSFShape; | |||
| import org.apache.poi.xssf.usermodel.XSSFSheet; | |||
| import org.apache.poi.xssf.usermodel.XSSFWorkbook; | |||
| import org.apache.poi.xssf.usermodel.*; | |||
| import org.apache.poi.xwpf.usermodel.XWPFDocument; | |||
| import org.apache.poi.xwpf.usermodel.XWPFRun; | |||
| import org.openxmlformats.schemas.drawingml.x2006.spreadsheetDrawing.CTMarker; | |||
| import org.slf4j.Logger; | |||
| import org.slf4j.LoggerFactory; | |||
| import cn.afterturn.easypoi.cache.ImageCache; | |||
| import cn.afterturn.easypoi.excel.annotation.Excel; | |||
| import cn.afterturn.easypoi.excel.annotation.ExcelCollection; | |||
| import cn.afterturn.easypoi.excel.annotation.ExcelEntity; | |||
| import cn.afterturn.easypoi.excel.annotation.ExcelIgnore; | |||
| import cn.afterturn.easypoi.entity.ImageEntity; | |||
| import cn.afterturn.easypoi.word.entity.params.ExcelListEntity; | |||
| import java.io.IOException; | |||
| import java.io.InputStream; | |||
| import java.lang.reflect.Field; | |||
| import java.math.BigDecimal; | |||
| import java.util.*; | |||
| import static cn.afterturn.easypoi.util.PoiElUtil.END_STR; | |||
| import static cn.afterturn.easypoi.util.PoiElUtil.START_STR; | |||
| /** | |||
| * EASYPOI 的公共基础类 | |||
| @@ -74,7 +55,7 @@ public final class PoiPublicUtil { | |||
| } | |||
| @SuppressWarnings({ "unchecked" }) | |||
| @SuppressWarnings({"unchecked"}) | |||
| public static <K, V> Map<K, V> mapFor(Object... mapping) { | |||
| Map<K, V> map = new HashMap<K, V>(); | |||
| for (int i = 0; i < mapping.length; i += 2) { | |||
| @@ -93,7 +74,7 @@ public final class PoiPublicUtil { | |||
| Object obj = null; | |||
| try { | |||
| if (clazz.equals(Map.class)) { | |||
| return new LinkedHashMap<String,Object>(); | |||
| return new LinkedHashMap<String, Object>(); | |||
| } | |||
| obj = clazz.newInstance(); | |||
| Field[] fields = getClassFields(clazz); | |||
| @@ -104,10 +85,10 @@ public final class PoiPublicUtil { | |||
| if (isCollection(field.getType())) { | |||
| ExcelCollection collection = field.getAnnotation(ExcelCollection.class); | |||
| PoiReflectorUtil.fromCache(clazz).setValue(obj, field.getName(), | |||
| collection.type().newInstance()); | |||
| collection.type().newInstance()); | |||
| } else if (!isJavaClass(field) && !field.getType().isEnum()) { | |||
| PoiReflectorUtil.fromCache(clazz).setValue(obj, field.getName(), | |||
| createObject(field.getType(), targetId)); | |||
| createObject(field.getType(), targetId)); | |||
| } | |||
| } | |||
| @@ -127,7 +108,7 @@ public final class PoiPublicUtil { | |||
| */ | |||
| public static Field[] getClassFields(Class<?> clazz) { | |||
| List<Field> list = new ArrayList<Field>(); | |||
| Field[] fields; | |||
| Field[] fields; | |||
| do { | |||
| fields = clazz.getDeclaredFields(); | |||
| for (int i = 0; i < fields.length; i++) { | |||
| @@ -145,11 +126,11 @@ public final class PoiPublicUtil { | |||
| public static String getFileExtendName(byte[] photoByte) { | |||
| String strFileExtendName = "JPG"; | |||
| if ((photoByte[0] == 71) && (photoByte[1] == 73) && (photoByte[2] == 70) | |||
| && (photoByte[3] == 56) && ((photoByte[4] == 55) || (photoByte[4] == 57)) | |||
| && (photoByte[5] == 97)) { | |||
| && (photoByte[3] == 56) && ((photoByte[4] == 55) || (photoByte[4] == 57)) | |||
| && (photoByte[5] == 97)) { | |||
| strFileExtendName = "GIF"; | |||
| } else if ((photoByte[6] == 74) && (photoByte[7] == 70) && (photoByte[8] == 73) | |||
| && (photoByte[9] == 70)) { | |||
| && (photoByte[9] == 70)) { | |||
| strFileExtendName = "JPG"; | |||
| } else if ((photoByte[0] == 66) && (photoByte[1] == 77)) { | |||
| strFileExtendName = "BMP"; | |||
| @@ -169,11 +150,12 @@ public final class PoiPublicUtil { | |||
| public static boolean hasBom(InputStream in) throws IOException { | |||
| byte[] head = new byte[3]; | |||
| in.read(head); | |||
| if(head[0]==-17 && head[1]==-69 && head[2] ==-65) { | |||
| if (head[0] == -17 && head[1] == -69 && head[2] == -65) { | |||
| return true; | |||
| } | |||
| return false; | |||
| } | |||
| /** | |||
| * 获取Excel2003图片 | |||
| * | |||
| @@ -186,16 +168,16 @@ public final class PoiPublicUtil { | |||
| public static Map<String, PictureData> getSheetPictrues03(HSSFSheet sheet, | |||
| HSSFWorkbook workbook) { | |||
| Map<String, PictureData> sheetIndexPicMap = new HashMap<String, PictureData>(); | |||
| List<HSSFPictureData> pictures = workbook.getAllPictures(); | |||
| List<HSSFPictureData> pictures = workbook.getAllPictures(); | |||
| if (!pictures.isEmpty()) { | |||
| for (HSSFShape shape : sheet.getDrawingPatriarch().getChildren()) { | |||
| HSSFClientAnchor anchor = (HSSFClientAnchor) shape.getAnchor(); | |||
| if (shape instanceof HSSFPicture) { | |||
| HSSFPicture pic = (HSSFPicture) shape; | |||
| int pictureIndex = pic.getPictureIndex() - 1; | |||
| HSSFPictureData picData = pictures.get(pictureIndex); | |||
| HSSFPicture pic = (HSSFPicture) shape; | |||
| int pictureIndex = pic.getPictureIndex() - 1; | |||
| HSSFPictureData picData = pictures.get(pictureIndex); | |||
| String picIndex = String.valueOf(anchor.getRow1()) + "_" | |||
| + String.valueOf(anchor.getCol1()); | |||
| + String.valueOf(anchor.getCol1()); | |||
| sheetIndexPicMap.put(picIndex, picData); | |||
| } | |||
| } | |||
| @@ -219,14 +201,14 @@ public final class PoiPublicUtil { | |||
| Map<String, PictureData> sheetIndexPicMap = new HashMap<String, PictureData>(); | |||
| for (POIXMLDocumentPart dr : sheet.getRelations()) { | |||
| if (dr instanceof XSSFDrawing) { | |||
| XSSFDrawing drawing = (XSSFDrawing) dr; | |||
| List<XSSFShape> shapes = drawing.getShapes(); | |||
| XSSFDrawing drawing = (XSSFDrawing) dr; | |||
| List<XSSFShape> shapes = drawing.getShapes(); | |||
| for (XSSFShape shape : shapes) { | |||
| if (shape instanceof XSSFPicture) { | |||
| XSSFPicture pic = (XSSFPicture) shape; | |||
| XSSFClientAnchor anchor = pic.getPreferredSize(); | |||
| CTMarker ctMarker = anchor.getFrom(); | |||
| String picIndex = ctMarker.getRow() + "_" + ctMarker.getCol(); | |||
| XSSFPicture pic = (XSSFPicture) shape; | |||
| XSSFClientAnchor anchor = pic.getPreferredSize(); | |||
| CTMarker ctMarker = anchor.getFrom(); | |||
| String picIndex = ctMarker.getRow() + "_" + ctMarker.getCol(); | |||
| sheetIndexPicMap.put(picIndex, pic.getPictureData()); | |||
| } | |||
| } | |||
| @@ -252,15 +234,15 @@ public final class PoiPublicUtil { | |||
| * @return | |||
| */ | |||
| public static boolean isJavaClass(Field field) { | |||
| Class<?> fieldType = field.getType(); | |||
| boolean isBaseClass = false; | |||
| Class<?> fieldType = field.getType(); | |||
| boolean isBaseClass = false; | |||
| if (fieldType.isArray()) { | |||
| isBaseClass = false; | |||
| } else if (fieldType.isPrimitive() || fieldType.getPackage() == null | |||
| || "java.lang".equals(fieldType.getPackage().getName()) | |||
| || "java.math".equals(fieldType.getPackage().getName()) | |||
| || "java.sql".equals(fieldType.getPackage().getName()) | |||
| || "java.util".equals(fieldType.getPackage().getName())) { | |||
| || "java.lang".equals(fieldType.getPackage().getName()) | |||
| || "java.math".equals(fieldType.getPackage().getName()) | |||
| || "java.sql".equals(fieldType.getPackage().getName()) | |||
| || "java.util".equals(fieldType.getPackage().getName())) { | |||
| isBaseClass = true; | |||
| } | |||
| return isBaseClass; | |||
| @@ -280,19 +262,19 @@ public final class PoiPublicUtil { | |||
| if (field.getAnnotation(ExcelIgnore.class) != null) { | |||
| boo = true; | |||
| } else if (boo && field.getAnnotation(ExcelCollection.class) != null | |||
| && isUseInThis(field.getAnnotation(ExcelCollection.class).name(), targetId) | |||
| && (exclusionsList == null || !exclusionsList | |||
| .contains(field.getAnnotation(ExcelCollection.class).name()))) { | |||
| && isUseInThis(field.getAnnotation(ExcelCollection.class).name(), targetId) | |||
| && (exclusionsList == null || !exclusionsList | |||
| .contains(field.getAnnotation(ExcelCollection.class).name()))) { | |||
| boo = false; | |||
| } else if (boo && field.getAnnotation(Excel.class) != null | |||
| && isUseInThis(field.getAnnotation(Excel.class).name(), targetId) | |||
| && (exclusionsList == null | |||
| || !exclusionsList.contains(field.getAnnotation(Excel.class).name()))) { | |||
| && isUseInThis(field.getAnnotation(Excel.class).name(), targetId) | |||
| && (exclusionsList == null | |||
| || !exclusionsList.contains(field.getAnnotation(Excel.class).name()))) { | |||
| boo = false; | |||
| } else if (boo && field.getAnnotation(ExcelEntity.class) != null | |||
| && isUseInThis(field.getAnnotation(ExcelEntity.class).name(), targetId) | |||
| && (exclusionsList == null || !exclusionsList | |||
| .contains(field.getAnnotation(ExcelEntity.class).name()))) { | |||
| && isUseInThis(field.getAnnotation(ExcelEntity.class).name(), targetId) | |||
| && (exclusionsList == null || !exclusionsList | |||
| .contains(field.getAnnotation(ExcelEntity.class).name()))) { | |||
| boo = false; | |||
| } | |||
| return boo; | |||
| @@ -307,7 +289,7 @@ public final class PoiPublicUtil { | |||
| */ | |||
| private static boolean isUseInThis(String exportName, String targetId) { | |||
| return targetId == null || "".equals(exportName) || exportName.indexOf("_") < 0 | |||
| || exportName.indexOf(targetId) != -1; | |||
| || exportName.indexOf(targetId) != -1; | |||
| } | |||
| private static Integer getImageType(String type) { | |||
| @@ -331,12 +313,12 @@ public final class PoiPublicUtil { | |||
| *@author JueYue | |||
| * 2013-11-20 | |||
| *@param entity | |||
| *@return (byte[]) isAndType[0],(Integer)isAndType[1] | |||
| *@return (byte[]) isAndType[0],(Integer)isAndType[1] | |||
| * @throws Exception | |||
| */ | |||
| public static Object[] getIsAndType(ImageEntity entity) throws Exception { | |||
| Object[] result = new Object[2]; | |||
| String type; | |||
| String type; | |||
| if (entity.getType().equals(ImageEntity.URL)) { | |||
| result[0] = ImageCache.getImage(entity.getUrl()); | |||
| type = entity.getUrl().split("/.")[entity.getUrl().split("/.").length - 1]; | |||
| @@ -379,11 +361,11 @@ public final class PoiPublicUtil { | |||
| String params = ""; | |||
| while (currentText.indexOf(START_STR) != -1) { | |||
| params = currentText.substring(currentText.indexOf(START_STR) + 2, | |||
| currentText.indexOf(END_STR)); | |||
| currentText.indexOf(END_STR)); | |||
| Object obj = PoiElUtil.eval(params.trim(), map); | |||
| //判断图片或者是集合 | |||
| if (obj instanceof ImageEntity || obj instanceof List | |||
| || obj instanceof ExcelListEntity) { | |||
| || obj instanceof ExcelListEntity) { | |||
| return obj; | |||
| } else { | |||
| currentText = currentText.replace(START_STR + params + END_STR, obj.toString()); | |||
| @@ -414,10 +396,10 @@ public final class PoiPublicUtil { | |||
| object = ((Map) object).get(paramsArr[index]); | |||
| } else { | |||
| object = PoiReflectorUtil.fromCache(object.getClass()).getValue(object, | |||
| paramsArr[index]); | |||
| paramsArr[index]); | |||
| } | |||
| return (index == paramsArr.length - 1) ? (object == null ? "" : object) | |||
| : getValueDoWhile(object, paramsArr, ++index); | |||
| : getValueDoWhile(object, paramsArr, ++index); | |||
| } | |||
| /** | |||
| @@ -474,4 +456,13 @@ public final class PoiPublicUtil { | |||
| } | |||
| } | |||
| public static int getNumDigits(int num) { | |||
| int count = 0; | |||
| while (num > 0) { | |||
| num = num / 10; | |||
| count++; | |||
| } | |||
| return count; | |||
| } | |||
| } | |||