运用jxl将复杂excel报表导入数据库的设计与实现

时间:2022-08-06 08:43:32

运用jxl将复杂excel报表导入数据库的设计与实现

【摘 要】在许多检测单位的办公自动化系统中,需要使用到检测单位的大量检测数据,而这些数据存储于excel文件中,由于不同类型产品的检测报表存在一定差异,使用简单的方式读取excel文件存在代码可重用性差的问题。在分析各种报表的结构后,运用jxl和xml技术,实现了动态的将excel报表导入数据库的功能,并且适用于各种不同的报表结构。

【关键词】excel;检测报表;jxl;xml

0 引言

在日常工作中,需要将大量包含检测数据的excel检测报表导入到许多检测单位的办公自动化系统,为了方便对检测数据的使用,可以使用jxl来对excel文件进行操作。jxl是一个广泛用于读写excel文件的优秀的开源工具。Jxl提供了一种简单的读取excel文件的方法,该方法的基本思想是:通过jxl中的Workbook获取表中的sheet,然后通过sheet获取表中的每一个单元格cell,最后调用cell的getContents()方法获取数据。该方法可以快速的获取数据,但获取的数据不能被灵活的使用。为了灵活使用表中的数据,实现对表中的每一个数据进行操作,可将表中的数据存入数据库中,然后系统便可自由的在数据库中获取相应的信息。

基于以上分析,结合各种检测报表的结构之间存在的共同特性,运用xml作为中介,实现了动态将报表导入数据库的功能,解决了代码重用性差的问题,系统使用人员只需要知道表结构,就可以将不同报表动态存入数据库中,不需要懂得代码编写。

1将excel检测报表中数据导入xml

通过对不同检测报表分析,检测报表与具有常见报表相同的结构,包括4个部分:标题、表头、表体、表尾。标题、表头及表尾具有一键一值的关系,表体中的内容可由横纵坐标共同确定。

根据报表结构特点以及具有的键值特性,将报表抽象为3个Java类,KeyNameSet类封装键名、KeyValueSet类封装每个键对应的值、TableNameSet类用于封装不同的表名。

根据以上分析,按照表格特点配置xml文件,将表格中数据存入指定的xml文件中。这里的配置并不需要配置人员懂得xml的运用,只需要根据程序运行提升进行配置即可,下面给出一个配置举例。

输入选择的sheet的索引位置:0

输入您要配置tag:table

输入您要配置key:报表1

结束xml的配置吗?yes/no:no

输入您要配置tag:head

输入您要配置key:0001表1A

输入您的值x偏移量:

输入您的值y偏移量:

结束xml的配置吗?yes/no:no

输入您要配置tag:head

输入您要配置key:A

输入您的值x偏移量:1

输入您的值y偏移量:0

结束xml的配置吗?yes/no:yes

配置成功,已生成配置!

通过以上配置,将生成一个xml配置文件,文件内容如下:

配置中tag即表示xml文件中的标签,本文中tag的取值有table(标题),head(表头),body(表体),foot(表尾),body-col(表体列),body-row(表体行),这些定义是根据前面分析的表结构来定义的。偏移量表示所存入的键对应的值所在excel表中的位置。

2将xml中的数据导入数据库

通过两个步骤实现该功能,第一步,将前一节配置所得的xml文件中的所有键值对都存入数据库;第二步,根据存入数据库中的键值,查找excel文件中的表格内容,存入数据库。

/*将xml配置存入数据库*/

public static void toStroeKeys(String xmlFile){

File file = new File(xmlFile);

SAXReader reader = new SAXReader();

Document doc = null;

try {

doc = reader.read(file);

} catch (DocumentException e) {

e.printStackTrace();

}

XmlLoader tbLoader = XmlManeger.getTable(doc);

ArrayList heads = XmlManeger.getKeys(doc,XmlManeger.head);

Connection conn = DbUtil.getConn();

… …

int tableId = DataService.getTableId(tbLoader.getKey().toString()).getId();

for(int i =0;i

heads.get(i).setTableId(tableId);

DataService.addKey(heads.get(i),conn);

}

……

DbUtil.close(conn);

}

根据报表结构,表头与表尾中存在有些该键没有对应的取值的情况,因而在程序实现时加入了一个type属性来判别键所对应的取值是否存在,当type取值为1时,表示该键有对应的取值,则将该值取出,存入数据库,以表头存入数据库为说明。

/*将excel数据导入数据库*/

/*------------表--头---------------/*

File file = new File(excelFile);

Workbook book = null;

book = Workbook.getWorkbook(file);

… …

ArrayList heads=DataService.getHeads(t.getId());

KeyValueSet kSet = null;

for(int i=0;i

if(heads.get(i).getType()==1){

kSet = new KeyValueSet();

cell = sheet1.getCell(heads.get(i).getX()+heads.get(i).getPx(),heads.get(i).getY()+heads.get(i).getPy());

……

kSet.setKeyValue(cell.getContents());

DataService.addValue(kSet, conn);

}

}

3结语

通过对报表结构分析,总结归纳了报表的一般结构,运用xml作为中间的过渡,结合 jxl实现了动态的将存于excel中的复杂的报表结构中的数据导入数据库的功能,导入数据的操作人员不需要知道程序代码如何编写,只需了解各种报表的结构,根据程序的提示,配置好报表结构即可。

该功能在许多涉及与报表相关操作的系统中都可以使用,因而在下一步的工作中,可以进一步实现该功能的可视化操作,使其成为一个小的工具应用程序,供广大的需要运用该功能的开发人员使用。

参考文献:

[1] JXL. Java Excel API (XML) 1.1 [EB/OL]. http:///jexcelapi/, 2003-07.

[2] 阳瑞发,冯彬.一种导出复杂Excel报表的设计与实现.计算机系统应用[J], 2013,22(2):155-157.

[3] 张明辉,王清心,王正玉.基于Java Excel API的数据库数据导入导出方法研究与实现.现代电子技术[J],2012,35(4):45-47.

作者简介:

曾秋丽 1990.9 贵州大学 大数据与信息工程学院 电子与通信工程专业

李娜 1988.8 贵州大学 大数据与信息工程学院 电子与通信工程专业

上一篇:基于单片机STC89C51的多用途温度测量系统 下一篇:浅谈楼宇智能化中电气自动化系统的应用