上次做项目时要求数据源改为Excel,与项目一起打包执行。查了一下数据源是否可以直接使用Excel的解决方案,虽然有提供可以连接Excel的驱动,但是以Excel直接操作数据实在是不方便,没有数据库的功能强大,因此想到了使用了内嵌式数据库,再编写一段上传Excel把数据更新到数据库的代码,即可同样达到数据源与项目打包的效果。
一、解决思路
要求:数据源为Excel,与项目一起打包
方法:使用内嵌式数据库,后台处理上传Excel数据至数据库
内嵌式数据库就是不需要像Mysql/Oracle一样安装启动服务,而是在项目中直接引用它的jar包即可,它会以文件的形式存在于数据库中。在此项目中我使用了sqlite3。
上传Excel数据至数据库这一块我使用了fileUpload和poi,前者是用于上传文件,后者用于从Excel中读取数据;数据库连接我采用了SpringJdbcTemplate。好啦,以下是详细的步骤。
二、详细步骤
1、安装内置数据库sqlite3
1)首先从官网下载,我是在Windows下开发的,虽然后续是在linux环境下运行,但是sqlite3它可以自己跨平台,所以我直接下载windows版本就好了。
2)解压,然后创建一个sqlite3类型的文件,在命令提示符中使用sqlite3 DatabaseName.db的命令即可在当前目录下创建一个sqlite3类型的数据库
3)你可以用Navicat等可视化工具连接数据库,也可以把数据库直接复制到项目中,然后在applicationContext配置文件中配置连接信息即可。我这里采用了C3P0连接池。如果是放在resources下面,URL可以像我这样写,另外sqlite3的所使用的驱动是org.sqlite.JDBC。用户名和密码可以不使用。
测试一下,可发现数据库能够正常连接
2、Excel读取数据并写入数据库
poi提供了Excel读取的了解决方案,有一点要注意的是,分为HSSF和XSSF,其中HSSF是针对的office2007之前的版本xls,而XSSF针对的是office2007以后的版本xlsx,我这里采用的是XSSF。
思路:上传文件存放至临时地点——读取Excel数据封装成List——清空数据库之前的数据——插入数据到数据库
读取Excel数据封装成List,主要思想就是遍历每个sheet,再在每个sheet中遍历行,取列值,每行封装成一个对象,每个sheet又封装成一个list,批量插入数据库,下面直接上代码。
读取Excel.java
public class UploadExcel {
public static List<Ammeter> readXlsx(String path) throws Exception {
List<Ammeter> list = new ArrayList<Ammeter>();
InputStream is = new FileInputStream(path);
XSSFWorkboo