@@ -0,0 +1,46 @@ | |||||
package cn.afterturn.easypoi.csv; | |||||
import cn.afterturn.easypoi.csv.entity.CsvImportParams; | |||||
import cn.afterturn.easypoi.csv.handler.ICsvSaveDataHandler; | |||||
import cn.afterturn.easypoi.csv.imports.CsvImportService; | |||||
import java.io.InputStream; | |||||
import java.util.List; | |||||
/** | |||||
* CSV 导入工具类 | |||||
* 具体和Excel类似,但是比Excel简单 | |||||
* 需要处理一些字符串的处理 | |||||
* | |||||
* @author by jueyue on 18-10-3. | |||||
*/ | |||||
public final class CsvImportUtil { | |||||
/** | |||||
* Csv 导入流适合大数据导入 | |||||
* 导入 数据源IO流,不返回校验结果 导入 字段类型 Integer,Long,Double,Date,String,Boolean | |||||
* | |||||
* @param inputstream | |||||
* @param pojoClass | |||||
* @param params | |||||
* @return | |||||
*/ | |||||
public static <T> List<T> importCsv(InputStream inputstream, Class<?> pojoClass, | |||||
CsvImportParams params) { | |||||
return new CsvImportService().readExcel(inputstream, pojoClass, params, null); | |||||
} | |||||
/** | |||||
* Csv 导入流适合大数据导入 | |||||
* 导入 数据源IO流,不返回校验结果 导入 字段类型 Integer,Long,Double,Date,String,Boolean | |||||
* | |||||
* @param inputstream | |||||
* @param pojoClass | |||||
* @param params | |||||
* @return | |||||
*/ | |||||
public static <T> List<T> importCsv(InputStream inputstream, Class<?> pojoClass, | |||||
CsvImportParams params, ICsvSaveDataHandler saveDataHandler) { | |||||
return new CsvImportService().readExcel(inputstream, pojoClass, params, saveDataHandler); | |||||
} | |||||
} |
@@ -0,0 +1,161 @@ | |||||
package cn.afterturn.easypoi.csv.entity; | |||||
import cn.afterturn.easypoi.excel.entity.ExcelBaseParams; | |||||
import cn.afterturn.easypoi.handler.inter.IExcelVerifyHandler; | |||||
/** | |||||
* CSV 导入参数 | |||||
* | |||||
* @author by jueyue on 18-10-3. | |||||
*/ | |||||
public class CsvImportParams extends ExcelBaseParams { | |||||
public static final String UTF8 = "utf-8"; | |||||
public static final String GBK = "gbk"; | |||||
public static final String GB2312 = "gb2312"; | |||||
private String encoding = UTF8; | |||||
/** | |||||
* 分隔符 | |||||
*/ | |||||
private String spiltMark = ","; | |||||
/** | |||||
* 字符串标识符 | |||||
*/ | |||||
private String textMark = "\""; | |||||
/** | |||||
* 表格标题行数,默认0 | |||||
*/ | |||||
private int titleRows = 0; | |||||
/** | |||||
* 表头行数,默认1 | |||||
*/ | |||||
private int headRows = 1; | |||||
/** | |||||
* 字段真正值和列标题之间的距离 默认0 | |||||
*/ | |||||
private int startRows = 0; | |||||
/** | |||||
* 校验组 | |||||
*/ | |||||
private Class[] verifyGroup = null; | |||||
/** | |||||
* 是否需要校验上传的Excel,默认为false | |||||
*/ | |||||
private boolean needVerify = false; | |||||
/** | |||||
* 校验处理接口 | |||||
*/ | |||||
private IExcelVerifyHandler verifyHandler; | |||||
/** | |||||
* 最后的无效行数 | |||||
*/ | |||||
private int lastOfInvalidRow = 0; | |||||
/** | |||||
* 主键设置,如何这个cell没有值,就跳过 或者认为这个是list的下面的值 | |||||
* 大家不理解,去掉这个 | |||||
*/ | |||||
private Integer keyIndex = null; | |||||
public CsvImportParams() { | |||||
} | |||||
public CsvImportParams(String encoding) { | |||||
this.encoding = encoding; | |||||
} | |||||
public String getEncoding() { | |||||
return encoding; | |||||
} | |||||
public void setEncoding(String encoding) { | |||||
this.encoding = encoding; | |||||
} | |||||
public String getSpiltMark() { | |||||
return spiltMark; | |||||
} | |||||
public void setSpiltMark(String spiltMark) { | |||||
this.spiltMark = spiltMark; | |||||
} | |||||
public String getTextMark() { | |||||
return textMark; | |||||
} | |||||
public void setTextMark(String textMark) { | |||||
this.textMark = textMark; | |||||
} | |||||
public int getTitleRows() { | |||||
return titleRows; | |||||
} | |||||
public void setTitleRows(int titleRows) { | |||||
this.titleRows = titleRows; | |||||
} | |||||
public int getHeadRows() { | |||||
return headRows; | |||||
} | |||||
public void setHeadRows(int headRows) { | |||||
this.headRows = headRows; | |||||
} | |||||
public int getStartRows() { | |||||
return startRows; | |||||
} | |||||
public void setStartRows(int startRows) { | |||||
this.startRows = startRows; | |||||
} | |||||
public Class[] getVerifyGroup() { | |||||
return verifyGroup; | |||||
} | |||||
public void setVerifyGroup(Class[] verifyGroup) { | |||||
this.verifyGroup = verifyGroup; | |||||
} | |||||
public boolean isNeedVerify() { | |||||
return needVerify; | |||||
} | |||||
public void setNeedVerify(boolean needVerify) { | |||||
this.needVerify = needVerify; | |||||
} | |||||
public IExcelVerifyHandler getVerifyHandler() { | |||||
return verifyHandler; | |||||
} | |||||
public void setVerifyHandler(IExcelVerifyHandler verifyHandler) { | |||||
this.verifyHandler = verifyHandler; | |||||
} | |||||
public int getLastOfInvalidRow() { | |||||
return lastOfInvalidRow; | |||||
} | |||||
public void setLastOfInvalidRow(int lastOfInvalidRow) { | |||||
this.lastOfInvalidRow = lastOfInvalidRow; | |||||
} | |||||
public Integer getKeyIndex() { | |||||
return keyIndex; | |||||
} | |||||
public void setKeyIndex(Integer keyIndex) { | |||||
this.keyIndex = keyIndex; | |||||
} | |||||
} |
@@ -0,0 +1,17 @@ | |||||
package cn.afterturn.easypoi.csv.handler; | |||||
/** | |||||
* 保存数据 | |||||
* 鉴于CSV可能都是大数据,还是调用接口直接保存,避免内存占用 | |||||
* | |||||
* @author by jueyue on 18-10-3. | |||||
*/ | |||||
public interface ICsvSaveDataHandler<T> { | |||||
/** | |||||
* 保存数据 | |||||
* | |||||
* @param t | |||||
*/ | |||||
public void save(T t); | |||||
} |
@@ -0,0 +1,291 @@ | |||||
package cn.afterturn.easypoi.csv.imports; | |||||
import cn.afterturn.easypoi.csv.entity.CsvImportParams; | |||||
import cn.afterturn.easypoi.csv.handler.ICsvSaveDataHandler; | |||||
import cn.afterturn.easypoi.excel.annotation.ExcelTarget; | |||||
import cn.afterturn.easypoi.excel.entity.params.ExcelCollectionParams; | |||||
import cn.afterturn.easypoi.excel.entity.params.ExcelImportEntity; | |||||
import cn.afterturn.easypoi.excel.entity.result.ExcelVerifyHandlerResult; | |||||
import cn.afterturn.easypoi.excel.imports.CellValueService; | |||||
import cn.afterturn.easypoi.excel.imports.base.ImportBaseService; | |||||
import cn.afterturn.easypoi.exception.excel.ExcelImportException; | |||||
import cn.afterturn.easypoi.exception.excel.enums.ExcelImportEnum; | |||||
import cn.afterturn.easypoi.handler.inter.IExcelModel; | |||||
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.ss.usermodel.Cell; | |||||
import org.slf4j.Logger; | |||||
import org.slf4j.LoggerFactory; | |||||
import java.io.BufferedReader; | |||||
import java.io.IOException; | |||||
import java.io.InputStream; | |||||
import java.io.InputStreamReader; | |||||
import java.lang.reflect.Field; | |||||
import java.util.*; | |||||
/** | |||||
* @author by jueyue on 18-10-3. | |||||
*/ | |||||
public class CsvImportService extends ImportBaseService { | |||||
private final static Logger LOGGER = LoggerFactory.getLogger(CsvImportService.class); | |||||
private CellValueService cellValueServer; | |||||
private boolean verifyFail = false; | |||||
public CsvImportService() { | |||||
this.cellValueServer = new CellValueService(); | |||||
} | |||||
public <T> List<T> readExcel(InputStream inputstream, Class<?> pojoClass, CsvImportParams params, ICsvSaveDataHandler saveDataHandler) { | |||||
List collection = new ArrayList(); | |||||
try { | |||||
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); | |||||
ExcelTarget etarget = pojoClass.getAnnotation(ExcelTarget.class); | |||||
if (etarget != null) { | |||||
targetId = etarget.value(); | |||||
} | |||||
getAllExcelField(targetId, fileds, excelParams, excelCollection, pojoClass, null, null); | |||||
} | |||||
BufferedReader rows = new BufferedReader(new InputStreamReader(inputstream, params.getEncoding())); | |||||
for (int j = 0; j < params.getTitleRows(); j++) { | |||||
rows.readLine(); | |||||
} | |||||
Map<Integer, String> titlemap = getTitleMap(rows, params, excelCollection, excelParams); | |||||
int readRow = 0; | |||||
//跳过无效行 | |||||
for (int i = 0; i < params.getStartRows(); i++) { | |||||
rows.readLine(); | |||||
} | |||||
//判断index 和集合,集合情况默认为第一列 | |||||
if (excelCollection.size() > 0 && params.getKeyIndex() == null) { | |||||
params.setKeyIndex(0); | |||||
} | |||||
StringBuilder errorMsg; | |||||
String row = null; | |||||
Object object = null; | |||||
String[] cells; | |||||
while ((row = rows.readLine()) != null) { | |||||
errorMsg = new StringBuilder(); | |||||
cells = row.split(params.getSpiltMark()); | |||||
// 判断是集合元素还是不是集合元素,如果是就继续加入这个集合,不是就创建新的对象 | |||||
// keyIndex 如果为空就不处理,仍然处理这一行 | |||||
if (params.getKeyIndex() != null && (cells[params.getKeyIndex()] == null | |||||
|| StringUtils.isEmpty(cells[params.getKeyIndex()])) | |||||
&& object != null) { | |||||
for (ExcelCollectionParams param : excelCollection) { | |||||
addListContinue(object, param, row, titlemap, targetId, params, errorMsg); | |||||
} | |||||
} else { | |||||
object = PoiPublicUtil.createObject(pojoClass, targetId); | |||||
try { | |||||
Set<Integer> keys = titlemap.keySet(); | |||||
for (Integer cn : keys) { | |||||
String titleString = (String) titlemap.get(cn); | |||||
if (excelParams.containsKey(titleString) || Map.class.equals(pojoClass)) { | |||||
try { | |||||
saveFieldValue(params, object, cells[cn], excelParams, titleString); | |||||
} catch (ExcelImportException e) { | |||||
// 如果需要去校验就忽略,这个错误,继续执行 | |||||
if (params.isNeedVerify() && ExcelImportEnum.GET_VALUE_ERROR.equals(e.getType())) { | |||||
errorMsg.append(" ").append(titleString).append(ExcelImportEnum.GET_VALUE_ERROR.getMsg()); | |||||
} | |||||
} | |||||
} | |||||
} | |||||
for (ExcelCollectionParams param : excelCollection) { | |||||
addListContinue(object, param, row, titlemap, targetId, params, errorMsg); | |||||
} | |||||
if (verifyingDataValidity(object, params, pojoClass, errorMsg)) { | |||||
if (saveDataHandler != null) { | |||||
saveDataHandler.save(object); | |||||
} else { | |||||
collection.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); | |||||
} | |||||
} | |||||
readRow++; | |||||
} | |||||
} catch (Exception e) { | |||||
LOGGER.error(e.getMessage(), e); | |||||
} | |||||
return collection; | |||||
} | |||||
private void addListContinue(Object object, ExcelCollectionParams param, String row, | |||||
Map<Integer, String> titlemap, String targetId, | |||||
CsvImportParams params, StringBuilder errorMsg) throws Exception { | |||||
Collection collection = (Collection) PoiReflectorUtil.fromCache(object.getClass()) | |||||
.getValue(object, param.getName()); | |||||
Object entity = PoiPublicUtil.createObject(param.getType(), targetId); | |||||
// 是否需要加上这个对象 | |||||
boolean isUsed = false; | |||||
String[] cells = row.split(params.getSpiltMark()); | |||||
for (int i = 0; i < cells.length; i++) { | |||||
String cell = cells[i]; | |||||
String titleString = (String) titlemap.get(i); | |||||
if (param.getExcelParams().containsKey(titleString)) { | |||||
try { | |||||
saveFieldValue(params, entity, cell, param.getExcelParams(), titleString); | |||||
} catch (ExcelImportException e) { | |||||
// 如果需要去校验就忽略,这个错误,继续执行 | |||||
if (params.isNeedVerify() && ExcelImportEnum.GET_VALUE_ERROR.equals(e.getType())) { | |||||
errorMsg.append(" ").append(titleString).append(ExcelImportEnum.GET_VALUE_ERROR.getMsg()); | |||||
} | |||||
} | |||||
isUsed = true; | |||||
} | |||||
} | |||||
if (isUsed) { | |||||
collection.add(entity); | |||||
} | |||||
} | |||||
/** | |||||
* 校验数据合法性 | |||||
*/ | |||||
private boolean verifyingDataValidity(Object object, CsvImportParams params, | |||||
Class<?> pojoClass, StringBuilder fieldErrorMsg) { | |||||
boolean isAdd = true; | |||||
Cell cell = null; | |||||
if (params.isNeedVerify()) { | |||||
String errorMsg = PoiValidationUtil.validation(object, params.getVerifyGroup()); | |||||
if (StringUtils.isNotEmpty(errorMsg)) { | |||||
if (object instanceof IExcelModel) { | |||||
IExcelModel model = (IExcelModel) object; | |||||
model.setErrorMsg(errorMsg); | |||||
} | |||||
isAdd = false; | |||||
verifyFail = true; | |||||
} | |||||
} | |||||
if (params.getVerifyHandler() != null) { | |||||
ExcelVerifyHandlerResult result = params.getVerifyHandler().verifyHandler(object); | |||||
if (!result.isSuccess()) { | |||||
if (object instanceof IExcelModel) { | |||||
IExcelModel model = (IExcelModel) object; | |||||
model.setErrorMsg((StringUtils.isNoneBlank(model.getErrorMsg()) | |||||
? model.getErrorMsg() + "," : "") + result.getMsg()); | |||||
} | |||||
isAdd = false; | |||||
verifyFail = true; | |||||
} | |||||
} | |||||
if ((params.isNeedVerify() || params.getVerifyHandler() != null) && fieldErrorMsg.length() > 0) { | |||||
if (object instanceof IExcelModel) { | |||||
IExcelModel model = (IExcelModel) object; | |||||
model.setErrorMsg((StringUtils.isNoneBlank(model.getErrorMsg()) | |||||
? model.getErrorMsg() + "," : "") + fieldErrorMsg.toString()); | |||||
} | |||||
isAdd = false; | |||||
verifyFail = true; | |||||
} | |||||
return isAdd; | |||||
} | |||||
/** | |||||
* 保存字段值(获取值,校验值,追加错误信息) | |||||
*/ | |||||
private void saveFieldValue(CsvImportParams params, Object object, String cell, | |||||
Map<String, ExcelImportEntity> excelParams, String titleString) throws Exception { | |||||
if (cell.startsWith(params.getTextMark()) && cell.endsWith(params.getTextMark())) { | |||||
cell = cell.replaceFirst(cell, params.getTextMark()); | |||||
cell = cell.substring(0, cell.lastIndexOf(params.getTextMark())); | |||||
} | |||||
Object value = cellValueServer.getValue(params.getDataHandler(), object, cell, excelParams, | |||||
titleString, params.getDictHandler()); | |||||
if (object instanceof Map) { | |||||
if (params.getDataHandler() != null) { | |||||
params.getDataHandler().setMapValue((Map) object, titleString, value); | |||||
} else { | |||||
((Map) object).put(titleString, value); | |||||
} | |||||
} else { | |||||
setValues(excelParams.get(titleString), object, value); | |||||
} | |||||
} | |||||
/** | |||||
* 获取表格字段列名对应信息 | |||||
*/ | |||||
private Map<Integer, String> getTitleMap(BufferedReader rows, CsvImportParams params, | |||||
List<ExcelCollectionParams> excelCollection, | |||||
Map<String, ExcelImportEntity> excelParams) throws IOException { | |||||
Map<Integer, String> titlemap = new LinkedHashMap<Integer, String>(); | |||||
String collectionName = null; | |||||
ExcelCollectionParams collectionParams = null; | |||||
String row = null; | |||||
String[] cellTitle; | |||||
for (int j = 0; j < params.getHeadRows(); j++) { | |||||
row = rows.readLine(); | |||||
if (row == null) { | |||||
continue; | |||||
} | |||||
cellTitle = row.split(params.getSpiltMark()); | |||||
for (int i = 0; i < cellTitle.length; i++) { | |||||
String value = cellTitle[i]; | |||||
//用以支持重名导入 | |||||
if (StringUtils.isNotEmpty(value)) { | |||||
if (titlemap.containsKey(i)) { | |||||
collectionName = titlemap.get(i); | |||||
collectionParams = getCollectionParams(excelCollection, collectionName); | |||||
titlemap.put(i, collectionName + "_" + value); | |||||
} else if (StringUtils.isNotEmpty(collectionName) && collectionParams != null | |||||
&& collectionParams.getExcelParams() | |||||
.containsKey(collectionName + "_" + value)) { | |||||
titlemap.put(i, collectionName + "_" + value); | |||||
} else { | |||||
collectionName = null; | |||||
collectionParams = null; | |||||
} | |||||
if (StringUtils.isEmpty(collectionName)) { | |||||
titlemap.put(i, value); | |||||
} | |||||
} | |||||
} | |||||
} | |||||
// 处理指定列的情况 | |||||
Set<String> keys = excelParams.keySet(); | |||||
for (String key : keys) { | |||||
if (key.startsWith("FIXED_")) { | |||||
String[] arr = key.split("_"); | |||||
titlemap.put(Integer.parseInt(arr[1]), key); | |||||
} | |||||
} | |||||
return titlemap; | |||||
} | |||||
/** | |||||
* 获取这个名称对应的集合信息 | |||||
*/ | |||||
private ExcelCollectionParams getCollectionParams(List<ExcelCollectionParams> excelCollection, | |||||
String collectionName) { | |||||
for (ExcelCollectionParams excelCollectionParams : excelCollection) { | |||||
if (collectionName.equals(excelCollectionParams.getExcelName())) { | |||||
return excelCollectionParams; | |||||
} | |||||
} | |||||
return null; | |||||
} | |||||
} |
@@ -63,11 +63,11 @@ public class ImportParams extends ExcelBaseParams { | |||||
/** | /** | ||||
* 校验组 | * 校验组 | ||||
*/ | */ | ||||
private Class[] verfiyGroup = null; | |||||
private Class[] verifyGroup = null; | |||||
/** | /** | ||||
* 是否需要校验上传的Excel,默认为false | * 是否需要校验上传的Excel,默认为false | ||||
*/ | */ | ||||
private boolean needVerfiy = false; | |||||
private boolean needVerify = false; | |||||
/** | /** | ||||
* 校验处理接口 | * 校验处理接口 | ||||
*/ | */ | ||||
@@ -135,7 +135,6 @@ public class ImportParams extends ExcelBaseParams { | |||||
this.headRows = headRows; | this.headRows = headRows; | ||||
} | } | ||||
@Deprecated | |||||
public void setKeyIndex(Integer keyIndex) { | public void setKeyIndex(Integer keyIndex) { | ||||
this.keyIndex = keyIndex; | this.keyIndex = keyIndex; | ||||
} | } | ||||
@@ -180,12 +179,12 @@ public class ImportParams extends ExcelBaseParams { | |||||
this.startSheetIndex = startSheetIndex; | this.startSheetIndex = startSheetIndex; | ||||
} | } | ||||
public boolean isNeedVerfiy() { | |||||
return needVerfiy; | |||||
public boolean isNeedVerify() { | |||||
return needVerify; | |||||
} | } | ||||
public void setNeedVerfiy(boolean needVerfiy) { | |||||
this.needVerfiy = needVerfiy; | |||||
public void setNeedVerify(boolean needVerify) { | |||||
this.needVerify = needVerify; | |||||
} | } | ||||
public String[] getImportFields() { | public String[] getImportFields() { | ||||
@@ -224,12 +223,12 @@ public class ImportParams extends ExcelBaseParams { | |||||
this.readSingleCell = readSingleCell; | this.readSingleCell = readSingleCell; | ||||
} | } | ||||
public Class[] getVerfiyGroup() { | |||||
return verfiyGroup; | |||||
public Class[] getVerifyGroup() { | |||||
return verifyGroup; | |||||
} | } | ||||
public void setVerfiyGroup(Class[] verfiyGroup) { | |||||
this.verfiyGroup = verfiyGroup; | |||||
public void setVerifyGroup(Class[] verifyGroup) { | |||||
this.verifyGroup = verifyGroup; | |||||
} | } | ||||
public boolean isNeedCheckOrder() { | public boolean isNeedCheckOrder() { | ||||
@@ -16,6 +16,9 @@ | |||||
package cn.afterturn.easypoi.excel.entity; | package cn.afterturn.easypoi.excel.entity; | ||||
import cn.afterturn.easypoi.excel.export.styler.ExcelExportStylerDefaultImpl; | import cn.afterturn.easypoi.excel.export.styler.ExcelExportStylerDefaultImpl; | ||||
import org.apache.poi.ss.usermodel.Workbook; | |||||
import java.io.InputStream; | |||||
/** | /** | ||||
* 模板导出参数设置 | * 模板导出参数设置 | ||||
@@ -34,6 +37,10 @@ public class TemplateExportParams extends ExcelBaseParams { | |||||
* 模板的路径 | * 模板的路径 | ||||
*/ | */ | ||||
private String templateUrl; | private String templateUrl; | ||||
/** | |||||
* 模板 | |||||
*/ | |||||
private Workbook templateWb; | |||||
/** | /** | ||||
* 需要导出的第几个 sheetNum,默认是第0个 | * 需要导出的第几个 sheetNum,默认是第0个 | ||||
@@ -205,4 +212,11 @@ public class TemplateExportParams extends ExcelBaseParams { | |||||
this.colForEach = colForEach; | this.colForEach = colForEach; | ||||
} | } | ||||
public void setTemplateWb(Workbook templateWb) { | |||||
this.templateWb = templateWb; | |||||
} | |||||
public Workbook getTemplateWb() { | |||||
return templateWb; | |||||
} | |||||
} | } |
@@ -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 | ||||
@@ -59,13 +59,13 @@ import cn.afterturn.easypoi.exception.excel.enums.ExcelExportEnum; | |||||
*/ | */ | ||||
public final class ExcelExportOfTemplateUtil extends BaseExportService { | public final class ExcelExportOfTemplateUtil extends BaseExportService { | ||||
private static final Logger LOGGER = LoggerFactory | |||||
private static final Logger LOGGER = LoggerFactory | |||||
.getLogger(ExcelExportOfTemplateUtil.class); | .getLogger(ExcelExportOfTemplateUtil.class); | ||||
/** | /** | ||||
* 缓存TEMP 的for each创建的cell ,跳过这个cell的模板语法查找,提高效率 | * 缓存TEMP 的for each创建的cell ,跳过这个cell的模板语法查找,提高效率 | ||||
*/ | */ | ||||
private Set<String> tempCreateCellSet = new HashSet<String>(); | |||||
private Set<String> tempCreateCellSet = new HashSet<String>(); | |||||
/** | /** | ||||
* 模板参数,全局都用到 | * 模板参数,全局都用到 | ||||
*/ | */ | ||||
@@ -73,9 +73,9 @@ public final class ExcelExportOfTemplateUtil extends BaseExportService { | |||||
/** | /** | ||||
* 单元格合并信息 | * 单元格合并信息 | ||||
*/ | */ | ||||
private MergedRegionHelper mergedRegionHelper; | |||||
private MergedRegionHelper mergedRegionHelper; | |||||
private TemplateSumHandler templateSumHandler; | |||||
private TemplateSumHandler templateSumHandler; | |||||
/** | /** | ||||
* 往Sheet 填充正常数据,根据表头信息 使用导入的部分逻辑,坐对象映射 | * 往Sheet 填充正常数据,根据表头信息 使用导入的部分逻辑,坐对象映射 | ||||
@@ -159,8 +159,8 @@ public final class ExcelExportOfTemplateUtil extends BaseExportService { | |||||
if (isShift && datas.size() * rowspan > 1 && cell.getRowIndex() + rowspan < cell.getRow().getSheet().getLastRowNum()) { | if (isShift && datas.size() * rowspan > 1 && cell.getRowIndex() + rowspan < cell.getRow().getSheet().getLastRowNum()) { | ||||
cell.getRow().getSheet().shiftRows(cell.getRowIndex() + rowspan, | cell.getRow().getSheet().shiftRows(cell.getRowIndex() + rowspan, | ||||
cell.getRow().getSheet().getLastRowNum(), (datas.size() - 1) * rowspan, true, true); | cell.getRow().getSheet().getLastRowNum(), (datas.size() - 1) * rowspan, true, true); | ||||
mergedRegionHelper.shiftRows(cell.getSheet(),cell.getRowIndex() + rowspan,(datas.size() - 1) * rowspan); | |||||
templateSumHandler.shiftRows(cell.getRowIndex() + rowspan,(datas.size() - 1) * rowspan); | |||||
mergedRegionHelper.shiftRows(cell.getSheet(), cell.getRowIndex() + rowspan, (datas.size() - 1) * rowspan); | |||||
templateSumHandler.shiftRows(cell.getRowIndex() + rowspan, (datas.size() - 1) * rowspan); | |||||
} | } | ||||
while (its.hasNext()) { | while (its.hasNext()) { | ||||
@@ -202,7 +202,7 @@ public final class ExcelExportOfTemplateUtil extends BaseExportService { | |||||
for (int k = 0, paramSize = excelParams.size(); k < paramSize; k++) { | for (int k = 0, paramSize = excelParams.size(); k < paramSize; k++) { | ||||
entity = excelParams.get(k); | entity = excelParams.get(k); | ||||
if (entity.getList() != null) { | if (entity.getList() != null) { | ||||
Collection<?> list = (Collection<?>) entity.getMethod().invoke(t, new Object[] {}); | |||||
Collection<?> list = (Collection<?>) entity.getMethod().invoke(t, new Object[]{}); | |||||
if (list != null && list.size() > maxHeight) { | if (list != null && list.size() > maxHeight) { | ||||
maxHeight = list.size(); | maxHeight = list.size(); | ||||
} | } | ||||
@@ -215,14 +215,18 @@ public final class ExcelExportOfTemplateUtil extends BaseExportService { | |||||
public Workbook createExcleByTemplate(TemplateExportParams params, Class<?> pojoClass, | public Workbook createExcleByTemplate(TemplateExportParams params, Class<?> pojoClass, | ||||
Collection<?> dataSet, Map<String, Object> map) { | Collection<?> dataSet, Map<String, Object> map) { | ||||
// step 1. 判断模板的地址 | // step 1. 判断模板的地址 | ||||
if (params == null || map == null || StringUtils.isEmpty(params.getTemplateUrl())) { | |||||
if (params == null || map == null || (StringUtils.isEmpty(params.getTemplateUrl()) || params.getTemplateWb() == null)) { | |||||
throw new ExcelExportException(ExcelExportEnum.PARAMETER_ERROR); | throw new ExcelExportException(ExcelExportEnum.PARAMETER_ERROR); | ||||
} | } | ||||
Workbook wb = null; | Workbook wb = null; | ||||
// step 2. 判断模板的Excel类型,解析模板 | // step 2. 判断模板的Excel类型,解析模板 | ||||
try { | try { | ||||
this.teplateParams = params; | this.teplateParams = params; | ||||
wb = getCloneWorkBook(); | |||||
if (params.getTemplateWb() != null) { | |||||
wb = params.getTemplateWb(); | |||||
} else { | |||||
wb = getCloneWorkBook(); | |||||
} | |||||
if (wb instanceof XSSFWorkbook) { | if (wb instanceof XSSFWorkbook) { | ||||
super.type = ExcelType.XSSF; | super.type = ExcelType.XSSF; | ||||
} | } | ||||
@@ -380,7 +384,7 @@ public final class ExcelExportOfTemplateUtil extends BaseExportService { | |||||
Object t = its.next(); | Object t = its.next(); | ||||
setForEeachRowCellValue(true, cell.getRow(), cell.getColumnIndex(), t, columns, map, | setForEeachRowCellValue(true, cell.getRow(), cell.getColumnIndex(), t, columns, map, | ||||
rowspan, colspan, mergedRegionHelper); | rowspan, colspan, mergedRegionHelper); | ||||
if(cell.getRow().getCell(cell.getColumnIndex() + colspan) == null){ | |||||
if (cell.getRow().getCell(cell.getColumnIndex() + colspan) == null) { | |||||
cell.getRow().createCell(cell.getColumnIndex() + colspan); | cell.getRow().createCell(cell.getColumnIndex() + colspan); | ||||
} | } | ||||
cell = cell.getRow().getCell(cell.getColumnIndex() + colspan); | cell = cell.getRow().getCell(cell.getColumnIndex() + colspan); | ||||
@@ -452,15 +456,15 @@ public final class ExcelExportOfTemplateUtil extends BaseExportService { | |||||
Object obj = PoiPublicUtil.getRealValue(oldString, map); | Object obj = PoiPublicUtil.getRealValue(oldString, map); | ||||
//如何是数值 类型,就按照数值类型进行设置// 如果是图片就设置为图片 | //如何是数值 类型,就按照数值类型进行设置// 如果是图片就设置为图片 | ||||
if (obj instanceof ImageEntity) { | if (obj instanceof ImageEntity) { | ||||
ImageEntity img = (ImageEntity)obj; | |||||
ImageEntity img = (ImageEntity) obj; | |||||
cell.setCellValue(""); | cell.setCellValue(""); | ||||
if (img.getRowspan()>1 || img.getColspan() > 1){ | |||||
if (img.getRowspan() > 1 || img.getColspan() > 1) { | |||||
img.setHeight(0); | img.setHeight(0); | ||||
PoiMergeCellUtil.addMergedRegion(cell.getSheet(),cell.getRowIndex(), | |||||
cell.getRowIndex() + img.getRowspan() - 1, cell.getColumnIndex(), cell.getColumnIndex() + img.getColspan() -1); | |||||
PoiMergeCellUtil.addMergedRegion(cell.getSheet(), cell.getRowIndex(), | |||||
cell.getRowIndex() + img.getRowspan() - 1, cell.getColumnIndex(), cell.getColumnIndex() + img.getColspan() - 1); | |||||
} | } | ||||
createImageCell(cell,img.getHeight(),img.getUrl(),img.getData()); | |||||
}else if (isNumber && StringUtils.isNotBlank(obj.toString())) { | |||||
createImageCell(cell, img.getHeight(), img.getUrl(), img.getData()); | |||||
} else if (isNumber && StringUtils.isNotBlank(obj.toString())) { | |||||
cell.setCellValue(Double.parseDouble(obj.toString())); | cell.setCellValue(Double.parseDouble(obj.toString())); | ||||
cell.setCellType(CellType.NUMERIC); | cell.setCellType(CellType.NUMERIC); | ||||
} else { | } else { | ||||
@@ -530,13 +534,13 @@ public final class ExcelExportOfTemplateUtil extends BaseExportService { | |||||
for (int k = 0; k < rowspan; k++) { | for (int k = 0; k < rowspan; k++) { | ||||
int ci = columnIndex;//cell的序号 | int ci = columnIndex;//cell的序号 | ||||
short high=columns.get(0).getHeight(); | |||||
int n=k; | |||||
while (n>0) { | |||||
if ( columns.get(n * colspan).getHeight()==0) { | |||||
short high = columns.get(0).getHeight(); | |||||
int n = k; | |||||
while (n > 0) { | |||||
if (columns.get(n * colspan).getHeight() == 0) { | |||||
n--; | n--; | ||||
} else { | } else { | ||||
high= columns.get(n * colspan).getHeight(); | |||||
high = columns.get(n * colspan).getHeight(); | |||||
break; | break; | ||||
} | } | ||||
} | } | ||||
@@ -569,11 +573,11 @@ public final class ExcelExportOfTemplateUtil extends BaseExportService { | |||||
obj = eval(tempStr, map); | obj = eval(tempStr, map); | ||||
val = obj.toString(); | val = obj.toString(); | ||||
} | } | ||||
if (obj != null && obj instanceof ImageEntity) { | |||||
ImageEntity img = (ImageEntity)obj; | |||||
if (obj != null && obj instanceof ImageEntity) { | |||||
ImageEntity img = (ImageEntity) obj; | |||||
row.getCell(ci).setCellValue(""); | row.getCell(ci).setCellValue(""); | ||||
createImageCell(row.getCell(ci),img.getHeight(),img.getUrl(),img.getData()); | |||||
}else if (isNumber && StringUtils.isNotEmpty(val)) { | |||||
createImageCell(row.getCell(ci), img.getHeight(), img.getUrl(), img.getData()); | |||||
} else if (isNumber && StringUtils.isNotEmpty(val)) { | |||||
row.getCell(ci).setCellValue(Double.parseDouble(val)); | row.getCell(ci).setCellValue(Double.parseDouble(val)); | ||||
row.getCell(ci).setCellType(CellType.NUMERIC); | row.getCell(ci).setCellType(CellType.NUMERIC); | ||||
} else { | } else { | ||||
@@ -594,8 +598,8 @@ public final class ExcelExportOfTemplateUtil extends BaseExportService { | |||||
if ((params.getRowspan() != 1 || params.getColspan() != 1) | if ((params.getRowspan() != 1 || params.getColspan() != 1) | ||||
&& !mergedRegionHelper.isMergedRegion(row.getRowNum() + 1, ci)) { | && !mergedRegionHelper.isMergedRegion(row.getRowNum() + 1, ci)) { | ||||
PoiMergeCellUtil.addMergedRegion(row.getSheet(), row.getRowNum(), | PoiMergeCellUtil.addMergedRegion(row.getSheet(), row.getRowNum(), | ||||
row.getRowNum() + params.getRowspan() - 1, ci, | |||||
ci + params.getColspan() - 1); | |||||
row.getRowNum() + params.getRowspan() - 1, ci, | |||||
ci + params.getColspan() - 1); | |||||
} | } | ||||
ci = ci + params.getColspan(); | ci = ci + params.getColspan(); | ||||
} | } | ||||
@@ -644,8 +648,8 @@ public final class ExcelExportOfTemplateUtil extends BaseExportService { | |||||
//保存col 的开始列 | //保存col 的开始列 | ||||
int startIndex = cell.getColumnIndex(); | int startIndex = cell.getColumnIndex(); | ||||
Row row = cell.getRow(); | Row row = cell.getRow(); | ||||
while (index < row.getLastCellNum()) { | |||||
int colSpan = columns.get(columns.size() - 1) != null | |||||
while (index < row.getLastCellNum()) { | |||||
int colSpan = columns.get(columns.size() - 1) != null | |||||
? columns.get(columns.size() - 1).getColspan() : 1; | ? columns.get(columns.size() - 1).getColspan() : 1; | ||||
index += colSpan; | index += colSpan; | ||||
@@ -682,7 +686,7 @@ public final class ExcelExportOfTemplateUtil extends BaseExportService { | |||||
columns.add(getExcelTemplateParams(cellStringString.replace(END_STR, EMPTY), | columns.add(getExcelTemplateParams(cellStringString.replace(END_STR, EMPTY), | ||||
cell, mergedRegionHelper)); | cell, mergedRegionHelper)); | ||||
//补全缺失的cell(合并单元格后面的) | //补全缺失的cell(合并单元格后面的) | ||||
int lastCellColspan =columns.get(columns.size() - 1).getColspan(); | |||||
int lastCellColspan = columns.get(columns.size() - 1).getColspan(); | |||||
for (int i = 1; i < lastCellColspan; i++) { | for (int i = 1; i < lastCellColspan; i++) { | ||||
//添加合并的单元格,这些单元可能不是空,但是没有值,所以也需要跳过 | //添加合并的单元格,这些单元可能不是空,但是没有值,所以也需要跳过 | ||||
columns.add(null); | columns.add(null); | ||||
@@ -707,7 +711,7 @@ public final class ExcelExportOfTemplateUtil extends BaseExportService { | |||||
colspan += columns.get(i) != null ? columns.get(i).getColspan() : 0; | colspan += columns.get(i) != null ? columns.get(i).getColspan() : 0; | ||||
} | } | ||||
colspan = colspan / rowspan; | colspan = colspan / rowspan; | ||||
return new Object[] { rowspan, colspan, columns }; | |||||
return new Object[]{rowspan, colspan, columns}; | |||||
} | } | ||||
/** | /** | ||||
@@ -180,6 +180,41 @@ public class CellValueService { | |||||
return null; | return null; | ||||
} | } | ||||
/** | |||||
* 获取cell的值 | |||||
* @param object | |||||
* @param cell | |||||
* @param excelParams | |||||
* @param titleString | |||||
* @param dictHandler | |||||
*/ | |||||
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; | |||||
if (!(object instanceof Map)) { | |||||
Method setMethod = entity.getMethods() != null && entity.getMethods().size() > 0 | |||||
? entity.getMethods().get(entity.getMethods().size() - 1) : entity.getMethod(); | |||||
Type[] ts = setMethod.getGenericParameterTypes(); | |||||
classFullName = ts[0].toString(); | |||||
clazz = (Class) ts[0]; | |||||
} | |||||
Object result = cell; | |||||
if (entity != null) { | |||||
result = handlerSuffix(entity.getSuffix(), result); | |||||
result = replaceValue(entity.getReplace(), result); | |||||
result = replaceValue(entity.getReplace(), result); | |||||
if (dictHandler != null && StringUtils.isNoneBlank(entity.getDict())) { | |||||
dictHandler.toValue(entity.getDict(), object, entity.getName(), result); | |||||
} | |||||
} | |||||
result = handlerValue(dataHandler, object, result, titleString); | |||||
return getValueByType(classFullName, result, entity, clazz); | |||||
} | |||||
/** | /** | ||||
* 获取cell的值 | * 获取cell的值 | ||||
* @param object | * @param object | ||||
@@ -38,7 +38,6 @@ import java.io.ByteArrayOutputStream; | |||||
import java.io.File; | import java.io.File; | ||||
import java.io.FileOutputStream; | import java.io.FileOutputStream; | ||||
import java.io.InputStream; | import java.io.InputStream; | ||||
import java.io.PushbackInputStream; | |||||
import java.lang.reflect.Field; | import java.lang.reflect.Field; | ||||
import java.util.*; | import java.util.*; | ||||
@@ -69,7 +68,7 @@ public class ExcelImportService extends ImportBaseService { | |||||
private CellValueService cellValueServer; | private CellValueService cellValueServer; | ||||
private boolean verfiyFail = false; | |||||
private boolean verifyFail = false; | |||||
/** | /** | ||||
* 异常数据styler | * 异常数据styler | ||||
*/ | */ | ||||
@@ -121,7 +120,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.isNeedVerfiy() && 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()); | ||||
} | } | ||||
} | } | ||||
@@ -235,7 +234,7 @@ public class ExcelImportService extends ImportBaseService { | |||||
saveFieldValue(params, object, cell, excelParams, titleString, row); | saveFieldValue(params, object, cell, excelParams, titleString, row); | ||||
} catch (ExcelImportException e) { | } catch (ExcelImportException e) { | ||||
// 如果需要去校验就忽略,这个错误,继续执行 | // 如果需要去校验就忽略,这个错误,继续执行 | ||||
if(params.isNeedVerfiy() && 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()); | ||||
} | } | ||||
} | } | ||||
@@ -278,8 +277,8 @@ public class ExcelImportService extends ImportBaseService { | |||||
Class<?> pojoClass, StringBuilder fieldErrorMsg) { | Class<?> pojoClass, StringBuilder fieldErrorMsg) { | ||||
boolean isAdd = true; | boolean isAdd = true; | ||||
Cell cell = null; | Cell cell = null; | ||||
if (params.isNeedVerfiy()) { | |||||
String errorMsg = PoiValidationUtil.validation(object, params.getVerfiyGroup()); | |||||
if (params.isNeedVerify()) { | |||||
String errorMsg = PoiValidationUtil.validation(object, params.getVerifyGroup()); | |||||
if (StringUtils.isNotEmpty(errorMsg)) { | if (StringUtils.isNotEmpty(errorMsg)) { | ||||
cell = row.createCell(row.getLastCellNum()); | cell = row.createCell(row.getLastCellNum()); | ||||
cell.setCellValue(errorMsg); | cell.setCellValue(errorMsg); | ||||
@@ -288,7 +287,7 @@ public class ExcelImportService extends ImportBaseService { | |||||
model.setErrorMsg(errorMsg); | model.setErrorMsg(errorMsg); | ||||
} | } | ||||
isAdd = false; | isAdd = false; | ||||
verfiyFail = true; | |||||
verifyFail = true; | |||||
} | } | ||||
} | } | ||||
if (params.getVerifyHandler() != null) { | if (params.getVerifyHandler() != null) { | ||||
@@ -305,10 +304,10 @@ public class ExcelImportService extends ImportBaseService { | |||||
? model.getErrorMsg() + "," : "") + result.getMsg()); | ? model.getErrorMsg() + "," : "") + result.getMsg()); | ||||
} | } | ||||
isAdd = false; | isAdd = false; | ||||
verfiyFail = true; | |||||
verifyFail = true; | |||||
} | } | ||||
} | } | ||||
if((params.isNeedVerfiy() || 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()) | ||||
@@ -320,7 +319,7 @@ public class ExcelImportService extends ImportBaseService { | |||||
cell.setCellValue((StringUtils.isNoneBlank(cell.getStringCellValue()) | cell.setCellValue((StringUtils.isNoneBlank(cell.getStringCellValue()) | ||||
? cell.getStringCellValue() + "," : "")+ fieldErrorMsg.toString()); | ? cell.getStringCellValue() + "," : "")+ fieldErrorMsg.toString()); | ||||
isAdd = false; | isAdd = false; | ||||
verfiyFail = true; | |||||
verifyFail = true; | |||||
} | } | ||||
if (cell != null) { | if (cell != null) { | ||||
cell.setCellStyle(errorCellStyle); | cell.setCellStyle(errorCellStyle); | ||||
@@ -467,7 +466,7 @@ public class ExcelImportService extends ImportBaseService { | |||||
importResult.setWorkbook(removeSuperfluousRows(successBook, failRow, params)); | importResult.setWorkbook(removeSuperfluousRows(successBook, failRow, params)); | ||||
importResult.setFailWorkbook(removeSuperfluousRows(book, successRow, params)); | importResult.setFailWorkbook(removeSuperfluousRows(book, successRow, params)); | ||||
importResult.setFailList(failCollection); | importResult.setFailList(failCollection); | ||||
importResult.setVerfiyFail(verfiyFail); | |||||
importResult.setVerfiyFail(verifyFail); | |||||
} finally { | } finally { | ||||
successIs.close(); | successIs.close(); | ||||
} | } | ||||
@@ -1,40 +0,0 @@ | |||||
/** | |||||
* 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 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 limitations under | |||||
* the License. | |||||
*/ | |||||
package cn.afterturn.easypoi.word.entity; | |||||
import cn.afterturn.easypoi.entity.ImageEntity; | |||||
/** | |||||
* word导出,图片设置和图片信息 | |||||
* | |||||
* @author JueYue | |||||
* 2013-11-17 | |||||
* @version 1.0 | |||||
*/ | |||||
@Deprecated | |||||
public class WordImageEntity extends ImageEntity { | |||||
public WordImageEntity() { | |||||
} | |||||
public WordImageEntity(byte[] data, int width, int height) { | |||||
super(data, width, height); | |||||
} | |||||
public WordImageEntity(String url, int width, int height) { | |||||
super(url, width, height); | |||||
} | |||||
} |