jxls实现数据导入到数据库demo
只是基本思路,有待优化完善程序健壮性和实现数据库插入操作.
如去掉不同实体分别开发导入逻辑,通过xls中加配置行来对应到表的字段,这样就可以自动生成sql;或通过jdbc的api也能实现自动生成sql.
说明:
1.待导入的xls数据文件的名称与数据实体名相同,如实体User对应的导入文件是User.xls
2.impDataConf中创建xls与数据实体的映射文件,文件名格式必须是:etm-实体名.xml
如:impDataConf/etm-User.xml
3.开发实体对应的导入服务实现类,必须实现IImpDataService接口,完成数据导入操作的业务逻辑
如:UserImpDataServiceImp
4.impDataConf/impMap.properties中添加配置,key为实体名称,value为导入服务实现类的全限名
如:User=com.sky.impData.demo.impDataService.imp.UserDataServiceImp
xls读取的配置文件 impDataConf/etm-User.xml
实体类 bean/User.java
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 | package bean; public class User { private int id; private String name; private int age; public int getId() { return id; } public void setId(int id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } } |
导入服务接口impDataService/IImpDataService.java
1 2 3 4 5 6 7 | package impDataService; import java.util.List; public interface IImpDataService { public int impList(List list); } |
导入服务实现类impDataService/imp/UserDataServiceImp.java
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 | package impDataService.imp; import impDataService.IImpDataService; import java.util.List; import bean.User; public class UserDataServiceImp implements IImpDataService{ @SuppressWarnings("rawtypes") @Override public int impList(List list) { int index = -1;//最后一次导入数据的序号,以便在出错时不用全部重新导入 for(int i = 0; i < list.size(); i++){ User u = (User)list.get(i); //insert System.out.println("insert user {" + u.getId() + "," + u.getName() + "}"); index = i; } return index; } } |
excle读取工具类tool/ExcelUtils.java
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 | package tool; import java.io.File; import java.io.FileInputStream; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; import net.sf.jxls.reader.ReaderBuilder; import net.sf.jxls.reader.XLSReadStatus; import net.sf.jxls.reader.XLSReader; /** * Excel文件操作工具 * */ public class ExcelUtils { private static ExcelUtils INSTANCE = null; private ExcelUtils() { } public static ExcelUtils getInstance() { if (INSTANCE == null) INSTANCE = new ExcelUtils(); return INSTANCE; } /** * 读Excel文件 * * @param <T> * 关联模型的泛型 * @param etmFilePath * etm(Excel模板映射)文件路径 * @param xlsFile * 要读取的Excel文件 * @param clazz * 关联模型的Class对象 * @return 读取的数据 */ public <T> List<T> readExcel(String etmFilePath, File xlsFile, Class<T> clazz) { List<T> list = new ArrayList<T>(0); try { Map<String, Object> arg1 = new HashMap<String, Object>(2); arg1.put("list", list); arg1.put("model", clazz.newInstance()); XLSReader reader = ReaderBuilder.buildFromXML(new FileInputStream(etmFilePath)); XLSReadStatus readStatus = reader.read(new FileInputStream( xlsFile), arg1); if (readStatus.isStatusOK()) System.out.println(new StringBuilder().append("解析文件[") .append(xlsFile.getName()).append("]成功,记录数[") .append(list.size()).append("]。").toString()); } catch (Exception e) { e.printStackTrace(); } return list; } } |
导入服务实现配置impDataConf/impMap.properties
1 | User=impDataService.imp.UserDataServiceImp |
测试Demo.java
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 | import impDataService.IImpDataService; import java.io.File; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.IOException; import java.util.List; import java.util.Properties; import tool.ExcelUtils; public class Demo { /** * @param args */ public static void main(String[] args) { Demo demo = new Demo(); demo.impXls(new File("d:/User.xls")); demo.impXls(new File("d:/Dept.xls")); } public void impXls(File xlsFile){ /** 从xls文件中读出数据到list */ String fileFullName = xlsFile.getName(); String fileName = fileFullName.split("\\.")[0]; List<Object> beanList = ExcelUtils.getInstance().readExcel("impDataConf/etm-" + fileName + ".xml", xlsFile, Object.class); /** 从配置文件中读取对应的导入服务实现 */ Properties properties = new Properties(); FileInputStream fis; try { fis = new FileInputStream("impDataConf/impMap.properties"); properties.load(fis); fis.close(); } catch (FileNotFoundException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } String impDataServiceImpClass = properties.getProperty(fileName);//导入服务实现类路径 try { IImpDataService impDataService = (IImpDataService)Class.forName(impDataServiceImpClass).newInstance();//通过类路径创建导入服务实现对象实例 //执行导入,返回成功导入的最后一个数据下标 int lastIndex = impDataService.impList(beanList); System.out.println("原始数据" + beanList.size() + "条, 成功导入" + (lastIndex+1) + "条."); } catch (Exception e) { e.printStackTrace(); } } } |
Comments are currently closed.