@@ -22,6 +22,6 @@ package cn.afterturn.easypoi.excel.entity.enmus; | |||
*/ | |||
public enum CellValueType { | |||
String , Number , Boolean , Date , TElement , Null , None; | |||
String , Number , Boolean , Date , TElement , Null ,Formula, None; | |||
} |
@@ -0,0 +1,59 @@ | |||
package cn.afterturn.easypoi.excel.entity.sax; | |||
/** | |||
* @author by jueyue on 19-6-20. | |||
*/ | |||
public interface SaxConstant { | |||
/** | |||
* Row 表达式 | |||
*/ | |||
public static String ROW = "row"; | |||
/** | |||
* cell 表达式 | |||
*/ | |||
public static String COL = "c"; | |||
/** | |||
* tElement 表达式 | |||
*/ | |||
public static String T_ELEMENT = "t"; | |||
/** | |||
* cell 类型 | |||
*/ | |||
public static String TYPE = "t"; | |||
/** | |||
* style 缩写 | |||
*/ | |||
public static String STYLE = "s"; | |||
/** | |||
* String 缩写 | |||
*/ | |||
public static String STRING = "s"; | |||
/** | |||
* date 缩写 | |||
*/ | |||
public static String DATE = "d"; | |||
/** | |||
* number 缩写 | |||
*/ | |||
public static String NUMBER = "n"; | |||
/** | |||
* 计算表达式 | |||
*/ | |||
public static String FORMULA = "str"; | |||
/** | |||
* Boolean 缩写 | |||
*/ | |||
public static String BOOLEAN = "b"; | |||
/** | |||
* 类型值为“inlineStr”,表示这个单元格的字符串并没有用共享字符串池子的值 | |||
*/ | |||
public static String INLINE_STR = "inlineStr"; | |||
/** | |||
* value 缩写 | |||
*/ | |||
public static String VALUE = "v"; | |||
} |
@@ -3,6 +3,7 @@ | |||
*/ | |||
package cn.afterturn.easypoi.excel.graph.builder; | |||
import java.util.ArrayList; | |||
import java.util.List; | |||
import org.apache.commons.lang3.StringUtils; | |||
@@ -23,8 +24,6 @@ import org.apache.poi.ss.usermodel.charts.ScatterChartData; | |||
import org.apache.poi.ss.usermodel.charts.ValueAxis; | |||
import org.apache.poi.ss.util.CellRangeAddress; | |||
import com.google.common.collect.Lists; | |||
import cn.afterturn.easypoi.excel.graph.constant.ExcelGraphElementType; | |||
import cn.afterturn.easypoi.excel.graph.constant.ExcelGraphType; | |||
import cn.afterturn.easypoi.excel.graph.entity.ExcelGraph; | |||
@@ -97,7 +96,7 @@ public class ExcelChartBuildService | |||
} | |||
List<ExcelGraphElement> valueList=graph.getValueList(); | |||
List<ChartDataSource<Number>> chartValueList=Lists.newArrayList(); | |||
List<ChartDataSource<Number>> chartValueList= new ArrayList<>(); | |||
if(valueList!=null&&valueList.size()>0){ | |||
for(ExcelGraphElement ele:valueList){ | |||
ChartDataSource<Number> source=DataSources.fromNumericCellRange(dataSourceSheet, new CellRangeAddress(ele.getStartRowNum(),ele.getEndRowNum(),ele.getStartColNum(),ele.getEndColNum())); | |||
@@ -3,10 +3,9 @@ | |||
*/ | |||
package cn.afterturn.easypoi.excel.graph.entity; | |||
import java.util.ArrayList; | |||
import java.util.List; | |||
import com.google.common.collect.Lists; | |||
import cn.afterturn.easypoi.excel.graph.constant.ExcelGraphType; | |||
/** | |||
@@ -18,10 +17,10 @@ import cn.afterturn.easypoi.excel.graph.constant.ExcelGraphType; | |||
public class ExcelGraphDefined implements ExcelGraph | |||
{ | |||
private ExcelGraphElement category; | |||
public List<ExcelGraphElement> valueList=Lists.newArrayList(); | |||
public List<ExcelTitleCell> titleCell=Lists.newArrayList(); | |||
public List<ExcelGraphElement> valueList= new ArrayList<>(); | |||
public List<ExcelTitleCell> titleCell= new ArrayList<>(); | |||
private Integer graphType=ExcelGraphType.LINE_CHART; | |||
public List<String> title=Lists.newArrayList(); | |||
public List<String> title= new ArrayList<>(); | |||
@Override | |||
public ExcelGraphElement getCategory() | |||
@@ -106,8 +106,6 @@ public class CellValueService { | |||
} else if (("class java.sql.Timestamp").equals(classFullName)) { | |||
result = new Timestamp(((Date) result).getTime()); | |||
} | |||
} else if (CellType.NUMERIC == cell.getCellType() && DateUtil.isCellDateFormatted(cell)) { | |||
result = DateUtil.getJavaDate(cell.getNumericCellValue()); | |||
} else { | |||
switch (cell.getCellType()) { | |||
case STRING: | |||
@@ -178,7 +178,7 @@ public class ExcelImportService extends ImportBaseService { | |||
Row row = null; | |||
Object object = null; | |||
String picId; | |||
int readRow = 0; | |||
int readRow = 1; | |||
//跳过无效行 | |||
for (int i = 0; i < params.getStartRows(); i++) { | |||
rows.next(); | |||
@@ -214,7 +214,7 @@ public class ExcelImportService extends ImportBaseService { | |||
if (row.getLastCellNum()<0) { | |||
continue; | |||
} | |||
if(isMap) { | |||
if(isMap && object != null) { | |||
((Map) object).put("excelRowNum", row.getRowNum()); | |||
} | |||
errorMsg = new StringBuilder(); | |||
@@ -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,14 +15,15 @@ | |||
*/ | |||
package cn.afterturn.easypoi.excel.imports.sax; | |||
import java.io.InputStream; | |||
import java.util.Iterator; | |||
import java.util.List; | |||
import cn.afterturn.easypoi.excel.entity.ImportParams; | |||
import cn.afterturn.easypoi.excel.imports.sax.parse.ISaxRowRead; | |||
import cn.afterturn.easypoi.excel.imports.sax.parse.SaxRowRead; | |||
import cn.afterturn.easypoi.exception.excel.ExcelImportException; | |||
import cn.afterturn.easypoi.handler.inter.IReadHandler; | |||
import org.apache.poi.openxml4j.opc.OPCPackage; | |||
import org.apache.poi.xssf.eventusermodel.XSSFReader; | |||
import org.apache.poi.xssf.model.SharedStringsTable; | |||
import org.apache.poi.xssf.model.StylesTable; | |||
import org.slf4j.Logger; | |||
import org.slf4j.LoggerFactory; | |||
import org.xml.sax.ContentHandler; | |||
@@ -31,15 +32,15 @@ import org.xml.sax.SAXException; | |||
import org.xml.sax.XMLReader; | |||
import org.xml.sax.helpers.XMLReaderFactory; | |||
import cn.afterturn.easypoi.excel.entity.ImportParams; | |||
import cn.afterturn.easypoi.excel.imports.sax.parse.ISaxRowRead; | |||
import cn.afterturn.easypoi.excel.imports.sax.parse.SaxRowRead; | |||
import cn.afterturn.easypoi.exception.excel.ExcelImportException; | |||
import java.io.InputStream; | |||
import java.util.Iterator; | |||
import java.util.List; | |||
/** | |||
* 基于SAX Excel大数据读取,读取Excel 07版本,不支持图片读取 | |||
* | |||
* @author JueYue | |||
* 2014年12月29日 下午9:41:38 | |||
* 2014年12月29日 下午9:41:38 | |||
* @version 1.0 | |||
*/ | |||
@SuppressWarnings("rawtypes") | |||
@@ -61,20 +62,26 @@ public class SaxReadExcel { | |||
private <T> List<T> readExcel(OPCPackage opcPackage, Class<?> pojoClass, ImportParams params, | |||
ISaxRowRead rowRead, IReadHandler handler) { | |||
try { | |||
XSSFReader xssfReader = new XSSFReader(opcPackage); | |||
SharedStringsTable sst = xssfReader.getSharedStringsTable(); | |||
XSSFReader xssfReader = new XSSFReader(opcPackage); | |||
SharedStringsTable sharedStringsTable = xssfReader.getSharedStringsTable(); | |||
StylesTable stylesTable = xssfReader.getStylesTable(); | |||
if (rowRead == null) { | |||
rowRead = new SaxRowRead(pojoClass, params, handler); | |||
} | |||
XMLReader parser = fetchSheetParser(sst, rowRead); | |||
Iterator<InputStream> sheets = xssfReader.getSheetsData(); | |||
int sheetIndex = 0; | |||
while (sheets.hasNext() && sheetIndex < params.getSheetNum()) { | |||
XMLReader parser = fetchSheetParser(sharedStringsTable, stylesTable, rowRead); | |||
Iterator<InputStream> sheets = xssfReader.getSheetsData(); | |||
int sheetIndex = 0; | |||
while (sheets.hasNext() && sheetIndex < params.getSheetNum() + params.getStartSheetIndex()) { | |||
if (sheetIndex < params.getStartSheetIndex()) { | |||
sheets.next(); | |||
} else { | |||
InputStream sheet = sheets.next(); | |||
InputSource sheetSource = new InputSource(sheet); | |||
parser.parse(sheetSource); | |||
sheet.close(); | |||
} | |||
sheetIndex++; | |||
InputStream sheet = sheets.next(); | |||
InputSource sheetSource = new InputSource(sheet); | |||
parser.parse(sheetSource); | |||
sheet.close(); | |||
} | |||
if (handler != null) { | |||
handler.doAfterAll(); | |||
@@ -86,10 +93,10 @@ public class SaxReadExcel { | |||
} | |||
} | |||
private XMLReader fetchSheetParser(SharedStringsTable sst, | |||
private XMLReader fetchSheetParser(SharedStringsTable sharedStringsTable, StylesTable stylesTable, | |||
ISaxRowRead rowRead) throws SAXException { | |||
XMLReader parser = XMLReaderFactory.createXMLReader("org.apache.xerces.parsers.SAXParser"); | |||
ContentHandler handler = new SheetHandler(sst, rowRead); | |||
XMLReader parser = XMLReaderFactory.createXMLReader("org.apache.xerces.parsers.SAXParser"); | |||
ContentHandler handler = new SheetHandler(sharedStringsTable, stylesTable, rowRead); | |||
parser.setContentHandler(handler); | |||
return parser; | |||
} | |||
@@ -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,48 +15,50 @@ | |||
*/ | |||
package cn.afterturn.easypoi.excel.imports.sax; | |||
import java.math.BigDecimal; | |||
import java.util.Date; | |||
import java.util.List; | |||
import cn.afterturn.easypoi.excel.entity.enmus.CellValueType; | |||
import cn.afterturn.easypoi.excel.entity.sax.SaxReadCellEntity; | |||
import cn.afterturn.easypoi.excel.imports.sax.parse.ISaxRowRead; | |||
import org.apache.commons.lang3.StringUtils; | |||
import org.apache.poi.hssf.usermodel.HSSFDateUtil; | |||
import org.apache.poi.xssf.model.SharedStringsTable; | |||
import org.apache.poi.xssf.usermodel.XSSFRichTextString; | |||
import org.apache.poi.xssf.model.StylesTable; | |||
import org.xml.sax.Attributes; | |||
import org.xml.sax.SAXException; | |||
import org.xml.sax.helpers.DefaultHandler; | |||
import com.google.common.collect.Lists; | |||
import java.math.BigDecimal; | |||
import java.util.ArrayList; | |||
import java.util.Date; | |||
import java.util.List; | |||
import cn.afterturn.easypoi.excel.entity.enmus.CellValueType; | |||
import cn.afterturn.easypoi.excel.entity.sax.SaxReadCellEntity; | |||
import cn.afterturn.easypoi.excel.imports.sax.parse.ISaxRowRead; | |||
import static cn.afterturn.easypoi.excel.entity.sax.SaxConstant.*; | |||
/** | |||
* 回调接口 | |||
* | |||
* @author JueYue | |||
* 2014年12月29日 下午9:50:09 | |||
* 2014年12月29日 下午9:50:09 | |||
*/ | |||
public class SheetHandler extends DefaultHandler { | |||
private SharedStringsTable sst; | |||
private String lastContents; | |||
private SharedStringsTable sharedStringsTable; | |||
private StylesTable stylesTable; | |||
private String lastContents; | |||
//当前行 | |||
private int curRow = 0; | |||
//当前列 | |||
private int curCol = 0; | |||
/** 当前行**/ | |||
private int curRow = 0; | |||
/**当前列 **/ | |||
private int curCol = 0; | |||
private CellValueType type; | |||
private CellValueType type; | |||
private ISaxRowRead read; | |||
private ISaxRowRead read; | |||
//存储行记录的容器 | |||
private List<SaxReadCellEntity> rowlist = Lists.newArrayList(); | |||
private List<SaxReadCellEntity> rowList = new ArrayList<>(); | |||
public SheetHandler(SharedStringsTable sst, ISaxRowRead rowRead) { | |||
this.sst = sst; | |||
public SheetHandler(SharedStringsTable sharedStringsTable, StylesTable stylesTable, ISaxRowRead rowRead) { | |||
this.sharedStringsTable = sharedStringsTable; | |||
this.stylesTable = stylesTable; | |||
this.read = rowRead; | |||
} | |||
@@ -65,22 +67,50 @@ public class SheetHandler extends DefaultHandler { | |||
Attributes attributes) throws SAXException { | |||
// 置空 | |||
lastContents = ""; | |||
// c => 单元格 | |||
if ("c".equals(name)) { | |||
// 如果下一个元素是 SST 的索引,则将nextIsString标记为true | |||
String cellType = attributes.getValue("t"); | |||
if ("s".equals(cellType)) { | |||
if (COL.equals(name)) { | |||
String cellType = attributes.getValue(TYPE); | |||
if (STRING.equals(cellType)) { | |||
type = CellValueType.String; | |||
return; | |||
} | |||
//日期格式 | |||
cellType = attributes.getValue("s"); | |||
if ("1".equals(cellType)) { | |||
if (BOOLEAN.equals(cellType)) { | |||
type = CellValueType.Boolean; | |||
return; | |||
} | |||
if (DATE.equals(cellType)) { | |||
type = CellValueType.Date; | |||
} else if ("2".equals(cellType)) { | |||
return; | |||
} | |||
if (INLINE_STR.equals(cellType)) { | |||
type = CellValueType.String; | |||
return; | |||
} | |||
if (FORMULA.equals(cellType)) { | |||
type = CellValueType.Formula; | |||
return; | |||
} | |||
if (NUMBER.equals(cellType)) { | |||
type = CellValueType.Number; | |||
return; | |||
} | |||
} else if ("t".equals(name)) {//当元素为t时 | |||
try { | |||
short nfId = (short) stylesTable.getCellXfAt(Integer.parseInt(attributes.getValue(STYLE))).getNumFmtId(); | |||
String numberFormat = stylesTable.getNumberFormats().get(nfId).toUpperCase(); | |||
if (StringUtils.isNotEmpty(numberFormat)) { | |||
if (numberFormat.contains("Y") || numberFormat.contains("M") || numberFormat.contains("D") | |||
|| numberFormat.contains("H") || numberFormat.contains("S") || numberFormat.contains("年") | |||
|| numberFormat.contains("月") || numberFormat.contains("日") || numberFormat.contains("时") | |||
|| numberFormat.contains("分") || numberFormat.contains("秒")) { | |||
type = CellValueType.Date; | |||
return; | |||
} | |||
} | |||
} catch (NumberFormatException e) { | |||
} | |||
// 没别的了就是数字了 | |||
type = CellValueType.Number; | |||
} else if (T_ELEMENT.equals(name)) { | |||
type = CellValueType.TElement; | |||
} | |||
@@ -94,7 +124,7 @@ public class SheetHandler extends DefaultHandler { | |||
if (CellValueType.String.equals(type)) { | |||
try { | |||
int idx = Integer.parseInt(lastContents); | |||
lastContents = new XSSFRichTextString(sst.getEntryAt(idx)).toString(); | |||
lastContents = sharedStringsTable.getItemAt(idx).getString(); | |||
} catch (Exception e) { | |||
} | |||
@@ -102,36 +132,36 @@ public class SheetHandler extends DefaultHandler { | |||
//t元素也包含字符串 | |||
if (CellValueType.TElement.equals(type)) { | |||
String value = lastContents.trim(); | |||
rowlist.add(curCol, new SaxReadCellEntity(CellValueType.String, value)); | |||
rowList.add(curCol, new SaxReadCellEntity(CellValueType.String, value)); | |||
curCol++; | |||
type = CellValueType.None; | |||
// v => 单元格的值,如果单元格是字符串则v标签的值为该字符串在SST中的索引 | |||
// 将单元格内容加入rowlist中,在这之前先去掉字符串前后的空白符 | |||
} else if ("v".equals(name)) { | |||
} else if (VALUE.equals(name)) { | |||
String value = lastContents.trim(); | |||
value = "".equals(value) ? " " : value; | |||
if (CellValueType.Date.equals(type)) { | |||
Date date = HSSFDateUtil.getJavaDate(Double.valueOf(value)); | |||
rowlist.add(curCol, new SaxReadCellEntity(CellValueType.Date, date)); | |||
rowList.add(curCol, new SaxReadCellEntity(CellValueType.Date, date)); | |||
} else if (CellValueType.Number.equals(type)) { | |||
BigDecimal bd = new BigDecimal(value); | |||
rowlist.add(curCol, new SaxReadCellEntity(CellValueType.Number, bd)); | |||
rowList.add(curCol, new SaxReadCellEntity(CellValueType.Number, bd)); | |||
} else if (CellValueType.String.equals(type)) { | |||
rowlist.add(curCol, new SaxReadCellEntity(CellValueType.String, value)); | |||
rowList.add(curCol, new SaxReadCellEntity(CellValueType.String, value)); | |||
} | |||
curCol++; | |||
//如果标签名称为 row ,这说明已到行尾,调用 optRows() 方法 | |||
} else if("c".equals(name) && StringUtils.isEmpty(lastContents)){ | |||
rowlist.add(curCol,new SaxReadCellEntity(CellValueType.String,"")); | |||
} else if (COL.equals(name) && StringUtils.isEmpty(lastContents)) { | |||
rowList.add(curCol, new SaxReadCellEntity(CellValueType.String, "")); | |||
curCol++; | |||
} else if ("row".equals(name)) { | |||
read.parse(curRow, rowlist); | |||
rowlist.clear(); | |||
} else if (ROW.equals(name)) { | |||
read.parse(curRow, rowList); | |||
rowList.clear(); | |||
curRow++; | |||
curCol = 0; | |||
} | |||
} | |||
} | |||
@Override | |||
public void characters(char[] ch, int start, int length) throws SAXException { | |||
@@ -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,20 +15,6 @@ | |||
*/ | |||
package cn.afterturn.easypoi.excel.imports.sax.parse; | |||
import java.lang.reflect.Field; | |||
import java.util.ArrayList; | |||
import java.util.Collection; | |||
import java.util.HashMap; | |||
import java.util.List; | |||
import java.util.Map; | |||
import cn.afterturn.easypoi.handler.inter.IReadHandler; | |||
import org.apache.commons.lang3.StringUtils; | |||
import org.slf4j.Logger; | |||
import org.slf4j.LoggerFactory; | |||
import com.google.common.collect.Lists; | |||
import cn.afterturn.easypoi.excel.annotation.ExcelTarget; | |||
import cn.afterturn.easypoi.excel.entity.ImportParams; | |||
import cn.afterturn.easypoi.excel.entity.params.ExcelCollectionParams; | |||
@@ -37,58 +23,77 @@ import cn.afterturn.easypoi.excel.entity.sax.SaxReadCellEntity; | |||
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.handler.inter.IReadHandler; | |||
import cn.afterturn.easypoi.util.PoiPublicUtil; | |||
import cn.afterturn.easypoi.util.PoiReflectorUtil; | |||
import com.google.common.collect.Lists; | |||
import org.apache.commons.lang3.StringUtils; | |||
import org.slf4j.Logger; | |||
import org.slf4j.LoggerFactory; | |||
import java.lang.reflect.Field; | |||
import java.util.*; | |||
/** | |||
* 当行读取数据 | |||
* | |||
* @author JueYue | |||
* 2015年1月1日 下午7:59:39 | |||
* 2015年1月1日 下午7:59:39 | |||
*/ | |||
@SuppressWarnings({ "rawtypes", "unchecked" }) | |||
@SuppressWarnings({"rawtypes", "unchecked"}) | |||
public class SaxRowRead extends ImportBaseService implements ISaxRowRead { | |||
private static final Logger LOGGER = LoggerFactory | |||
.getLogger(SaxRowRead.class); | |||
/** 需要返回的数据 **/ | |||
private List list; | |||
/** 导出的对象 **/ | |||
private Class<?> pojoClass; | |||
/** 导入参数 **/ | |||
private ImportParams params; | |||
/** 列表头对应关系 **/ | |||
private Map<Integer, String> titlemap = new HashMap<Integer, String>(); | |||
/** 当前的对象**/ | |||
private Object object = null; | |||
private static final Logger LOGGER = LoggerFactory | |||
.getLogger(SaxRowRead.class); | |||
/** | |||
* 需要返回的数据 | |||
**/ | |||
private List list; | |||
/** | |||
* 导出的对象 | |||
**/ | |||
private Class<?> pojoClass; | |||
/** | |||
* 导入参数 | |||
**/ | |||
private ImportParams params; | |||
/** | |||
* 列表头对应关系 | |||
**/ | |||
private Map<Integer, String> titlemap = new HashMap<Integer, String>(); | |||
/** | |||
* 当前的对象 | |||
**/ | |||
private Object object = null; | |||
private Map<String, ExcelImportEntity> excelParams = new HashMap<String, ExcelImportEntity>(); | |||
private Map<String, ExcelImportEntity> excelParams = new HashMap<String, ExcelImportEntity>(); | |||
private List<ExcelCollectionParams> excelCollection = new ArrayList<ExcelCollectionParams>(); | |||
private List<ExcelCollectionParams> excelCollection = new ArrayList<ExcelCollectionParams>(); | |||
private String targetId; | |||
private String targetId; | |||
private CellValueService cellValueServer; | |||
private IReadHandler hanlder; | |||
private IReadHandler handler; | |||
public SaxRowRead(Class<?> pojoClass, ImportParams params, IReadHandler hanlder) { | |||
public SaxRowRead(Class<?> pojoClass, ImportParams params, IReadHandler handler) { | |||
list = Lists.newArrayList(); | |||
this.params = params; | |||
this.pojoClass = pojoClass; | |||
cellValueServer = new CellValueService(); | |||
this.hanlder = hanlder; | |||
this.handler = handler; | |||
initParams(pojoClass, params); | |||
} | |||
private void initParams(Class<?> pojoClass, ImportParams params) { | |||
try { | |||
Field[] fileds = PoiPublicUtil.getClassFields(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); | |||
getAllExcelField(targetId, fileds, excelParams, excelCollection, pojoClass, null, null); | |||
} catch (Exception e) { | |||
LOGGER.error(e.getMessage(), e); | |||
throw new ExcelImportException(e.getMessage()); | |||
@@ -125,33 +130,38 @@ public class SaxRowRead extends ImportBaseService implements ISaxRowRead { | |||
/** | |||
* 集合元素处理 | |||
* | |||
* @param datas | |||
*/ | |||
private void addListData(List<SaxReadCellEntity> datas) throws Exception { | |||
// 判断是集合元素还是不是集合元素,如果是就继续加入这个集合,不是就创建新的对象 | |||
if (params.getKeyIndex() != null && (datas.get(params.getKeyIndex()) == null | |||
|| StringUtils.isEmpty(String.valueOf(datas.get(params.getKeyIndex()).getValue()))) | |||
&& object != null) { | |||
|| StringUtils.isEmpty(String.valueOf(datas.get(params.getKeyIndex()).getValue()))) | |||
&& object != null) { | |||
for (ExcelCollectionParams param : excelCollection) { | |||
addListContinue(object, param, datas, titlemap, targetId, params); | |||
} | |||
} else { | |||
object = PoiPublicUtil.createObject(pojoClass, targetId); | |||
if (Map.class.equals(pojoClass)) { | |||
object = new HashMap<>(); | |||
} else { | |||
object = PoiPublicUtil.createObject(pojoClass, targetId); | |||
} | |||
SaxReadCellEntity entity; | |||
for (int i = 0, le = datas.size(); i < le; i++) { | |||
entity = datas.get(i); | |||
String titleString = (String) titlemap.get(i); | |||
if (excelParams.containsKey(titleString)) { | |||
if (excelParams.containsKey(titleString) || Map.class.equals(pojoClass)) { | |||
saveFieldValue(params, object, entity, excelParams, titleString); | |||
} | |||
} | |||
if (object != null && hanlder != null) { | |||
hanlder.handler(object); | |||
if (object != null && handler != null) { | |||
handler.handler(object); | |||
} | |||
for (ExcelCollectionParams param : excelCollection) { | |||
addListContinue(object, param, datas, titlemap, targetId, params); | |||
} | |||
if (hanlder == null) { | |||
if (handler == null) { | |||
list.add(object); | |||
} | |||
} | |||
@@ -160,6 +170,7 @@ public class SaxRowRead extends ImportBaseService implements ISaxRowRead { | |||
/** | |||
* 向List里面继续添加元素 | |||
* | |||
* @param object | |||
* @param param | |||
* @param datas | |||
@@ -172,9 +183,9 @@ public class SaxRowRead extends ImportBaseService implements ISaxRowRead { | |||
List<SaxReadCellEntity> datas, Map<Integer, String> titlemap, | |||
String targetId, ImportParams params) throws Exception { | |||
Collection collection = (Collection) PoiReflectorUtil.fromCache(pojoClass).getValue(object, | |||
param.getName()); | |||
Object entity = PoiPublicUtil.createObject(param.getType(), targetId); | |||
boolean isUsed = false;// 是否需要加上这个对象 | |||
param.getName()); | |||
Object entity = PoiPublicUtil.createObject(param.getType(), targetId); | |||
boolean isUsed = false; | |||
for (int i = 0; i < datas.size(); i++) { | |||
String titleString = (String) titlemap.get(i); | |||
if (param.getExcelParams().containsKey(titleString)) { | |||
@@ -189,23 +200,29 @@ public class SaxRowRead extends ImportBaseService implements ISaxRowRead { | |||
/** | |||
* 设置值 | |||
* | |||
* @param params | |||
* @param object | |||
* @param entity | |||
* @param excelParams | |||
* @param titleString | |||
* @throws Exception | |||
* @throws Exception | |||
*/ | |||
private void saveFieldValue(ImportParams params, Object object, SaxReadCellEntity entity, | |||
Map<String, ExcelImportEntity> excelParams, | |||
String titleString) throws Exception { | |||
Object value = cellValueServer.getValue(params.getDataHandler(), object, entity, | |||
excelParams, titleString); | |||
setValues(excelParams.get(titleString), object, value); | |||
if (Map.class.equals(pojoClass)) { | |||
((Map)object).put(titleString,entity.getValue()); | |||
} else { | |||
Object value = cellValueServer.getValue(params.getDataHandler(), object, entity, | |||
excelParams, titleString); | |||
setValues(excelParams.get(titleString), object, value); | |||
} | |||
} | |||
/** | |||
* put 表头数据 | |||
* | |||
* @param datas | |||
*/ | |||
private void addHeadData(List<SaxReadCellEntity> datas) { | |||
@@ -1,5 +1,6 @@ | |||
package cn.afterturn.easypoi.util; | |||
import org.apache.poi.hssf.usermodel.HSSFWorkbook; | |||
import org.apache.poi.ss.usermodel.*; | |||
import java.util.Date; | |||
@@ -23,10 +24,19 @@ public class PoiExcelTempUtil { | |||
* @param endRow | |||
*/ | |||
public static void reset(Sheet sheet, int startRow, int endRow) { | |||
if (sheet.getWorkbook() instanceof HSSFWorkbook) { | |||
return; | |||
} | |||
for (int i = startRow; i <= endRow; i++) { | |||
Row row = sheet.getRow(i); | |||
Row row = sheet.getRow(i); | |||
if (row == null) { | |||
continue; | |||
} | |||
int cellNum = row.getLastCellNum(); | |||
for (int j = 0; j < cellNum; j++) { | |||
if (row.getCell(j) == null) { | |||
continue; | |||
} | |||
Map<String, Object> map = copyCell(row.getCell(j)); | |||
row.removeCell(row.getCell(j)); | |||
Cell cell = row.createCell(j); | |||