Jslfl【软件开发技术笔记】

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

工程结构:
impData1

待导入的数据文件d:/User.xls
impData2

xls读取的配置文件 impDataConf/etm-User.xml
impData3

实体类 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.