Commit 817aeeb1 authored by lcl's avatar lcl

u

parent 62f94d3d
...@@ -1389,113 +1389,11 @@ public class ExcelUtils<T> { ...@@ -1389,113 +1389,11 @@ public class ExcelUtils<T> {
public List<T> importExcel(String sheetName, InputStream is, int titleNum) throws Exception { public List<T> importExcel(String sheetName, InputStream is, int titleNum) throws Exception {
this.type = Excel.Type.IMPORT; this.type = Excel.Type.IMPORT;
this.wb = WorkbookFactory.create(is); this.wb = WorkbookFactory.create(is);
List<T> list = new ArrayList<T>(); List<T> resList = new ArrayList<T>();
// 如果指定sheet名,则取指定sheet中的内容 否则默认指向第1个sheet // 如果指定sheet名,则取指定sheet中的内容 否则默认指向第1个sheet
Sheet sheet = StringUtils.isNotEmpty(sheetName) ? wb.getSheet(sheetName) : wb.getSheetAt(0); Sheet sheet = StringUtils.isNotEmpty(sheetName) ? wb.getSheet(sheetName) : wb.getSheetAt(0);
if (sheet == null) { dealwithSheet(resList, sheet, titleNum);
throw new IOException("文件sheet不存在"); return resList;
}
boolean isXSSFWorkbook = !(wb instanceof HSSFWorkbook);
Map<String, PictureData> pictures;
if (isXSSFWorkbook) {
pictures = getSheetPictures07((XSSFSheet) sheet, (XSSFWorkbook) wb);
} else {
pictures = getSheetPictures03((HSSFSheet) sheet, (HSSFWorkbook) wb);
}
// 获取最后一个非空行的行下标,比如总行数为n,则返回的为n-1
int rows = sheet.getLastRowNum();
if (rows > 0) {
// 定义一个map用于存放excel列的序号和field.
Map<String, Integer> cellMap = new HashMap<String, Integer>();
// 获取表头
Row heard = sheet.getRow(titleNum);
for (int i = 0; i < heard.getPhysicalNumberOfCells(); i++) {
Cell cell = heard.getCell(i);
if (ObjectUtils.isEmpty(cell)) {
cellMap.put(null, i);
} else {
String value = this.getCellValue(heard, i).toString();
cellMap.put(value, i);
}
}
// 有数据时才处理 得到类的所有field.
List<Object[]> fields = this.getFields();
Map<Integer, Object[]> fieldsMap = new HashMap<Integer, Object[]>();
for (Object[] objects : fields) {
Excel attr = (Excel) objects[1];
Integer column = cellMap.get(attr.name());
if (column != null) {
fieldsMap.put(column, objects);
}
}
for (int i = titleNum + 1; i <= rows; i++) {
// 从第2行开始取数据,默认第一行是表头.
Row row = sheet.getRow(i);
// 判断当前行是否是空行
if (isRowEmpty(row)) {
continue;
}
T entity = null;
for (Map.Entry<Integer, Object[]> entry : fieldsMap.entrySet()) {
Object val = this.getCellValue(row, entry.getKey());
// 如果不存在实例则新建.
entity = (entity == null ? clazz.newInstance() : entity);
// 从map中得到对应列的field.
Field field = (Field) entry.getValue()[0];
Excel attr = (Excel) entry.getValue()[1];
// 取得类型,并根据对象类型设置值.
Class<?> fieldType = field.getType();
if (String.class == fieldType) {
String s = Convert.toStr(val);
if (StringUtils.endsWith(s, ".0")) {
val = StringUtils.substringBefore(s, ".0");
} else {
String dateFormat = field.getAnnotation(Excel.class).dateFormat();
if (StringUtils.isNotEmpty(dateFormat)) {
val = parseDateToStr(dateFormat, val);
} else {
val = Convert.toStr(val);
}
}
} else if ((Integer.TYPE == fieldType || Integer.class == fieldType) && StringUtils.isNumeric(Convert.toStr(val))) {
val = Convert.toInt(val);
} else if ((Long.TYPE == fieldType || Long.class == fieldType) && StringUtils.isNumeric(Convert.toStr(val))) {
val = Convert.toLong(val);
} else if (Double.TYPE == fieldType || Double.class == fieldType) {
val = Convert.toDouble(val);
} else if (Float.TYPE == fieldType || Float.class == fieldType) {
val = Convert.toFloat(val);
} else if (BigDecimal.class == fieldType) {
val = Convert.toBigDecimal(val);
} else if (Date.class == fieldType) {
if (val instanceof String) {
val = DateUtils.parseDate(val);
} else if (val instanceof Double) {
val = DateUtil.getJavaDate((Double) val);
}
} else if (Boolean.TYPE == fieldType || Boolean.class == fieldType) {
val = Convert.toBool(val, false);
}
if (!ObjectUtils.isEmpty(fieldType)) {
String propertyName = field.getName();
if (StringUtils.isNotEmpty(attr.targetAttr())) {
propertyName = field.getName() + "." + attr.targetAttr();
} else if (StringUtils.isNotEmpty(attr.readConverterExp())) {
val = reverseByExp(Convert.toStr(val), attr.readConverterExp(), attr.separator());
} else if (StringUtils.isNotEmpty(attr.dictType())) {
val = reverseDictByExp(Convert.toStr(val), attr.dictType(), attr.separator());
} else if (!attr.handler().equals(ExcelHandlerAdapter.class)) {
val = dataFormatHandlerAdapter(val, attr);
}
ReflectUtils.invokeSetter(entity, propertyName, val);
}
}
list.add(entity);
}
}
return list;
} }
/** /**
...@@ -1508,14 +1406,20 @@ public class ExcelUtils<T> { ...@@ -1508,14 +1406,20 @@ public class ExcelUtils<T> {
public List<T> importExcelAllSheet(InputStream is, int titleNum) throws Exception { public List<T> importExcelAllSheet(InputStream is, int titleNum) throws Exception {
this.type = Excel.Type.IMPORT; this.type = Excel.Type.IMPORT;
this.wb = WorkbookFactory.create(is); this.wb = WorkbookFactory.create(is);
List<T> list = new ArrayList<T>(); List<T> resList = new ArrayList<T>();
int sheetCount = wb.getNumberOfSheets(); int sheetCount = wb.getNumberOfSheets();
System.out.println("工作表个数为:" + sheetCount); System.out.println("工作表个数为:" + sheetCount);
IntStream.rangeClosed(0, sheetCount - 1).parallel().forEach(sheetNum -> { IntStream.rangeClosed(0, sheetCount - 1).parallel().forEach(sheetNum -> {
Sheet sheet = wb.getSheetAt(sheetNum); Sheet sheet = wb.getSheetAt(sheetNum);
dealwithSheet(resList, sheet, titleNum);
});
return resList;
}
private void dealwithSheet(List<T> resList, Sheet sheet, int titleNum) {
try {
if (sheet == null) { if (sheet == null) {
throw new ServiceException(sheet.getSheetName() + "为空表!"); throw new IOException(sheet.getSheetName() + "为空表!");
} }
boolean isXSSFWorkbook = !(wb instanceof HSSFWorkbook); boolean isXSSFWorkbook = !(wb instanceof HSSFWorkbook);
Map<String, PictureData> pictures; Map<String, PictureData> pictures;
...@@ -1551,82 +1455,80 @@ public class ExcelUtils<T> { ...@@ -1551,82 +1455,80 @@ public class ExcelUtils<T> {
fieldsMap.put(column, objects); fieldsMap.put(column, objects);
} }
} }
try {
for (int i = titleNum + 1; i <= rows; i++) {
// 从第2行开始取数据,默认第一行是表头.
Row row = sheet.getRow(i);
// 判断当前行是否是空行
if (isRowEmpty(row)) {
continue;
}
T entity = null; for (int i = titleNum + 1; i <= rows; i++) {
for (Map.Entry<Integer, Object[]> entry : fieldsMap.entrySet()) { // 从第2行开始取数据,默认第一行是表头.
Object val = this.getCellValue(row, entry.getKey()); Row row = sheet.getRow(i);
// 判断当前行是否是空行
if (isRowEmpty(row)) {
continue;
}
// 如果不存在实例则新建. T entity = null;
for (Map.Entry<Integer, Object[]> entry : fieldsMap.entrySet()) {
Object val = this.getCellValue(row, entry.getKey());
entity = (entity == null ? clazz.newInstance() : entity); // 如果不存在实例则新建.
// 从map中得到对应列的field. entity = (entity == null ? clazz.newInstance() : entity);
Field field = (Field) entry.getValue()[0];
Excel attr = (Excel) entry.getValue()[1]; // 从map中得到对应列的field.
// 取得类型,并根据对象类型设置值. Field field = (Field) entry.getValue()[0];
Class<?> fieldType = field.getType(); Excel attr = (Excel) entry.getValue()[1];
if (String.class == fieldType) { // 取得类型,并根据对象类型设置值.
String s = Convert.toStr(val); Class<?> fieldType = field.getType();
if (StringUtils.endsWith(s, ".0")) { if (String.class == fieldType) {
val = StringUtils.substringBefore(s, ".0"); String s = Convert.toStr(val);
if (StringUtils.endsWith(s, ".0")) {
val = StringUtils.substringBefore(s, ".0");
} else {
String dateFormat = field.getAnnotation(Excel.class).dateFormat();
if (StringUtils.isNotEmpty(dateFormat)) {
val = parseDateToStr(dateFormat, val);
} else { } else {
String dateFormat = field.getAnnotation(Excel.class).dateFormat(); val = Convert.toStr(val);
if (StringUtils.isNotEmpty(dateFormat)) {
val = parseDateToStr(dateFormat, val);
} else {
val = Convert.toStr(val);
}
}
} else if ((Integer.TYPE == fieldType || Integer.class == fieldType) && StringUtils.isNumeric(Convert.toStr(val))) {
val = Convert.toInt(val);
} else if ((Long.TYPE == fieldType || Long.class == fieldType) && StringUtils.isNumeric(Convert.toStr(val))) {
val = Convert.toLong(val);
} else if (Double.TYPE == fieldType || Double.class == fieldType) {
val = Convert.toDouble(val);
} else if (Float.TYPE == fieldType || Float.class == fieldType) {
val = Convert.toFloat(val);
} else if (BigDecimal.class == fieldType) {
val = Convert.toBigDecimal(val);
} else if (Date.class == fieldType) {
if (val instanceof String) {
val = DateUtils.parseDate(val);
} else if (val instanceof Double) {
val = DateUtil.getJavaDate((Double) val);
} }
} else if (Boolean.TYPE == fieldType || Boolean.class == fieldType) {
val = Convert.toBool(val, false);
} }
if (!ObjectUtils.isEmpty(fieldType)) { } else if ((Integer.TYPE == fieldType || Integer.class == fieldType) && StringUtils.isNumeric(Convert.toStr(val))) {
String propertyName = field.getName(); val = Convert.toInt(val);
} else if ((Long.TYPE == fieldType || Long.class == fieldType) && StringUtils.isNumeric(Convert.toStr(val))) {
if (StringUtils.isNotEmpty(attr.targetAttr())) { val = Convert.toLong(val);
propertyName = field.getName() + "." + attr.targetAttr(); } else if (Double.TYPE == fieldType || Double.class == fieldType) {
} else if (StringUtils.isNotEmpty(attr.readConverterExp())) { val = Convert.toDouble(val);
val = reverseByExp(Convert.toStr(val), attr.readConverterExp(), attr.separator()); } else if (Float.TYPE == fieldType || Float.class == fieldType) {
} else if (StringUtils.isNotEmpty(attr.dictType())) { val = Convert.toFloat(val);
val = reverseDictByExp(Convert.toStr(val), attr.dictType(), attr.separator()); } else if (BigDecimal.class == fieldType) {
} else if (!attr.handler().equals(ExcelHandlerAdapter.class)) { val = Convert.toBigDecimal(val);
val = dataFormatHandlerAdapter(val, attr); } else if (Date.class == fieldType) {
} if (val instanceof String) {
ReflectUtils.invokeSetter(entity, propertyName, val); val = DateUtils.parseDate(val);
} else if (val instanceof Double) {
val = DateUtil.getJavaDate((Double) val);
} }
} else if (Boolean.TYPE == fieldType || Boolean.class == fieldType) {
val = Convert.toBool(val, false);
}
if (!ObjectUtils.isEmpty(fieldType)) {
String propertyName = field.getName();
if (StringUtils.isNotEmpty(attr.targetAttr())) {
propertyName = field.getName() + "." + attr.targetAttr();
} else if (StringUtils.isNotEmpty(attr.readConverterExp())) {
val = reverseByExp(Convert.toStr(val), attr.readConverterExp(), attr.separator());
} else if (StringUtils.isNotEmpty(attr.dictType())) {
val = reverseDictByExp(Convert.toStr(val), attr.dictType(), attr.separator());
} else if (!attr.handler().equals(ExcelHandlerAdapter.class)) {
val = dataFormatHandlerAdapter(val, attr);
}
ReflectUtils.invokeSetter(entity, propertyName, val);
} }
list.add(entity);
} }
} catch (Exception e) { resList.add(entity);
e.printStackTrace();
} }
} }
}); } catch (Exception e) {
return list; e.printStackTrace();
}
} }
} }
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment