Преглед на файлове

加入了CSV读取

4.1.3.A
jueyue преди 6 години
родител
ревизия
a812db2f38
променени са 10 файла, в които са добавени 627 реда и са изтрити 101 реда
  1. +46
    -0
      easypoi-base/src/main/java/cn/afterturn/easypoi/csv/CsvImportUtil.java
  2. +161
    -0
      easypoi-base/src/main/java/cn/afterturn/easypoi/csv/entity/CsvImportParams.java
  3. +17
    -0
      easypoi-base/src/main/java/cn/afterturn/easypoi/csv/handler/ICsvSaveDataHandler.java
  4. +291
    -0
      easypoi-base/src/main/java/cn/afterturn/easypoi/csv/imports/CsvImportService.java
  5. +10
    -11
      easypoi-base/src/main/java/cn/afterturn/easypoi/excel/entity/ImportParams.java
  6. +14
    -0
      easypoi-base/src/main/java/cn/afterturn/easypoi/excel/entity/TemplateExportParams.java
  7. +43
    -39
      easypoi-base/src/main/java/cn/afterturn/easypoi/excel/export/template/ExcelExportOfTemplateUtil.java
  8. +35
    -0
      easypoi-base/src/main/java/cn/afterturn/easypoi/excel/imports/CellValueService.java
  9. +10
    -11
      easypoi-base/src/main/java/cn/afterturn/easypoi/excel/imports/ExcelImportService.java
  10. +0
    -40
      easypoi-base/src/main/java/cn/afterturn/easypoi/word/entity/WordImageEntity.java

+ 46
- 0
easypoi-base/src/main/java/cn/afterturn/easypoi/csv/CsvImportUtil.java Целия файл

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

+ 161
- 0
easypoi-base/src/main/java/cn/afterturn/easypoi/csv/entity/CsvImportParams.java Целия файл

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

+ 17
- 0
easypoi-base/src/main/java/cn/afterturn/easypoi/csv/handler/ICsvSaveDataHandler.java Целия файл

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

+ 291
- 0
easypoi-base/src/main/java/cn/afterturn/easypoi/csv/imports/CsvImportService.java Целия файл

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

}

+ 10
- 11
easypoi-base/src/main/java/cn/afterturn/easypoi/excel/entity/ImportParams.java Целия файл

