package com.icss.mdm.maintain.data;
import java.io.BufferedReader;
import java.io.FileInputStream;
import java.io.FileReader;
import java.io.IOException;
import java.io.InputStream;
import java.lang.reflect.Field;
import java.sql.ResultSet;
import java.sql.ResultSetMetaData;
import java.sql.Statement;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import org.apache.commons.beanutils.BeanUtils;
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.apache.poi.poifs.filesystem.POIFSFileSystem;
import com.icss.mdm.vo.MdmCodepropVO;
import com.icss.pangu.db.DBBeanBase;
import com.icss.pangu.logging.Log;
import com.icss.pangu.logging.LogFactory;
public class ReadExcel {
private static Log log = LogFactory.getLog(ReadTxt.class);
public static Object[] getExcelList(String id, DBBeanBase dbBase, String roleCode,String status, String ignore, Object[] addTag,String filePath,String personName) {
int count = 1;
int propLength = 0;
String codeID = "";
String code = "";
String value = "";
String s1 = null;
FileReader reader = null;
FileReader reader1 = null;
BufferedReader br = null;
BufferedReader br1 = null;
List list = new ArrayList();
String[] columnValue = null;
String[] propValue = null;
String[] codeValue = new String[50];
int row = 0 ;
// 记录应该添加几次
int timer = 0 ;
// 记录是第几次执行添加
int timers = 0;
// 记录如果不能被整除的时候最后一次是多少条数据
int timecount = 0 ;
try {
InputStream is = new FileInputStream(filePath);
HSSFWorkbook wb = new HSSFWorkbook(new POIFSFileSystem(is));
HSSFSheet sheet = wb.getSheetAt(0);
int firstRowNum = sheet.getFirstRowNum();
int lastRowNum = sheet.getLastRowNum();
// 取得文件行数
row = lastRowNum + 1;
if((row - 3)% ErrorTypes.NUM_COUNT == 0)
timer = (row - 3) / ErrorTypes.NUM_COUNT;
else{
timer = (row - 3) / ErrorTypes.NUM_COUNT + 1;
timecount = (row - 3 )% ErrorTypes.NUM_COUNT;
}
// 读取文件
HSSFCell cell = null;
for ( int rowIndex = firstRowNum; rowIndex <= lastRowNum; rowIndex++ ) {
Map map = null;
HSSFRow currentRow = sheet.getRow(rowIndex);
// 第一行放表名
if (rowIndex == 0) {
cell = currentRow.getCell((short)0);
codeID = cell.getStringCellValue();
if (!codeID.equals(id)) {
((Map)addTag[2]).put("1",ErrorTypes.ID_ERROR);
return addTag;
}
//第二行放属性中文名称
} else if (rowIndex == 1) {
//第三行放属性
} else if (rowIndex == 2) {
columnValue = new String[sheet.getRow(rowIndex).getPhysicalNumberOfCells()];
for (int i = 0; i < sheet.getRow(rowIndex).getPhysicalNumberOfCells(); i++) {
if ("".equals(currentRow.getCell((short)i))) {
((Map)addTag[2]).put("2",ErrorTypes.PROP_NULL);
return addTag;
} else {
columnValue[i] = (currentRow.getCell((short)i).getStringCellValue());
}
}
//TODO 字段名转换为属性名
propValue = getQueryList(id,dbBase,columnValue,sheet.getRow(rowIndex).getPhysicalNumberOfCells());
//TODO
propLength = propValue.length;
// 验证属性
if (!JudgeValidate.judgeProp(propValue)) {
((Map) addTag[2]).put("2", ErrorTypes.PROP_NAME_ERROR);
return addTag;
}
} else {
codeValue = new String[sheet.getRow(rowIndex).getPhysicalNumberOfCells()];
for (int i = 0; i < sheet.getRow(rowIndex).getPhysicalNumberOfCells(); i++) {
try{
codeValue[i] = currentRow.getCell((short)i).getStringCellValue();
}catch(Exception e){
codeValue[i] = currentRow.getCell((short)i).getNumericCellValue()+"";
}
}
// 属性与相应的值不对应
if (propLength < codeValue.length) {
((Map)addTag[2]).put((new Integer(count)).toString(),ErrorTypes.VALUE_LENGTH_MATCH);
if(ignore.equals("0")){
continue;
}else{
return addTag;
}
}
map = new HashMap();
for (int i = 0; i < propValue.length; i++) {
// 把属性对应的value放到map中
if (map.get(propValue[i]) == null) {
map.put(propValue[i], codeValue[i].trim());
} else {
((Map)addTag[2]).put("2",ErrorTypes.PROP_REPEAT);
return addTag;
}
}
list.add(map);
}
if((count - 3) % ErrorTypes.NUM_COUNT != 0 && count != 3){
addTag = JudgeValidate.judgeValue(list, dbBase, codeID, roleCode, status, ignore, addTag,personName,"xls",timers);
list.removeAll(list);
timers++;
// 如果本次执行出错,且不忽略错误就直接返回
if(((Map)addTag[2]).size() != 0 && "1".equals(ignore))
return addTag;
}else if((count - 3) % ErrorTypes.NUM_COUNT != timecount && (timers + 1 == timer)){
//timer记录应该添加几次 timers = 0 记录是第几次执行添加timecount 记录如果不能被整除的时候最后一次是多少条数据
addTag = JudgeValidate.judgeValue(list, dbBase, codeID, roleCode, status, ignore, addTag,personName,"xls",timers);
list.removeAll(list);
}
count++;
}
return addTag;
} catch (Exception e) {
log.error(e);
return addTag;
}finally{
try {
if(br!=null)
br.close();
if(br1!=null)
br1.close();
if(reader!=null)
reader.close();
if(reader1!=null)
reader1.close();
} catch (IOException e) {
log.error(e);
}
}
}
/**
* 字段名称转化为属性名称
* @param id
* @param dbBase
* @param columnValue
* @param maxCols
* @return
* @throws Exception
*/
public static String[] getQueryList(String id, DBBeanBase dbBase, String[] columnValue,int maxCols) throws Exception {
List list = new ArrayList();
String[] aStr = new String[columnValue.length];
Statement state = dbBase.getPrivateCon().createStatement();
// ResultSet rs = null;
String selectProp = "";
selectProp ="SELECT COL_SEQUENCE,COL_NAME FROM MDM_CODEPROP WHERE CODE_ID = '" + id.trim() + "'";
/*for (int i = 0; i < columnValue.length; i++) {
selectProp ="SELECT COL_SEQUENCE FROM MDM_CODEPROP WHERE CODE_ID = '" + id.trim() + "' AND COL_NAME = '" + columnValue[i] + "'";
rs = state.executeQuery(selectProp);
}*/
ResultSet rs = state.executeQuery(selectProp);
list = populate(rs,MdmCodepropVO.class);
//用columnValue匹配结果集COL_NAME,取得COL_SEQUENCE
//转换成PropXX(COL_SEQUENCE<10? "Prop0"+String.valueof(COL_SEQUENCE):"Prop"+String.valueof(COL_SEQUENCE))
//转换结果以String[]方式返回
MdmCodepropVO mdmCodeprop = null;
for (int m = 0; m < columnValue.length; m++) {
for (int i = 0; i < list.size(); i++) {
mdmCodeprop = new MdmCodepropVO();
mdmCodeprop = (MdmCodepropVO)list.get(i);
if (columnValue[m].equalsIgnoreCase(mdmCodeprop.getColName())) {
if (mdmCodeprop.getColSequence() < 10){
aStr[m] = "Prop0" + mdmCodeprop.getColSequence().toString();
} else {
aStr[m] = "Prop" + mdmCodeprop.getColSequence().toString();
}
}
}
}
if(log.isDebugEnabled()){
log.debug("selectPropSql:"+selectProp);
}
return aStr;
}
/***********把resultset结果集转化为list集合************/
public static List populate(ResultSet rs, Class clazz) throws Exception {
ResultSetMetaData metaData = rs.getMetaData(); // 取得结果集的元元素
int colCount = metaData.getColumnCount(); // 取得所有列的个数
List ret = new ArrayList(); // 存放返回结果的容器
Field[] fields = clazz.getDeclaredFields(); // 取得业务对象的属性
while (rs.next()) {
Object newInstance = clazz.newInstance(); // 构造业务对象实例
// 将结果集中每一条记录,每一个字段取出,根据命名规则,对对应的业务对象的属性进行赋值
for (int i = 1; i <= colCount; i++) { // 对于该记录的每一列
try {
Object value = rs.getObject(i);
for (int j = 0; j < fields.length; j++) {
Field f = fields[j];
if (f.getName().equalsIgnoreCase(metaData.getColumnName(i).replaceAll("_", ""))) {
BeanUtils.copyProperty(newInstance, f.getName(), value);
}
}
} catch (Exception e) {
// TODO: handle exception
e.printStackTrace();
}
}
ret.add(newInstance);
}
return ret;
}
}