java基于xml配置的通用excel单表数据导入组件(四、DAO主处理类)
package XXXXX.manage.importexcel; import java.beans.IntrospectionException;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.UnsupportedEncodingException;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.sql.Connection;
import java.sql.SQLException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
import java.util.logging.Logger; import org.apache.commons.betwixt.io.BeanReader;
import org.apache.poi.hssf.usermodel.HSSFDateUtil;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import org.apache.poi.ss.usermodel.Cell;
import org.apache.poi.ss.usermodel.Sheet;
import org.apache.poi.ss.usermodel.Workbook;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;
import org.xml.sax.SAXException; import XXXXX.cache.UserSession;
import xxxxxxxx.manage.importerror.BN_ImportError;
import xxxxxxxx.manage.importerror.DAO_ImportError;
import xxxxxxxx.supp.BN_Row;
import xxxxxxxx.supp.DAORunner;
import xxxxxxxx.supp.TransactionHandler;
import xxxxxxxx.util.ObjectUtil;
import xxxxxxxx.util.PathUtil;
import xxxxxxxx.util.StringUtil; public class DAO_ImportExcel { private String tableImport; //导入的临时表名
private String tableTarget; //导入的目标表名
private File excelFile; //excel数据文件
private int rows; //总行数
private int columns; //总列数
private Map<String, BN_Column> columnMap = new HashMap();// 列序号、字段定义映射
private String[] columnName; // excel列名 private BN_ImportExcel xmlBean;
private Map<String, BN_Column> excelColumn; // 列名称、字段定义映射
private Map<String, BN_Column> systemColumn;// 系统内置字段定义 Map<String, Object> resultMap = new HashMap<String, Object>();// 定义返回结果map private static Logger logger = Logger.getLogger(DAO_ImportExcel.class
.getName()); public DAO_ImportExcel(String tableTarget, File excelFile) {
this.tableTarget = tableTarget;
this.tableImport = tableTarget + "_import"; //导入临时表,固定以"_import"结尾
this.excelFile = excelFile;
loadXmlBean();
} private void loadXmlBean() {
BeanReader beanReader = new BeanReader();
// 配置BeanReader实例
beanReader.getXMLIntrospector().getConfiguration()
.setAttributesForPrimitives(false);
beanReader.getBindingConfiguration().setMapIDs(false); // 不自动生成ID
// 注册要转换对象的类,并指定根节点名称
BufferedReader br = null;
try {
beanReader.registerBeanClass("importExcel", BN_ImportExcel.class);
br = new BufferedReader(new InputStreamReader(
new FileInputStream(new File(
PathUtil.getPath("/WEB-INF/excel/" + tableImport + ".xml"))), "GBK"));
// 将XML解析Java Object
xmlBean = (BN_ImportExcel) beanReader.parse(br);
excelColumn = xmlBean.getExcelColumn();
systemColumn = xmlBean.getSystemColumn();
} catch (UnsupportedEncodingException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (FileNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IntrospectionException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (SAXException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} finally {
if (br != null){
try {
br.close();
} catch (IOException e) {
}
}
}
} public Map doImport() {
Workbook workBook = null;
try {
workBook = new XSSFWorkbook(new FileInputStream(excelFile));
} catch (Exception ex) {
try {
workBook = new HSSFWorkbook(new FileInputStream(excelFile));
} catch (FileNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
if (workBook == null){
resultMap.put("result", false);
resultMap.put("message", "导入失败!无法加载该数据文件,请检查文件格式是否正确.");
return resultMap;
}
Sheet sheet = workBook.getSheetAt(0);
rows = sheet.getPhysicalNumberOfRows();
columns = sheet.getRow(0).getPhysicalNumberOfCells();
logger.info("rows=" + rows + " columns=" + columns);
if (rows <= 1 || columns == 0 ){
resultMap.put("result", true);
resultMap.put("error", false);
resultMap.put("message", "系统没有检测到需要导入的数据内容!");
return resultMap;
}
columnName = new String[columns]; //执行数据操作之前的初始化脚本initSQL
boolean initResult = runXMLSQL(xmlBean.getInitSQL());
if (!initResult){
resultMap.put("result", false);
resultMap.put("message", "系统初始化失败,请检查配置文件'"+tableImport+".xm'的initSQL是否正确!");
return resultMap;
} // 解析第一行表头列名
Iterator cellIterator = sheet.getRow(0).cellIterator();
StringBuffer memo = new StringBuffer();
while (cellIterator.hasNext()) {
Cell cell = (Cell) cellIterator.next();
// 读取当前单元格的值
String cellValue = cell.getStringCellValue();
logger.info("cell[0," + cell.getColumnIndex() + "]=" + cellValue);
columnName[cell.getColumnIndex()] = cellValue;
if (excelColumn.containsKey(cellValue)) {
columnMap.put(cell.getColumnIndex() + "",
(BN_Column) excelColumn.get(cellValue));
} else {
memo.append("列名[").append(cellValue).append("] ");
logger.info("cell[0," + cell.getColumnIndex() + "]列名["
+ cellValue + "]" + "未在xml的<excelColumn>节点内定义!无法解析导入");
}
}
if (memo.length() > 0) {// 有未在xml的<excelColumn>节点内定义的列
BN_ImportError errorBean = new BN_ImportError();
errorBean.setOp_id(StringUtil.getUUID());
errorBean.setOp_name(tableTarget);
errorBean.setRow_no("1");
errorBean.setMemo(memo.toString()+" 未在xml配置文件中定义,无法解析导入!");
errorBean.setCreate_id(UserSession.getOpId());
errorBean.setCreate_name(UserSession.getOpName());
errorBean.setCreate_time(BN_Row.getNowInput());
DAO_ImportError.doInsert(errorBean, null);
} // 解析数据行(从第2行开始)
for (int rowNum = 1; rowNum < rows; rowNum++) {
cellIterator = sheet.getRow(rowNum).cellIterator();
memo = new StringBuffer();
BN_Row rowBean = new BN_Row();
// 处理表格数据
while (cellIterator.hasNext()) {
Cell cell = (Cell) cellIterator.next();
String cellValue = getCellValue(cell);
logger.info("cell[" + rowNum + "," + cell.getColumnIndex() + "]=" + cellValue);
if (columnMap.containsKey(cell.getColumnIndex() + "")) {// 列名有在xml中有定义
BN_Column columnBean = columnMap.get(cell.getColumnIndex() + "");
Object[] parseResult = parseCell(columnBean, rowNum,
columnName[cell.getColumnIndex()], cellValue);
if (parseResult[0] != null) {
rowBean.setColumnValue(columnBean.getColumn(), parseResult[0]);
} else {
if (parseResult[1] != null) {
memo.append(parseResult[1]);
}
}
}
}
if (memo.length() > 0) {// 有不符合内容格式要求的字段
logger.info("第["+(rowNum + 1)+"行] "+memo.toString());
BN_ImportError errorBean = new BN_ImportError();
errorBean.setOp_id(StringUtil.getUUID());
errorBean.setOp_name(tableTarget);
errorBean.setRow_no((rowNum + 1) + "");
errorBean.setMemo(memo.toString());
errorBean.setCreate_id(UserSession.getOpId());
errorBean.setCreate_name(UserSession.getOpName());
errorBean.setCreate_time(BN_Row.getNowInput());
DAO_ImportError.doInsert(errorBean, null);
} else {
// 系统级字段
Iterator iterator = systemColumn.keySet().iterator();
while (iterator.hasNext()) {
String key = iterator.next().toString();
BN_Column sysColumnBean = systemColumn.get(key);
Object result = transfer(sysColumnBean.getDataType(), "",
sysColumnBean.getClassName(),
sysColumnBean.getMethod(), sysColumnBean.getParam());
if (result != null) {
rowBean.setColumnValue(sysColumnBean.getColumn(),
result);
}
}
int result = DAORunner.insertRow(tableImport, rowBean);
if (result == -1){//保存临时表失败,登记错误信息
BN_ImportError errorBean = new BN_ImportError();
errorBean.setOp_id(StringUtil.getUUID());
errorBean.setOp_name(tableTarget);
errorBean.setRow_no((rowNum + 1) + "");
errorBean.setMemo("数据保存失败");
errorBean.setCreate_id(UserSession.getOpId());
errorBean.setCreate_name(UserSession.getOpName());
errorBean.setCreate_time(BN_Row.getNowInput());
DAO_ImportError.doInsert(errorBean, null);
}
}
}
//计算自己导入成功的数据条数
int dataSuccNum = DAORunner.count("select count(*) from "+tableImport+" where create_id=?",
new Object[]{UserSession.getOpId()});
//计算自己文件解析失败的数据条数,排除首行列名解析问题
int dataFailNum = DAORunner.count("select count(*) from t_import_error where create_id=? and row_no != ?",
new Object[]{UserSession.getOpId(), 1});
int columnFailNum = DAORunner.count("select count(*) from t_import_error where create_id=? and row_no = ?",
new Object[]{UserSession.getOpId(), 1});
boolean result = DAORunner.runTransaction(new TransactionHandler() {
public void process(Connection connections) throws SQLException {
//执行数据转移前的脚本 beforeSaveSQL
if (!ObjectUtil.isNull(xmlBean.getBeforeSaveSQL())){
String[] sqlArr = xmlBean.getBeforeSaveSQL().split(";");
for (int i = 0 ; i < sqlArr.length ; i ++){
DAORunner.runUpdate(sqlArr[i].replaceAll("\\$\\{userId}", UserSession.getOpId()),
new Object[]{}, connections);
}
} //转移数据至tableTarget
DAORunner.runUpdate("insert into "+tableTarget+" select * from "+tableImport+" where create_id=?",
new Object[]{UserSession.getOpId()}, connections); //执行数据转移后的脚本 afterSaveSQL
if (!ObjectUtil.isNull(xmlBean.getBeforeSaveSQL())){
String[] sqlArr = xmlBean.getAfterSaveSQL().split(";");
for (int i = 0 ; i < sqlArr.length ; i ++){
DAORunner.runUpdate(sqlArr[i].replaceAll("\\$\\{userId}", UserSession.getOpId()),
new Object[]{}, connections);
}
}
}
});
if (result){
resultMap.put("result", true);
if ((dataFailNum + columnFailNum) > 0){//excel出现问题数据
resultMap.put("error", true);
}
StringBuffer message = new StringBuffer();
message.append("已成功导入").append(dataSuccNum).append("条数据!");
if (dataFailNum > 0){
message.append("有").append(dataFailNum).append("条数据因格式内容有问题无法导入!");
}
if (columnFailNum > 0){
message.append("个别列名未在xml配置文件中定义无法导入!");
}
resultMap.put("message", message.toString());
return resultMap;
}else{
resultMap.put("result", false);
resultMap.put("message", "数据导入失败,请重新尝试!");
}
return resultMap;
} private String getCellValue(Cell cell) {
int type = cell.getCellType();
switch (type) {
case Cell.CELL_TYPE_NUMERIC:// 数值、日期类型
double d = cell.getNumericCellValue();
if (HSSFDateUtil.isCellDateFormatted(cell)) {// 日期类型
Date date = HSSFDateUtil.getJavaDate(d);
return new SimpleDateFormat("yyyyMMdd").format(date);
} else {// 数值类型
return d + "";
}
case Cell.CELL_TYPE_BLANK:// 空白单元格
return null;
case Cell.CELL_TYPE_STRING:// 字符类型
return cell.getStringCellValue();
case Cell.CELL_TYPE_BOOLEAN:// 布尔类型
return cell.getBooleanCellValue() + "";
default:
logger.info("未处理类型["+type+"]");
break;
}
return null;
} private Object transfer(String dataType, String cellValue,
String className, String method, String param) {
try {
Class[] classArr = null;
Object[] valueArr = null;
if (ObjectUtil.isNull(param)) {
classArr = new Class[] {};
valueArr = new Object[] {};
} else {
String[] paramArr = param.split(",");
classArr = new Class[paramArr.length];
valueArr = new Object[paramArr.length];
for (int i = 0; i < paramArr.length; i++) {
if ("${self}".equals(paramArr[i])) {
if ("varchar".equals(dataType)
|| "date".equals(dataType)) {
classArr[i] = String.class;
valueArr[i] = cellValue;
} else if ("int".equals(param)) {
classArr[i] = int.class;
valueArr[i] = new Integer(cellValue);
} else if ("float".equals(param)) {
classArr[i] = float.class;
valueArr[i] = new Float(cellValue);
}
} else {
String typeStr = paramArr[i].split(":")[0];
String valueStr = paramArr[i].split(":")[1];
if ("varchar".equals(typeStr)) {
classArr[i] = String.class;
valueArr[i] = valueStr;
} else if ("int".equals(typeStr)) {
classArr[i] = int.class;
valueArr[i] = new Integer(valueStr);
} else if ("float".equals(typeStr)) {
classArr[i] = float.class;
valueArr[i] = new Float(valueStr);
}
}
}
}
Class tClass = Class.forName(className);
Object classInstance = tClass.newInstance();
Method classMethod = tClass.getMethod(method, classArr);
Object result = classMethod.invoke(classInstance, valueArr);
return result;
} catch (SecurityException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IllegalArgumentException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (ClassNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (InstantiationException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IllegalAccessException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (NoSuchMethodException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (InvocationTargetException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return null;
} private Object[] parseCell(BN_Column columnBean, int rowNum,
String columnName, String cellValue) {
Object[] objectArr = new Object[2];
String dataType = columnBean.getDataType();
int length = columnBean.getLength();
boolean required = columnBean.isRequired();
boolean transfer = columnBean.isTransfer(); if (ObjectUtil.isNull(cellValue)) {
if (required) {
objectArr[0] = null;
objectArr[1] = "\"" + columnName + "\"不能为空! ";
return objectArr;
} else {
objectArr[0] = null;
objectArr[1] = null;
return objectArr;
}
} if (transfer) {// 需要转换内容
String className = columnBean.getClassName();
String method = columnBean.getMethod();
String param = columnBean.getParam();
Object result = transfer(dataType, cellValue, className, method,
param);
logger.info("[" + rowNum + "," + columnName + "]转换结果=" + result);
objectArr[0] = result;
objectArr[1] = null;
} else {// 不需要转换内容
// 根据数据类型检查长度和内容是否符合字段要求
if ("varchar".equals(dataType) || "date".equals(dataType)) {
if (length != 0 && cellValue.length() > length) {
objectArr[0] = null;
objectArr[1] = "\"" + columnName + "\"内容超过最大长度" + length + "的限制! ";
} else {
objectArr[0] = cellValue;
objectArr[1] = null;
}
} else if ("int".equals(dataType)) {
if (!StringUtil.isInteger(cellValue)) {
objectArr[0] = null;
objectArr[1] = "\"" + columnName + "\"内容应为整数! ";
} else {
objectArr[0] = new Integer(cellValue);
objectArr[1] = null;
}
} else if ("float".equals(dataType)) {
if (!StringUtil.isDouble(cellValue)) {
objectArr[0] = null;
objectArr[1] = "\"" + columnName + "\"内容应为浮点数! ";
} else {
objectArr[0] = new Float(cellValue);
objectArr[1] = null;
}
}
} return objectArr;
} private boolean runXMLSQL(final String sqlStr){
if (ObjectUtil.isNull(sqlStr)){
return true;
}
return DAORunner.runTransaction(new TransactionHandler() {
public void process(Connection connections) throws SQLException {
String[] sqlArr = sqlStr.split(";");
for (int i = 0 ; i < sqlArr.length ; i ++){
DAORunner.runUpdate(sqlArr[i].replaceAll("\\$\\{userId}", UserSession.getOpId()),
new Object[]{}, connections);
}
}
});
} public static void main(String[] args) throws Exception {
}
}
java基于xml配置的通用excel单表数据导入组件(四、DAO主处理类)的更多相关文章
- java基于xml配置的通用excel单表数据导入组件(五、Action处理类)
package xxxxxx.manage.importexcel; import java.io.File; import java.util.HashMap; import java.util.M ...
- java基于xml配置的通用excel单表数据导入组件(二、xml配置文件解析加载)
1.BN_ImportExcel.java 对应xml主节点属性 package XXXXX.manage.importexcel; import java.io.Serializable; impo ...
- java基于xml配置的通用excel单表数据导入组件(一、实际应用过程)
主要应用技术:poi + betwixt + reflect 一.实际应用过程 1.创建与目标表结构一样,表名为‘{目标表名}_import’的临时表: 2.创建用于存储导入问题数据的表:t_impo ...
- java基于xml配置的通用excel单表数据导入组件(三、负责数据转换处理的类)
package xxxxxxx.manage.importexcel; import java.util.Map; import java.util.logging.Logger; import xx ...
- [刘阳Java]_Spring AOP基于XML配置介绍_第9讲
基于注解配置的Spring AOP固然简单,但是这节我们会给大家介绍基于XML配置的AOP是如何应用的.为什么这么说了,因为后面我们还会介绍到Spring对Dao操作的事务管理(基于AOP的XML文件 ...
- Sping MVC不使用任何注解处理(jQuery)Ajax请求(基于XML配置)
1. Spring Spring框架是一个轻量级的解决方案,是一个潜在的一站式商店,用于构建企业就绪的应用程序.Spring框架是一个Java平台,为开发Java应用程序提供全面的基础架构支持.Spr ...
- 转载 - Struts2基于XML配置方式实现对action的所有方法进行输入校验
出处:http://www.cnblogs.com/Laupaul/archive/2012/03/15/2398360.html http://www.blogjava.net/focusJ/arc ...
- 【Spring Framework】Spring入门教程(二)基于xml配置对象容器
基于xml配置对象容器--xml 标签说明 alias标签 作用:为已配置的bean设置别名 --applicationContext.xml配置文件 <?xml version="1 ...
- struts_20_对Action中所有方法、某一个方法进行输入校验(基于XML配置方式实现输入校验)
第01步:导包 第02步:配置web.xml <?xml version="1.0" encoding="UTF-8"?> <web-app ...
随机推荐
- meteor中分页库alethes:pages用法汇总
1.添加分页库: meteor add alethes:pages 2.新建分页: Pages = new Meteor.Pagination("collection-name") ...
- memcache的分布式算法(转)
memcached的分布式 正如第1次中介绍的那样, memcached虽然称为“分布式”缓存服务器,但服务器端并没有“分布式”功能. 服务器端仅包括 第2次. 第3次 前坂介绍的内存存储功能,其实现 ...
- SQL的update from 理解
学习了sql的语句都有快3年,工作上使用都一年半的,最近突然想起update from语句,感觉好像很模糊,虽然语法上使用一直正确,一直都是这样使用,但是就好像不是很明白里面的深处意思. 今天特意测试 ...
- O-C相关06:self和super关键字介绍——self关键字
self关键字介绍 1.self和super OC 版权声明:本文为博主原创文章,未经博主允许不得转载. posted @ 2015-08-04 12:46 王刚韧(wanghy_iOS) 阅读(.. ...
- VB,VBS,VBA,ASP可引用的库参考
文件系统对象相关: ("SCRIPTING.FILESYSTEMOBJECT") 字典相关: ("SCRIPTING.DICTIONARY") 脚本外壳相关: ...
- js和css分别实现透明度的动画实现
js实现 两个函数 即setInterval和setTimeout setTimeout((function(){})(1/10),1*100) 该函数有两个参数,第一个为执行的函数,第二个为事件参数 ...
- Mybatis 学习历程
MyBatis是一个支持普通SQL查询,存储过程和高级映射的优秀持久层框架. MyBatis消除了几乎所有的JDBC代码和参数的手工设置以及对结果集的检索封装. MyBatis可以使用简单的XML或注 ...
- Mysql JDBC 连接串参数说明
MySQL的 JDBC URL 格式 for Connector/J 如下例: jdbc:mysql://[host:port],[host:port].../[database][?参数名1][= ...
- jQuery设置checkbox全选(区别jQuery版本)
jQuery设置checkbox全选在网上有各种文章介绍,但是为什么在我们用他们的代码的时候就没有效果呢? 如果你的代码一点错误都没有,先不要急着怀疑人家代码的正确性,也许只是人家跟你用的jQuery ...
- HTML 多媒体
1.多媒体简介 Web 上的多媒体指的是音效.音乐.视频和动画,多媒体有多种不同的格式,它可以是听到或看到的任何内容,文字.图片.音乐.音效.录音.电影.动画等等.在互联网上,几乎在所有网站都能发现嵌 ...