@@ -28,6 +28,9 @@ public class ExcelToHtmlParams { | |||||
*/ | */ | ||||
private String path = null; | private String path = null; | ||||
private boolean showRowNum = false; | |||||
private boolean showColumnHead = false; | |||||
public ExcelToHtmlParams(Workbook wb) { | public ExcelToHtmlParams(Workbook wb) { | ||||
this.wb = wb; | this.wb = wb; | ||||
} | } | ||||
@@ -98,6 +101,22 @@ public class ExcelToHtmlParams { | |||||
this.path = path; | 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 | @Override | ||||
public boolean equals(Object obj) { | public boolean equals(Object obj) { | ||||
if (obj instanceof ExcelToHtmlParams) { | if (obj instanceof ExcelToHtmlParams) { | ||||
@@ -102,6 +102,14 @@ public class ImportParams extends ExcelBaseParams { | |||||
* 仅仅支持titleRows + headRows + startRows 以及 lastOfInvalidRow | * 仅仅支持titleRows + headRows + startRows 以及 lastOfInvalidRow | ||||
*/ | */ | ||||
private boolean readSingleCell = false; | private boolean readSingleCell = false; | ||||
/** | |||||
* 是否并行计算 | |||||
*/ | |||||
private boolean concurrentTask = false; | |||||
/** | |||||
* 最小截取大小 | |||||
*/ | |||||
private Integer critical = 1000; | |||||
public int getHeadRows() { | public int getHeadRows() { | ||||
return headRows; | return headRows; | ||||
@@ -238,4 +246,20 @@ public class ImportParams extends ExcelBaseParams { | |||||
public void setNeedCheckOrder(boolean needCheckOrder) { | public void setNeedCheckOrder(boolean needCheckOrder) { | ||||
this.needCheckOrder = 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) { | private void setMergedRegionStyle(Row row, int ci, ExcelForEachParams params) { | ||||
//第一行数据 | //第一行数据 | ||||
for (int i = 1; i < params.getColspan(); i++) { | 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 i = 1; i < params.getRowspan(); i++) { | ||||
for (int j = 0; j < params.getColspan(); j++) { | 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 { | try { | ||||
this.teplateParams = params; | this.teplateParams = params; | ||||
wb = getCloneWorkBook(); | wb = getCloneWorkBook(); | ||||
// 创建表格样式 | |||||
setExcelExportStyler((IExcelExportStyler) teplateParams.getStyle() | |||||
.getConstructor(Workbook.class).newInstance(wb)); | |||||
// step 3. 解析模板 | // step 3. 解析模板 | ||||
for (int i = 0, le = params.isScanAllsheet() ? wb.getNumberOfSheets() | for (int i = 0, le = params.isScanAllsheet() ? wb.getNumberOfSheets() | ||||
: params.getSheetNum().length; i < le; i++) { | : params.getSheetNum().length; i < le; i++) { | ||||
@@ -34,19 +34,21 @@ public class ExcelToHtmlService { | |||||
private String today; | private String today; | ||||
private Workbook wb; | 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"; | private static final String DEFAULTS_CLASS = "excelDefaults"; | ||||
@@ -57,9 +59,11 @@ public class ExcelToHtmlService { | |||||
this.wb = params.getWb(); | this.wb = params.getWb(); | ||||
this.completeHTML = params.isCompleteHTML(); | this.completeHTML = params.isCompleteHTML(); | ||||
this.sheetNum = params.getSheetNum(); | this.sheetNum = params.getSheetNum(); | ||||
cssRandom = (int) Math.ceil(Math.random() * 1000); | |||||
this.cssRandom = (int) Math.ceil(Math.random() * 1000); | |||||
this.imageCachePath = params.getPath(); | 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() { | public String printPage() { | ||||
@@ -125,17 +129,19 @@ public class ExcelToHtmlService { | |||||
} | } | ||||
private void printSheet(Sheet sheet) { | 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); | printCols(sheet); | ||||
printSheetContent(sheet); | printSheetContent(sheet); | ||||
out.format("</table>%n"); | out.format("</table>%n"); | ||||
} | } | ||||
private void printCols(Sheet sheet) { | 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); | ensureColumnBounds(sheet); | ||||
for (int i = firstColumn; i < endColumn; i++) { | 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); | ensureColumnBounds(sheet); | ||||
int width = 0; | int width = 0; | ||||
for (int i = firstColumn; i < endColumn; i++) { | for (int i = firstColumn; i < endColumn; i++) { | ||||
width = width + (sheet.getColumnWidth(i) / 32); | |||||
width = width + (sheet.getColumnWidth(i) / 16); | |||||
} | } | ||||
return width; | return width; | ||||
} | } | ||||
@@ -153,11 +159,11 @@ public class ExcelToHtmlService { | |||||
return; | 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; | 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(); | short firstCell = row.getFirstCellNum(); | ||||
if (firstCell >= 0) { | if (firstCell >= 0) { | ||||
firstColumn = Math.min(firstColumn, firstCell); | firstColumn = Math.min(firstColumn, firstCell); | ||||
@@ -188,20 +194,24 @@ public class ExcelToHtmlService { | |||||
} | } | ||||
private void printSheetContent(Sheet sheet) { | private void printSheetContent(Sheet sheet) { | ||||
//printColumnHeads(sheet); | |||||
if (showColumnHead) { | |||||
printColumnHeads(sheet); | |||||
} | |||||
MergedRegionHelper mergedRegionHelper = new MergedRegionHelper(sheet); | MergedRegionHelper mergedRegionHelper = new MergedRegionHelper(sheet); | ||||
CellValueHelper cellValueHelper = new CellValueHelper(wb, cssRandom); | |||||
CellValueHelper cellValueHelper = new CellValueHelper(wb, cssRandom); | |||||
out.format("<tbody>%n"); | out.format("<tbody>%n"); | ||||
Iterator<Row> rows = sheet.rowIterator(); | |||||
int rowIndex = 1; | |||||
Iterator<Row> rows = sheet.rowIterator(); | |||||
int rowIndex = 1; | |||||
while (rows.hasNext()) { | while (rows.hasNext()) { | ||||
Row row = rows.next(); | Row row = rows.next(); | ||||
out.format(" <tr style='height:%spx;'>%n", row.getHeight() / 15); | 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++) { | for (int i = firstColumn; i < endColumn; i++) { | ||||
if (mergedRegionHelper.isNeedCreate(rowIndex, i)) { | if (mergedRegionHelper.isNeedCreate(rowIndex, i)) { | ||||
String content = " "; | |||||
CellStyle style = null; | |||||
String content = " "; | |||||
CellStyle style = null; | |||||
if (i >= row.getFirstCellNum() && i < row.getLastCellNum()) { | if (i >= row.getFirstCellNum() && i < row.getLastCellNum()) { | ||||
Cell cell = row.getCell(i); | Cell cell = row.getCell(i); | ||||
if (cell != null) { | if (cell != null) { | ||||
@@ -15,6 +15,22 @@ | |||||
*/ | */ | ||||
package cn.afterturn.easypoi.excel.imports; | 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.Method; | ||||
import java.lang.reflect.Type; | import java.lang.reflect.Type; | ||||
import java.math.BigDecimal; | import java.math.BigDecimal; | ||||
@@ -27,29 +43,12 @@ import java.util.Date; | |||||
import java.util.List; | import java.util.List; | ||||
import java.util.Map; | 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 取值服务 | * Cell 取值服务 | ||||
* 判断类型处理数据 1.判断Excel中的类型 2.根据replace替换值 3.handler处理数据 4.判断返回类型转化数据返回 | * 判断类型处理数据 1.判断Excel中的类型 2.根据replace替换值 3.handler处理数据 4.判断返回类型转化数据返回 | ||||
* | * | ||||
* @author JueYue | * @author JueYue | ||||
* 2014年6月26日 下午10:42:28 | |||||
* 2014年6月26日 下午10:42:28 | |||||
*/ | */ | ||||
public class CellValueService { | public class CellValueService { | ||||
@@ -93,14 +92,15 @@ public class CellValueService { | |||||
} | } | ||||
result = getDateData(entity, val); | result = getDateData(entity, val); | ||||
if (result == null) { | |||||
return null; | |||||
} | |||||
} | } | ||||
if (("class java.sql.Date").equals(classFullName)) { | if (("class java.sql.Date").equals(classFullName)) { | ||||
result = new java.sql.Date(((Date) result).getTime()); | 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()); | 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()); | result = new Timestamp(((Date) result).getTime()); | ||||
} | } | ||||
} else if (CellType.NUMERIC == cell.getCellType() && DateUtil.isCellDateFormatted(cell)) { | } else if (CellType.NUMERIC == cell.getCellType() && DateUtil.isCellDateFormatted(cell)) { | ||||
@@ -148,7 +148,7 @@ public class CellValueService { | |||||
private Object readNumericCell(Cell cell) { | private Object readNumericCell(Cell cell) { | ||||
Object result = null; | Object result = null; | ||||
double value = cell.getNumericCellValue(); | |||||
double value = cell.getNumericCellValue(); | |||||
if (((int) value) == value) { | if (((int) value) == value) { | ||||
result = (int) value; | result = (int) value; | ||||
} else { | } else { | ||||
@@ -160,11 +160,11 @@ public class CellValueService { | |||||
/** | /** | ||||
* 获取日期类型数据 | * 获取日期类型数据 | ||||
* | * | ||||
* @author JueYue | |||||
* 2013年11月26日 | |||||
* @param entity | * @param entity | ||||
* @param value | * @param value | ||||
* @return | * @return | ||||
* @author JueYue | |||||
* 2013年11月26日 | |||||
*/ | */ | ||||
private Date getDateData(ExcelImportEntity entity, String value) { | private Date getDateData(ExcelImportEntity entity, String value) { | ||||
if (StringUtils.isNotEmpty(entity.getFormat()) && StringUtils.isNotEmpty(value)) { | if (StringUtils.isNotEmpty(entity.getFormat()) && StringUtils.isNotEmpty(value)) { | ||||
@@ -190,7 +190,8 @@ public class CellValueService { | |||||
/** | /** | ||||
* 获取cell的值 | * 获取cell的值 | ||||
* @param object | |||||
* | |||||
* @param object | |||||
* @param cell | * @param cell | ||||
* @param excelParams | * @param excelParams | ||||
* @param titleString | * @param titleString | ||||
@@ -199,9 +200,9 @@ public class CellValueService { | |||||
public Object getValue(IExcelDataHandler<?> dataHandler, Object object, String cell, | public Object getValue(IExcelDataHandler<?> dataHandler, Object object, String cell, | ||||
Map<String, ExcelImportEntity> excelParams, | Map<String, ExcelImportEntity> excelParams, | ||||
String titleString, IExcelDictHandler dictHandler) throws Exception { | 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)) { | if (!(object instanceof Map)) { | ||||
Method setMethod = entity.getMethods() != null && entity.getMethods().size() > 0 | Method setMethod = entity.getMethods() != null && entity.getMethods().size() > 0 | ||||
? entity.getMethods().get(entity.getMethods().size() - 1) : entity.getMethod(); | ? entity.getMethods().get(entity.getMethods().size() - 1) : entity.getMethod(); | ||||
@@ -224,7 +225,8 @@ public class CellValueService { | |||||
/** | /** | ||||
* 获取cell的值 | * 获取cell的值 | ||||
* @param object | |||||
* | |||||
* @param object | |||||
* @param cell | * @param cell | ||||
* @param excelParams | * @param excelParams | ||||
* @param titleString | * @param titleString | ||||
@@ -233,9 +235,9 @@ public class CellValueService { | |||||
public Object getValue(IExcelDataHandler<?> dataHandler, Object object, Cell cell, | public Object getValue(IExcelDataHandler<?> dataHandler, Object object, Cell cell, | ||||
Map<String, ExcelImportEntity> excelParams, | Map<String, ExcelImportEntity> excelParams, | ||||
String titleString, IExcelDictHandler dictHandler) throws Exception { | 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)) { | if (!(object instanceof Map)) { | ||||
Method setMethod = entity.getMethods() != null && entity.getMethods().size() > 0 | Method setMethod = entity.getMethods() != null && entity.getMethods().size() > 0 | ||||
? entity.getMethods().get(entity.getMethods().size() - 1) : entity.getMethod(); | ? entity.getMethods().get(entity.getMethods().size() - 1) : entity.getMethod(); | ||||
@@ -258,6 +260,7 @@ public class CellValueService { | |||||
/** | /** | ||||
* 获取cell值 | * 获取cell值 | ||||
* | |||||
* @param dataHandler | * @param dataHandler | ||||
* @param object | * @param object | ||||
* @param cellEntity | * @param cellEntity | ||||
@@ -271,9 +274,9 @@ public class CellValueService { | |||||
ExcelImportEntity entity = excelParams.get(titleString); | ExcelImportEntity entity = excelParams.get(titleString); | ||||
Method setMethod = entity.getMethods() != null && entity.getMethods().size() > 0 | Method setMethod = entity.getMethods() != null && entity.getMethods().size() > 0 | ||||
? entity.getMethods().get(entity.getMethods().size() - 1) : entity.getMethod(); | ? entity.getMethods().get(entity.getMethods().size() - 1) : entity.getMethod(); | ||||
Type[] ts = setMethod.getGenericParameterTypes(); | |||||
Type[] ts = setMethod.getGenericParameterTypes(); | |||||
String classFullName = ts[0].toString(); | String classFullName = ts[0].toString(); | ||||
Object result = cellEntity.getValue(); | |||||
Object result = cellEntity.getValue(); | |||||
result = handlerSuffix(entity.getSuffix(), result); | result = handlerSuffix(entity.getSuffix(), result); | ||||
result = replaceValue(entity.getReplace(), result); | result = replaceValue(entity.getReplace(), result); | ||||
result = handlerValue(dataHandler, object, result, titleString); | result = handlerValue(dataHandler, object, result, titleString); | ||||
@@ -282,6 +285,7 @@ public class CellValueService { | |||||
/** | /** | ||||
* 把后缀删除掉 | * 把后缀删除掉 | ||||
* | |||||
* @param result | * @param result | ||||
* @param suffix | * @param suffix | ||||
* @return | * @return | ||||
@@ -405,7 +409,7 @@ public class CellValueService { | |||||
*/ | */ | ||||
private Object replaceValue(String[] replace, Object result) { | private Object replaceValue(String[] replace, Object result) { | ||||
if (replace != null && replace.length > 0) { | if (replace != null && replace.length > 0) { | ||||
String temp = String.valueOf(result); | |||||
String temp = String.valueOf(result); | |||||
String[] tempArr; | String[] tempArr; | ||||
for (int i = 0; i < replace.length; i++) { | for (int i = 0; i < replace.length; i++) { | ||||
tempArr = replace[i].split("_"); | tempArr = replace[i].split("_"); | ||||
@@ -13,34 +13,6 @@ | |||||
*/ | */ | ||||
package cn.afterturn.easypoi.excel.imports; | 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.annotation.ExcelTarget; | ||||
import cn.afterturn.easypoi.excel.entity.ImportParams; | import cn.afterturn.easypoi.excel.entity.ImportParams; | ||||
import cn.afterturn.easypoi.excel.entity.params.ExcelCollectionParams; | 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.ExcelImportResult; | ||||
import cn.afterturn.easypoi.excel.entity.result.ExcelVerifyHandlerResult; | import cn.afterturn.easypoi.excel.entity.result.ExcelVerifyHandlerResult; | ||||
import cn.afterturn.easypoi.excel.imports.base.ImportBaseService; | 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.ExcelImportException; | ||||
import cn.afterturn.easypoi.exception.excel.enums.ExcelImportEnum; | 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.handler.inter.IExcelModel; | ||||
import cn.afterturn.easypoi.util.PoiCellUtil; | import cn.afterturn.easypoi.util.PoiCellUtil; | ||||
import cn.afterturn.easypoi.util.PoiPublicUtil; | import cn.afterturn.easypoi.util.PoiPublicUtil; | ||||
import cn.afterturn.easypoi.util.PoiReflectorUtil; | import cn.afterturn.easypoi.util.PoiReflectorUtil; | ||||
import cn.afterturn.easypoi.util.PoiValidationUtil; | 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 导入服务 | * Excel 导入服务 | ||||
@@ -68,7 +58,7 @@ public class ExcelImportService extends ImportBaseService { | |||||
private CellValueService cellValueServer; | private CellValueService cellValueServer; | ||||
private boolean verifyFail = false; | |||||
private boolean verifyFail = false; | |||||
/** | /** | ||||
* 异常数据styler | * 异常数据styler | ||||
*/ | */ | ||||
@@ -76,7 +66,7 @@ public class ExcelImportService extends ImportBaseService { | |||||
private List<Row> successRow; | private List<Row> successRow; | ||||
private List<Row> failRow; | private List<Row> failRow; | ||||
private List failCollection = new ArrayList(); | |||||
private List failCollection = new ArrayList(); | |||||
public ExcelImportService() { | public ExcelImportService() { | ||||
successRow = new ArrayList<Row>(); | successRow = new ArrayList<Row>(); | ||||
@@ -95,10 +85,10 @@ public class ExcelImportService extends ImportBaseService { | |||||
* @param pictures | * @param pictures | ||||
* @param params | * @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()) | Collection collection = (Collection) PoiReflectorUtil.fromCache(object.getClass()) | ||||
.getValue(object, param.getName()); | .getValue(object, param.getName()); | ||||
Object entity = PoiPublicUtil.createObject(param.getType(), targetId); | Object entity = PoiPublicUtil.createObject(param.getType(), targetId); | ||||
@@ -109,7 +99,7 @@ public class ExcelImportService extends ImportBaseService { | |||||
// 是否需要加上这个对象 | // 是否需要加上这个对象 | ||||
boolean isUsed = false; | boolean isUsed = false; | ||||
for (int i = row.getFirstCellNum(); i < titlemap.size(); i++) { | 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); | String titleString = (String) titlemap.get(i); | ||||
if (param.getExcelParams().containsKey(titleString)) { | if (param.getExcelParams().containsKey(titleString)) { | ||||
if (param.getExcelParams().get(titleString).getType() == 2) { | if (param.getExcelParams().get(titleString).getType() == 2) { | ||||
@@ -120,7 +110,7 @@ public class ExcelImportService extends ImportBaseService { | |||||
saveFieldValue(params, entity, cell, param.getExcelParams(), titleString, row); | saveFieldValue(params, entity, cell, param.getExcelParams(), titleString, row); | ||||
} catch (ExcelImportException e) { | } 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()); | 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, | private <T> List<T> importExcel(Collection<T> result, Sheet sheet, Class<?> pojoClass, | ||||
ImportParams params, | ImportParams params, | ||||
Map<String, PictureData> pictures) throws Exception { | 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(); | i18nHandler = params.getI18nHandler(); | ||||
if (!Map.class.equals(pojoClass)) { | if (!Map.class.equals(pojoClass)) { | ||||
Field[] fileds = PoiPublicUtil.getClassFields(pojoClass); | |||||
Field[] fileds = PoiPublicUtil.getClassFields(pojoClass); | |||||
ExcelTarget etarget = pojoClass.getAnnotation(ExcelTarget.class); | ExcelTarget etarget = pojoClass.getAnnotation(ExcelTarget.class); | ||||
if (etarget != null) { | if (etarget != null) { | ||||
targetId = etarget.value(); | targetId = etarget.value(); | ||||
@@ -182,10 +172,10 @@ public class ExcelImportService extends ImportBaseService { | |||||
} | } | ||||
Map<Integer, String> titlemap = getTitleMap(rows, params, excelCollection, excelParams); | Map<Integer, String> titlemap = getTitleMap(rows, params, excelCollection, excelParams); | ||||
checkIsValidTemplate(titlemap, excelParams, params, excelCollection); | checkIsValidTemplate(titlemap, excelParams, params, excelCollection); | ||||
Row row = null; | |||||
Object object = null; | |||||
Row row = null; | |||||
Object object = null; | |||||
String picId; | String picId; | ||||
int readRow = 0; | |||||
int readRow = 0; | |||||
//跳过无效行 | //跳过无效行 | ||||
for (int i = 0; i < params.getStartRows(); i++) { | for (int i = 0; i < params.getStartRows(); i++) { | ||||
rows.next(); | rows.next(); | ||||
@@ -194,78 +184,90 @@ public class ExcelImportService extends ImportBaseService { | |||||
if (excelCollection.size() > 0 && params.getKeyIndex() == null) { | if (excelCollection.size() > 0 && params.getKeyIndex() == null) { | ||||
params.setKeyIndex(0); | 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; | 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; | boolean isAdd = true; | ||||
Cell cell = null; | |||||
Cell cell = null; | |||||
if (params.isNeedVerify()) { | if (params.isNeedVerify()) { | ||||
String errorMsg = PoiValidationUtil.validation(object, params.getVerifyGroup()); | String errorMsg = PoiValidationUtil.validation(object, params.getVerifyGroup()); | ||||
if (StringUtils.isNotEmpty(errorMsg)) { | if (StringUtils.isNotEmpty(errorMsg)) { | ||||
@@ -307,7 +309,7 @@ public class ExcelImportService extends ImportBaseService { | |||||
verifyFail = true; | verifyFail = true; | ||||
} | } | ||||
} | } | ||||
if((params.isNeedVerify() || params.getVerifyHandler() != null) && fieldErrorMsg.length() > 0){ | |||||
if ((params.isNeedVerify() || params.getVerifyHandler() != null) && fieldErrorMsg.length() > 0) { | |||||
if (object instanceof IExcelModel) { | if (object instanceof IExcelModel) { | ||||
IExcelModel model = (IExcelModel) object; | IExcelModel model = (IExcelModel) object; | ||||
model.setErrorMsg((StringUtils.isNoneBlank(model.getErrorMsg()) | model.setErrorMsg((StringUtils.isNoneBlank(model.getErrorMsg()) | ||||
@@ -317,7 +319,7 @@ public class ExcelImportService extends ImportBaseService { | |||||
cell = row.createCell(row.getLastCellNum()); | cell = row.createCell(row.getLastCellNum()); | ||||
} | } | ||||
cell.setCellValue((StringUtils.isNoneBlank(cell.getStringCellValue()) | cell.setCellValue((StringUtils.isNoneBlank(cell.getStringCellValue()) | ||||
? cell.getStringCellValue() + "," : "")+ fieldErrorMsg.toString()); | |||||
? cell.getStringCellValue() + "," : "") + fieldErrorMsg.toString()); | |||||
isAdd = false; | isAdd = false; | ||||
verifyFail = true; | verifyFail = true; | ||||
} | } | ||||
@@ -336,11 +338,11 @@ public class ExcelImportService extends ImportBaseService { | |||||
private Map<Integer, String> getTitleMap(Iterator<Row> rows, ImportParams params, | private Map<Integer, String> getTitleMap(Iterator<Row> rows, ImportParams params, | ||||
List<ExcelCollectionParams> excelCollection, | List<ExcelCollectionParams> excelCollection, | ||||
Map<String, ExcelImportEntity> excelParams) { | 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; | ExcelCollectionParams collectionParams = null; | ||||
Row row = null; | |||||
Row row = null; | |||||
for (int j = 0; j < params.getHeadRows(); j++) { | for (int j = 0; j < params.getHeadRows(); j++) { | ||||
row = rows.next(); | row = rows.next(); | ||||
if (row == null) { | if (row == null) { | ||||
@@ -348,7 +350,7 @@ public class ExcelImportService extends ImportBaseService { | |||||
} | } | ||||
cellTitle = row.cellIterator(); | cellTitle = row.cellIterator(); | ||||
while (cellTitle.hasNext()) { | while (cellTitle.hasNext()) { | ||||
Cell cell = cellTitle.next(); | |||||
Cell cell = cellTitle.next(); | |||||
String value = getKeyValue(cell); | String value = getKeyValue(cell); | ||||
value = value.replace("\n", ""); | value = value.replace("\n", ""); | ||||
int i = cell.getColumnIndex(); | int i = cell.getColumnIndex(); | ||||
@@ -405,12 +407,12 @@ public class ExcelImportService extends ImportBaseService { | |||||
if (LOGGER.isDebugEnabled()) { | if (LOGGER.isDebugEnabled()) { | ||||
LOGGER.debug("Excel import start ,class is {}", pojoClass); | 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 { | try { | ||||
byte[] buffer = new byte[1024]; | byte[] buffer = new byte[1024]; | ||||
int len; | |||||
int len; | |||||
while ((len = inputstream.read(buffer)) > -1) { | while ((len = inputstream.read(buffer)) > -1) { | ||||
baos.write(buffer, 0, len); | baos.write(buffer, 0, len); | ||||
} | } | ||||
@@ -432,7 +434,7 @@ public class ExcelImportService extends ImportBaseService { | |||||
for (int i = params.getStartSheetIndex(); i < params.getStartSheetIndex() | for (int i = params.getStartSheetIndex(); i < params.getStartSheetIndex() | ||||
+ params.getSheetNum(); i++) { | + params.getSheetNum(); i++) { | ||||
if (LOGGER.isDebugEnabled()) { | 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) { | if (isXSSFWorkbook) { | ||||
pictures = PoiPublicUtil.getSheetPictrues07((XSSFSheet) book.getSheetAt(i), | pictures = PoiPublicUtil.getSheetPictrues07((XSSFSheet) book.getSheetAt(i), | ||||
@@ -442,11 +444,11 @@ public class ExcelImportService extends ImportBaseService { | |||||
(HSSFWorkbook) book); | (HSSFWorkbook) book); | ||||
} | } | ||||
if (LOGGER.isDebugEnabled()) { | 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)); | result.addAll(importExcel(result, book.getSheetAt(i), pojoClass, params, pictures)); | ||||
if (LOGGER.isDebugEnabled()) { | 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()) { | if (params.isReadSingleCell()) { | ||||
readSingleCell(importResult, book.getSheetAt(i), params); | 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, | Object value = cellValueServer.getValue(params.getDataHandler(), object, cell, excelParams, | ||||
titleString, params.getDictHandler()); | titleString, params.getDictHandler()); | ||||
if (object instanceof Map) { | if (object instanceof Map) { | ||||
@@ -620,12 +622,12 @@ public class ExcelImportService extends ImportBaseService { | |||||
if (image == null) { | if (image == null) { | ||||
return; | return; | ||||
} | } | ||||
byte[] data = image.getData(); | |||||
byte[] data = image.getData(); | |||||
String fileName = "pic" + Math.round(Math.random() * 100000000000L); | String fileName = "pic" + Math.round(Math.random() * 100000000000L); | ||||
fileName += "." + PoiPublicUtil.getFileExtendName(data); | fileName += "." + PoiPublicUtil.getFileExtendName(data); | ||||
if (excelParams.get(titleString).getSaveType() == 1) { | 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()) { | if (!savefile.exists()) { | ||||
savefile.mkdirs(); | 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) | * 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, | * distributed under the License is distributed on an "AS IS" BASIS, | ||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | ||||
* See the License for the specific language governing permissions and | * See the License for the specific language governing permissions and | ||||
@@ -15,51 +15,32 @@ | |||||
*/ | */ | ||||
package cn.afterturn.easypoi.util; | 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.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.ooxml.POIXMLDocumentPart; | ||||
import org.apache.poi.ss.usermodel.PictureData; | 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.XWPFDocument; | ||||
import org.apache.poi.xwpf.usermodel.XWPFRun; | import org.apache.poi.xwpf.usermodel.XWPFRun; | ||||
import org.openxmlformats.schemas.drawingml.x2006.spreadsheetDrawing.CTMarker; | import org.openxmlformats.schemas.drawingml.x2006.spreadsheetDrawing.CTMarker; | ||||
import org.slf4j.Logger; | import org.slf4j.Logger; | ||||
import org.slf4j.LoggerFactory; | 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 的公共基础类 | * EASYPOI 的公共基础类 | ||||
@@ -74,7 +55,7 @@ public final class PoiPublicUtil { | |||||
} | } | ||||
@SuppressWarnings({ "unchecked" }) | |||||
@SuppressWarnings({"unchecked"}) | |||||
public static <K, V> Map<K, V> mapFor(Object... mapping) { | public static <K, V> Map<K, V> mapFor(Object... mapping) { | ||||
Map<K, V> map = new HashMap<K, V>(); | Map<K, V> map = new HashMap<K, V>(); | ||||
for (int i = 0; i < mapping.length; i += 2) { | for (int i = 0; i < mapping.length; i += 2) { | ||||
@@ -93,7 +74,7 @@ public final class PoiPublicUtil { | |||||
Object obj = null; | Object obj = null; | ||||
try { | try { | ||||
if (clazz.equals(Map.class)) { | if (clazz.equals(Map.class)) { | ||||
return new LinkedHashMap<String,Object>(); | |||||
return new LinkedHashMap<String, Object>(); | |||||
} | } | ||||
obj = clazz.newInstance(); | obj = clazz.newInstance(); | ||||
Field[] fields = getClassFields(clazz); | Field[] fields = getClassFields(clazz); | ||||
@@ -104,10 +85,10 @@ public final class PoiPublicUtil { | |||||
if (isCollection(field.getType())) { | if (isCollection(field.getType())) { | ||||
ExcelCollection collection = field.getAnnotation(ExcelCollection.class); | ExcelCollection collection = field.getAnnotation(ExcelCollection.class); | ||||
PoiReflectorUtil.fromCache(clazz).setValue(obj, field.getName(), | PoiReflectorUtil.fromCache(clazz).setValue(obj, field.getName(), | ||||
collection.type().newInstance()); | |||||
collection.type().newInstance()); | |||||
} else if (!isJavaClass(field) && !field.getType().isEnum()) { | } else if (!isJavaClass(field) && !field.getType().isEnum()) { | ||||
PoiReflectorUtil.fromCache(clazz).setValue(obj, field.getName(), | 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) { | public static Field[] getClassFields(Class<?> clazz) { | ||||
List<Field> list = new ArrayList<Field>(); | List<Field> list = new ArrayList<Field>(); | ||||
Field[] fields; | |||||
Field[] fields; | |||||
do { | do { | ||||
fields = clazz.getDeclaredFields(); | fields = clazz.getDeclaredFields(); | ||||
for (int i = 0; i < fields.length; i++) { | for (int i = 0; i < fields.length; i++) { | ||||
@@ -145,11 +126,11 @@ public final class PoiPublicUtil { | |||||
public static String getFileExtendName(byte[] photoByte) { | public static String getFileExtendName(byte[] photoByte) { | ||||
String strFileExtendName = "JPG"; | String strFileExtendName = "JPG"; | ||||
if ((photoByte[0] == 71) && (photoByte[1] == 73) && (photoByte[2] == 70) | 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"; | strFileExtendName = "GIF"; | ||||
} else if ((photoByte[6] == 74) && (photoByte[7] == 70) && (photoByte[8] == 73) | } else if ((photoByte[6] == 74) && (photoByte[7] == 70) && (photoByte[8] == 73) | ||||
&& (photoByte[9] == 70)) { | |||||
&& (photoByte[9] == 70)) { | |||||
strFileExtendName = "JPG"; | strFileExtendName = "JPG"; | ||||
} else if ((photoByte[0] == 66) && (photoByte[1] == 77)) { | } else if ((photoByte[0] == 66) && (photoByte[1] == 77)) { | ||||
strFileExtendName = "BMP"; | strFileExtendName = "BMP"; | ||||
@@ -169,11 +150,12 @@ public final class PoiPublicUtil { | |||||
public static boolean hasBom(InputStream in) throws IOException { | public static boolean hasBom(InputStream in) throws IOException { | ||||
byte[] head = new byte[3]; | byte[] head = new byte[3]; | ||||
in.read(head); | 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 true; | ||||
} | } | ||||
return false; | return false; | ||||
} | } | ||||
/** | /** | ||||
* 获取Excel2003图片 | * 获取Excel2003图片 | ||||
* | * | ||||
@@ -186,16 +168,16 @@ public final class PoiPublicUtil { | |||||
public static Map<String, PictureData> getSheetPictrues03(HSSFSheet sheet, | public static Map<String, PictureData> getSheetPictrues03(HSSFSheet sheet, | ||||
HSSFWorkbook workbook) { | HSSFWorkbook workbook) { | ||||
Map<String, PictureData> sheetIndexPicMap = new HashMap<String, PictureData>(); | Map<String, PictureData> sheetIndexPicMap = new HashMap<String, PictureData>(); | ||||
List<HSSFPictureData> pictures = workbook.getAllPictures(); | |||||
List<HSSFPictureData> pictures = workbook.getAllPictures(); | |||||
if (!pictures.isEmpty()) { | if (!pictures.isEmpty()) { | ||||
for (HSSFShape shape : sheet.getDrawingPatriarch().getChildren()) { | for (HSSFShape shape : sheet.getDrawingPatriarch().getChildren()) { | ||||
HSSFClientAnchor anchor = (HSSFClientAnchor) shape.getAnchor(); | HSSFClientAnchor anchor = (HSSFClientAnchor) shape.getAnchor(); | ||||
if (shape instanceof HSSFPicture) { | 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 picIndex = String.valueOf(anchor.getRow1()) + "_" | ||||
+ String.valueOf(anchor.getCol1()); | |||||
+ String.valueOf(anchor.getCol1()); | |||||
sheetIndexPicMap.put(picIndex, picData); | sheetIndexPicMap.put(picIndex, picData); | ||||
} | } | ||||
} | } | ||||
@@ -219,14 +201,14 @@ public final class PoiPublicUtil { | |||||
Map<String, PictureData> sheetIndexPicMap = new HashMap<String, PictureData>(); | Map<String, PictureData> sheetIndexPicMap = new HashMap<String, PictureData>(); | ||||
for (POIXMLDocumentPart dr : sheet.getRelations()) { | for (POIXMLDocumentPart dr : sheet.getRelations()) { | ||||
if (dr instanceof XSSFDrawing) { | 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) { | for (XSSFShape shape : shapes) { | ||||
if (shape instanceof XSSFPicture) { | 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()); | sheetIndexPicMap.put(picIndex, pic.getPictureData()); | ||||
} | } | ||||
} | } | ||||
@@ -252,15 +234,15 @@ public final class PoiPublicUtil { | |||||
* @return | * @return | ||||
*/ | */ | ||||
public static boolean isJavaClass(Field field) { | public static boolean isJavaClass(Field field) { | ||||
Class<?> fieldType = field.getType(); | |||||
boolean isBaseClass = false; | |||||
Class<?> fieldType = field.getType(); | |||||
boolean isBaseClass = false; | |||||
if (fieldType.isArray()) { | if (fieldType.isArray()) { | ||||
isBaseClass = false; | isBaseClass = false; | ||||
} else if (fieldType.isPrimitive() || fieldType.getPackage() == null | } 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; | isBaseClass = true; | ||||
} | } | ||||
return isBaseClass; | return isBaseClass; | ||||
@@ -280,19 +262,19 @@ public final class PoiPublicUtil { | |||||
if (field.getAnnotation(ExcelIgnore.class) != null) { | if (field.getAnnotation(ExcelIgnore.class) != null) { | ||||
boo = true; | boo = true; | ||||
} else if (boo && field.getAnnotation(ExcelCollection.class) != null | } 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; | boo = false; | ||||
} else if (boo && field.getAnnotation(Excel.class) != null | } 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; | boo = false; | ||||
} else if (boo && field.getAnnotation(ExcelEntity.class) != null | } 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; | boo = false; | ||||
} | } | ||||
return boo; | return boo; | ||||
@@ -307,7 +289,7 @@ public final class PoiPublicUtil { | |||||
*/ | */ | ||||
private static boolean isUseInThis(String exportName, String targetId) { | private static boolean isUseInThis(String exportName, String targetId) { | ||||
return targetId == null || "".equals(exportName) || exportName.indexOf("_") < 0 | return targetId == null || "".equals(exportName) || exportName.indexOf("_") < 0 | ||||
|| exportName.indexOf(targetId) != -1; | |||||
|| exportName.indexOf(targetId) != -1; | |||||
} | } | ||||
private static Integer getImageType(String type) { | private static Integer getImageType(String type) { | ||||
@@ -331,12 +313,12 @@ public final class PoiPublicUtil { | |||||
*@author JueYue | *@author JueYue | ||||
* 2013-11-20 | * 2013-11-20 | ||||
*@param entity | *@param entity | ||||
*@return (byte[]) isAndType[0],(Integer)isAndType[1] | |||||
*@return (byte[]) isAndType[0],(Integer)isAndType[1] | |||||
* @throws Exception | * @throws Exception | ||||
*/ | */ | ||||
public static Object[] getIsAndType(ImageEntity entity) throws Exception { | public static Object[] getIsAndType(ImageEntity entity) throws Exception { | ||||
Object[] result = new Object[2]; | Object[] result = new Object[2]; | ||||
String type; | |||||
String type; | |||||
if (entity.getType().equals(ImageEntity.URL)) { | if (entity.getType().equals(ImageEntity.URL)) { | ||||
result[0] = ImageCache.getImage(entity.getUrl()); | result[0] = ImageCache.getImage(entity.getUrl()); | ||||
type = entity.getUrl().split("/.")[entity.getUrl().split("/.").length - 1]; | type = entity.getUrl().split("/.")[entity.getUrl().split("/.").length - 1]; | ||||
@@ -379,11 +361,11 @@ public final class PoiPublicUtil { | |||||
String params = ""; | String params = ""; | ||||
while (currentText.indexOf(START_STR) != -1) { | while (currentText.indexOf(START_STR) != -1) { | ||||
params = currentText.substring(currentText.indexOf(START_STR) + 2, | params = currentText.substring(currentText.indexOf(START_STR) + 2, | ||||
currentText.indexOf(END_STR)); | |||||
currentText.indexOf(END_STR)); | |||||
Object obj = PoiElUtil.eval(params.trim(), map); | Object obj = PoiElUtil.eval(params.trim(), map); | ||||
//判断图片或者是集合 | //判断图片或者是集合 | ||||
if (obj instanceof ImageEntity || obj instanceof List | if (obj instanceof ImageEntity || obj instanceof List | ||||
|| obj instanceof ExcelListEntity) { | |||||
|| obj instanceof ExcelListEntity) { | |||||
return obj; | return obj; | ||||
} else { | } else { | ||||
currentText = currentText.replace(START_STR + params + END_STR, obj.toString()); | currentText = currentText.replace(START_STR + params + END_STR, obj.toString()); | ||||
@@ -414,10 +396,10 @@ public final class PoiPublicUtil { | |||||
object = ((Map) object).get(paramsArr[index]); | object = ((Map) object).get(paramsArr[index]); | ||||
} else { | } else { | ||||
object = PoiReflectorUtil.fromCache(object.getClass()).getValue(object, | object = PoiReflectorUtil.fromCache(object.getClass()).getValue(object, | ||||
paramsArr[index]); | |||||
paramsArr[index]); | |||||
} | } | ||||
return (index == paramsArr.length - 1) ? (object == null ? "" : object) | 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; | |||||
} | |||||
} | } |