欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

给HSQLDB的text table增加对Excel的读取

程序员文章站 2022-05-24 18:13:45
...

HSQLDB是一个非常好的内存数据库,对于处理少量数据的小型数据应用非常适合。

其中,text table更是扩展了数据存储的方式,它可以将一个csv文件挂接进来,进而,对这个表的全部操作都将在这个csv文件中体现出来。但是,他不支持excel作为数据源。

我增加了这个功能。思路如下:

如果我们想要挂接一个csv,那么需要写:

 

SET TABLE table_1 SOURCE "data.csv;encoding=GB2312;"
 

表示把data.csv挂在table_1上了,这样,select, insert, update都会时时体现在这个csv上,顺着这个思路,我的目标是通过:

SET TABLE table_1 SOURCE "data.xls;encoding=GB2312"

定义一个xls文件,如果系统也能够处理,多好!

 

设想是:如果能在系统真正处理之前,检测一下,如果判断是xls,那么就是用POI将其转化为csv文件,然后使用这个csv文件拼接上去。

 

最终找到,在org.hsqldb.persist.TextCache里面处理这些事情,于是在:

protected void initParams(Database database,String baseFileName) throws HsqlException {

 里面增加了一段代码,

               if(fileName.endsWith(ExcelToCsv.EXT_XLS)) {
                	try {
						ExcelToCsv etc = new ExcelToCsv(fileName,tableprops.getProperty(ExcelToCsv.ROW_COUNT),tableprops.getProperty(ExcelToCsv.COL_COUNT));
						fileName = etc.parse();
					} catch (IOException e) {
						// TODO error handling
						e.printStackTrace();
					}
                }

 其中,ExcelToCsv是我新增的一个类,用于读取Excel将其写成csv。

 

在实际使用中,需要提供Excel文件中有多少列,和多少行(对于多少行,如果事先无法确定,可以给一个足够大的数),也就是说,在实际使用中,用:

SET TABLE table_1 SOURCE "data.xls;encoding=GB2312;rowcount=200;colcount=11"

其中,定义了,table_1这个表从Excel里面取11列,最多取200行(实际Excel文件里面只有157行)。

 

 

附件是基于HSQLDB1.8.0.10版本增加这个功能的jar以及相关原代码。

 

缺陷如下:

1、基于上面的机制,只在set的时候处理一次,那么,以后对于table_1的任何操作都不会反映在excel文件里面,而只会在csv里面,不过我的客户都是只有select,而不会update, delete,所以这个功能对我用处不大;

2、一些exception的处理没有写完善;

 

 

 

哪位老大有时间,完善一把呗

相关标签: Excel HSQLDB EXT