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

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的处理没有写完善;

 

 

 

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

你可能感兴趣的:(ext,Excel,HSQLDB)