天天看点

功能强大、使用方便的java导入excel

目前的excel导入开发工作量非常大。主要是写一些字段验证,还有关联表验证。不仅工作量大而且效率低,不好扩展。于是我写了下面的工具只需要写一个xml描述文件哦

这个工具功能非常强大:

1,开发工作量小。

2,使用方便

3,是否更新,是否关联表级联插入

4,扩展方便excel变动直接修改xml文档即可

5,效率高

6,验证多

使用到的技术包括:

1,java

2,spring

3,hibernate

4,json

5,xml

6,poi

下面介绍如何使用

第一步写描述文件:

描述文件如下:

根元素:描述excel对应的导入类(class),有相同记录是否更新(upate),关联表没记录是否级联插入(cascade)。为了安全建议不要更新和级联插入

子元素:跟元素下只有一种子元素column,这个元素师描述excel字段列的。顺序要与excel吻合。该元素中的属性是对字段的验证。验证内容一目了然最大长度(maxLengt),必填(required)等。  还有唯一(unique)字段作为判断是否重复,一般情况下配置一个字段即可。

<?xml version="1.0" encoding="UTF-8"?>
<excel 
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xsi:noNamespaceSchemaLocation="excel2db.xsd"
	sheetIndex="0" startRowIndex="1" class="model.Postage" cascade="true" 
	update="true">
	<column name="spareCenter.spareCenterName" maxLength="20" 
		required="true"/>
	<column name="spareCenter.address"  maxLength="200"/> 
	<column name="spareCenter.leader.name"  maxLength="200"/> 
	<column name="spareCenter.leader.dept.name"  maxLength="200"/> 
	<column name="postTime" format="yyyy-MM-dd HH:mm:ss"/> 
	<column name="postNum" maxLength="20" digits="true" >
		<check name="number" errMsg="邮寄费用必须为小数哦!"></check>
	</column>
	<column name="postWeight" maxLength="20">
		<check name="number"></check>
	</column>
	<column name="postage" maxLength="20" required="true">
		<check name="number"></check>
	</column>
	<column name="insurance" maxLength="20">
		<check name="number"></check>
	</column>
	<column name="packingfee" maxLength="20">
		<check name="number"></check>
	</column>
	<column name="aimplace" maxLength="20" required="true"/>
	<column name="placeDescription" maxLength="20" required="true"/>
	<column name="emsCode" maxLength="20" required="true" unique="true"/>
	<column name="remark" maxLength="200" />
</excel>
           

第二部配置2个hibernte

第一个bean是数据库操作类把sessionFactory配进去

第二个是excel导入类要吧第一个bean配置进去,"excelImport"是默认名字也可以不使用这个名字

<bean id="commonService"
		class="excel2db.service.spring.CommonServiceSpringImpl">
		<property name="sessionFactory" ref="sessionFactory" />
	</bean>
	<bean id="excelImport"
		class="excel2db.util.excel.ExcelImport">
		<property name="commonService" ref="commonService" />
	</bean>
           

第三部调用:

ExcelUtils里有很多重载方法选择一个最合适你的。第一个参数要导入excel的文件流,第二个参数文件名,第三个参数描述xml文件流,第四个excel导入类,第五个是自定义操作接口。这个接口有2个方法,第一个beforeDB可以对excel中的数据自定义验证,参数是json对象。第二个afterDB可以插入一些excel中没有的数据,参数是实际导入的对象。也可以对关联表的id验证,beforedb是没有id信息的。

Result result = ExcelUtils.excel2DB(ClassLoader.getSystemResourceAsStream("Postage.xlsx"), 
				fileName,ClassLoader.getSystemResourceAsStream("postage.xml"),excelImport,
				
				new Excel2DB() {

					public String validateBeforeDB(JSONObject obj) {
						//可以写一些其他验证
						String ems = obj.getString("emsCode");
						if(!ems.matches("\\w+")){
							return "$emsCode "+"格式不正确!";
						}
						return Excel2DB.SUCCESS;
					}

					public String validateAfterDB(Object obj) {
						//可以添加一些excel里没有的数据,也可以做一些其他验证,对象里已经包含Id;
						Postage postage = (Postage) obj;
						if(postage.getPostId()!=null){
							//未修改的信息不希望丢失
							Postage db = service.findObjectById(Postage.class,postage.getPostId());
							postage.setCreatePerson(db.getCreatePerson());
							postage.setCreateTime(db.getCreateTime());
							postage.setModifyTime(new Date());
							postage.setModifyPerson("damengge");
						}else{
							postage.setCreateTime(new Date());
							postage.setCreatePerson("damengge");
						}
						return Excel2DB.SUCCESS;
					}
				});
           

工具jar包下载地址

工具jar包2.0下载地址(修改部分BUG,增加一些功能)

测试项目下载地址

继续阅读