@@ -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; | |||
} | |||
} |