package com.cabletech.common.excel.imports;
import java.io.FileInputStream;
import java.io.InputStream;
import java.util.List;
import javax.annotation.Resource;
import org.apache.log4j.Logger;
import org.apache.poi.hssf.usermodel.HSSFCell;
import org.apache.poi.hssf.usermodel.HSSFRow;
import org.apache.poi.hssf.usermodel.HSSFSheet;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import org.dom4j.Element;
import com.cabletech.common.excel.ExcelUtils;
import com.cabletech.common.util.ReflectionUtils;
import com.cabletech.common.xmlparse.ParseXmlTools;
/**
* Excel导入公共功能抽象类
*
* @author 杨隽 2012-02-13 创建
*
*/
public abstract class ExcelImport {
private Logger logger = Logger.getLogger("ExcelImport");
// XML配置文件的解析工具业务服务
@Resource(name = "parseXmlTools")
private ParseXmlTools parseXmlTools;
// XML配置文件中<root>节点
private Element root;
// XML配置文件中<column>元素列表
@SuppressWarnings("rawtypes")
private List elements;
// EXCEL工作表对象
private HSSFWorkbook wb;
// EXCEL工作表中数据表对象
private HSSFSheet sheet;
/**
* 根据要导入的Excel数据文件进行数据导入并完成数据校验:
*
* @param filePath
* String 要导入的Excel数据文件路径
* @throws Exception
*/
public void importExcelData(String filePath) {
sheet = getSheet(filePath);
root = parseXmlTools.getImportXmlElement(getImportXmlId());
elements = root.elements(ParseXmlTools.COLUMN_ELEMENT_KEY);
int lastRow = sheet.getPhysicalNumberOfRows();
int size = lastRow - getImportDataRow();
if (size <= 0) {
return;
}
try {
for (int i = getImportDataRow(); i < lastRow; i++) {
Object oneCellTemp = getOneCellImportData(i);
processData(oneCellTemp);
}
} catch (Exception ex) {
logger.error("导入数据信息出错:", ex);
}
}
/**
* 读取某一个单元行的对象数据信息
*
* @param rowIndex
* int 单元格导入行索引
* @return Object 单元行的对象数据信息
*/
@SuppressWarnings({ "rawtypes", "deprecation" })
public Object getOneCellImportData(int rowIndex) throws Exception {
HSSFRow row;
HSSFCell cell;
String cellValue;
row = sheet.getRow(rowIndex);
String className = (String) root.attributeValue(ParseXmlTools.ENTITY_ATTRIBUTE_KEY);
Class clazz = Class.forName(className);
Object oneCellTemp = clazz.newInstance();
for (int j = 0; j < elements.size(); j++) {
Element element = (Element) elements.get(j);
String colIndex = element.attributeValue(ParseXmlTools.COL_INDEX_ATTRIBUTE_KEY);
String propertyName = element.attributeValue(ParseXmlTools.PROPERTY_NAME_ATTRIBUTE_KEY);
cell = row.getCell(Short.parseShort(colIndex));
if (ExcelUtils.isMergedRegion(sheet, cell)) {
cellValue = ExcelUtils.getMergedRegionValue(sheet, cell);
} else {
cellValue = ExcelUtils.getCellStringValue(cell, wb);
}
ReflectionUtils.invokeSetterMethod(oneCellTemp, propertyName,cellValue);
}
return oneCellTemp;
}
/**
* 进行后期的数据处理
*
* @param oneCellTemp
* Object 导入Excel的数据
*/
public abstract void processData(Object oneCellTemp);
/**
* 获取数据的开始行行索引
*
* @return int 开始行行索引
*/
public abstract int getImportDataRow();
/**
* 设置后期数据存放的List列表
*
* @param lists
* List... 后期数据存放的List列表
*/
@SuppressWarnings("rawtypes")
public abstract void setLists(List... lists);
/**
* 获取导入模板的Xml配置文件的根节点id
*
* @return
*/
public abstract String getImportXmlId();
/**
* 读取要导入的Excel数据文件的数据表数据
*
* @param filePath
* String 要导入的Excel数据文件
* @return HSSFSheet 要导入的Excel数据文件的数据表数据
*/
private HSSFSheet getSheet(String filePath) {
wb = new HSSFWorkbook();
try {
InputStream in = new FileInputStream(filePath);
wb = new HSSFWorkbook(in);
} catch (Exception e) {
logger.error("获取导入数据文件出错:", e);
}
HSSFSheet sheet = wb.getSheetAt(0);
return sheet;
}
}