@@ -63,11 +63,11 @@ public class ImportParams extends ExcelBaseParams {
/**
* 校验组
*/
private Class[] verfiyGroup = null;
private Class[] verifyGroup = null;
/**
* 是否需要校验上传的Excel,默认为false
*/
private boolean needVerfiy = false;
private boolean needVerify = false;
/**
* 校验处理接口
*/
@@ -135,7 +135,6 @@ public class ImportParams extends ExcelBaseParams {
this.headRows = headRows;
}
@Deprecated
public void setKeyIndex(Integer keyIndex) {
this.keyIndex = keyIndex;
}
@@ -180,12 +179,12 @@ public class ImportParams extends ExcelBaseParams {
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() {
@@ -224,12 +223,12 @@ public class ImportParams extends ExcelBaseParams {
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() {


+ 14
- 0
easypoi-base/src/main/java/cn/afterturn/easypoi/excel/entity/TemplateExportParams.java Целия файл

@@ -16,6 +16,9 @@
package cn.afterturn.easypoi.excel.entity;
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 Workbook templateWb;
/**
* 需要导出的第几个 sheetNum,默认是第0个
@@ -205,4 +212,11 @@ public class TemplateExportParams extends ExcelBaseParams {
this.colForEach = colForEach;
}
public void setTemplateWb(Workbook templateWb) {
this.templateWb = templateWb;
}
public Workbook getTemplateWb() {
return templateWb;
}
}

+ 43
- 39
easypoi-base/src/main/java/cn/afterturn/easypoi/excel/export/template/ExcelExportOfTemplateUtil.java Целия файл

@@ -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
@@ -59,13 +59,13 @@ import cn.afterturn.easypoi.exception.excel.enums.ExcelExportEnum;
*/
public final class ExcelExportOfTemplateUtil extends BaseExportService {
private static final Logger LOGGER = LoggerFactory
private static final Logger LOGGER = LoggerFactory
.getLogger(ExcelExportOfTemplateUtil.class);
/**
* 缓存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 填充正常数据,根据表头信息 使用导入的部分逻辑,坐对象映射
@@ -159,8 +159,8 @@ public final class ExcelExportOfTemplateUtil extends BaseExportService {
if (isShift && datas.size() * rowspan > 1 && cell.getRowIndex() + rowspan < cell.getRow().getSheet().getLastRowNum()) {
cell.getRow().getSheet().shiftRows(cell.getRowIndex() + rowspan,
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()) {
@@ -202,7 +202,7 @@ public final class ExcelExportOfTemplateUtil extends BaseExportService {
for (int k = 0, paramSize = excelParams.size(); k < paramSize; k++) {
entity = excelParams.get(k);
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) {
maxHeight = list.size();
}
@@ -215,14 +215,18 @@ public final class ExcelExportOfTemplateUtil extends BaseExportService {
public Workbook createExcleByTemplate(TemplateExportParams params, Class<?> pojoClass,
Collection<?> dataSet, Map<String, Object> map) {
// 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);
}
Workbook wb = null;
// step 2. 判断模板的Excel类型,解析模板
try {
this.teplateParams = params;
wb = getCloneWorkBook();
if (params.getTemplateWb() != null) {
wb = params.getTemplateWb();
} else {
wb = getCloneWorkBook();
}
if (wb instanceof XSSFWorkbook) {
super.type = ExcelType.XSSF;
}
@@ -380,7 +384,7 @@ public final class ExcelExportOfTemplateUtil extends BaseExportService {
Object t = its.next();
setForEeachRowCellValue(true, cell.getRow(), cell.getColumnIndex(), t, columns, map,
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 = cell.getRow().getCell(cell.getColumnIndex() + colspan);
@@ -452,15 +456,15 @@ public final class ExcelExportOfTemplateUtil extends BaseExportService {
Object obj = PoiPublicUtil.getRealValue(oldString, map);
//如何是数值 类型,就按照数值类型进行设置// 如果是图片就设置为图片
if (obj instanceof ImageEntity) {
ImageEntity img = (ImageEntity)obj;
ImageEntity img = (ImageEntity) obj;
cell.setCellValue("");
if (img.getRowspan()>1 || img.getColspan() > 1){
if (img.getRowspan() > 1 || img.getColspan() > 1) {
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.setCellType(CellType.NUMERIC);
} else {
@@ -530,13 +534,13 @@ public final class ExcelExportOfTemplateUtil extends BaseExportService {
for (int k = 0; k < rowspan; k++) {
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--;
} else {
high= columns.get(n * colspan).getHeight();
high = columns.get(n * colspan).getHeight();
break;
}
}
@@ -569,11 +573,11 @@ public final class ExcelExportOfTemplateUtil extends BaseExportService {
obj = eval(tempStr, map);
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("");
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).setCellType(CellType.NUMERIC);
} else {
@@ -594,8 +598,8 @@ public final class ExcelExportOfTemplateUtil extends BaseExportService {
if ((params.getRowspan() != 1 || params.getColspan() != 1)
&& !mergedRegionHelper.isMergedRegion(row.getRowNum() + 1, ci)) {
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();
}
@@ -644,8 +648,8 @@ public final class ExcelExportOfTemplateUtil extends BaseExportService {
//保存col 的开始列
int startIndex = cell.getColumnIndex();
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;
index += colSpan;
@@ -682,7 +686,7 @@ public final class ExcelExportOfTemplateUtil extends BaseExportService {
columns.add(getExcelTemplateParams(cellStringString.replace(END_STR, EMPTY),
cell, mergedRegionHelper));
//补全缺失的cell(合并单元格后面的)
int lastCellColspan =columns.get(columns.size() - 1).getColspan();
int lastCellColspan = columns.get(columns.size() - 1).getColspan();
for (int i = 1; i < lastCellColspan; i++) {
//添加合并的单元格,这些单元可能不是空,但是没有值,所以也需要跳过
columns.add(null);
@@ -707,7 +711,7 @@ public final class ExcelExportOfTemplateUtil extends BaseExportService {
colspan += columns.get(i) != null ? columns.get(i).getColspan() : 0;
}
colspan = colspan / rowspan;
return new Object[] { rowspan, colspan, columns };
return new Object[]{rowspan, colspan, columns};
}
/**


+ 35
- 0
easypoi-base/src/main/java/cn/afterturn/easypoi/excel/imports/CellValueService.java Целия файл

@@ -180,6 +180,41 @@ public class CellValueService {
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的值
* @param object


+ 10
- 11
easypoi-base/src/main/java/cn/afterturn/easypoi/excel/imports/ExcelImportService.java Целия файл

@@ -38,7 +38,6 @@ import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.FileOutputStream;
import java.io.InputStream;
import java.io.PushbackInputStream;
import java.lang.reflect.Field;
import java.util.*;

@@ -69,7 +68,7 @@ public class ExcelImportService extends ImportBaseService {

private CellValueService cellValueServer;

private boolean verfiyFail = false;
private boolean verifyFail = false;
/**
* 异常数据styler
*/
@@ -121,7 +120,7 @@ public class ExcelImportService extends ImportBaseService {
saveFieldValue(params, entity, cell, param.getExcelParams(), titleString, row);
} 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());
}
}
@@ -235,7 +234,7 @@ public class ExcelImportService extends ImportBaseService {
saveFieldValue(params, object, cell, excelParams, titleString, row);
} 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());
}
}
@@ -278,8 +277,8 @@ public class ExcelImportService extends ImportBaseService {
Class<?> pojoClass, StringBuilder fieldErrorMsg) {
boolean isAdd = true;
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)) {
cell = row.createCell(row.getLastCellNum());
cell.setCellValue(errorMsg);
@@ -288,7 +287,7 @@ public class ExcelImportService extends ImportBaseService {
model.setErrorMsg(errorMsg);
}
isAdd = false;
verfiyFail = true;
verifyFail = true;
}
}
if (params.getVerifyHandler() != null) {
@@ -305,10 +304,10 @@ public class ExcelImportService extends ImportBaseService {
? model.getErrorMsg() + "," : "") + result.getMsg());
}
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) {
IExcelModel model = (IExcelModel) object;
model.setErrorMsg((StringUtils.isNoneBlank(model.getErrorMsg())
@@ -320,7 +319,7 @@ public class ExcelImportService extends ImportBaseService {
cell.setCellValue((StringUtils.isNoneBlank(cell.getStringCellValue())
? cell.getStringCellValue() + "," : "")+ fieldErrorMsg.toString());
isAdd = false;
verfiyFail = true;
verifyFail = true;
}
if (cell != null) {
cell.setCellStyle(errorCellStyle);
@@ -467,7 +466,7 @@ public class ExcelImportService extends ImportBaseService {
importResult.setWorkbook(removeSuperfluousRows(successBook, failRow, params));
importResult.setFailWorkbook(removeSuperfluousRows(book, successRow, params));
importResult.setFailList(failCollection);
importResult.setVerfiyFail(verfiyFail);
importResult.setVerfiyFail(verifyFail);
} finally {
successIs.close();
}


+ 0
- 40
easypoi-base/src/main/java/cn/afterturn/easypoi/word/entity/WordImageEntity.java Целия файл

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

Зареждане…
Отказ
Запис