通过行式报表将不定行excel数据导入数据库

在浏览器端客户可以通过行式报表将excel文件中的数据导入到页面端最终导入到数据库,此时报表行数能根据excel的行数自动增加,但有些客户不需要在页面端做导入操作,希望能够通过api形式直接将excel文件通过润乾填报形式导入到数据库中,但这个excel行数并不确定,此时没有了页面端的自动添加行功能,只能通过api来计算,下面介绍下该案例的解决方法以及相关案例。

首先:

要建一张行式填报表,增加更新设置,设置单元格与数据库之间的映射关系,按照常规制作即可,注意一点,行式填报表中必须要有纵向扩展单元格,如果报表为空白报表,则需要手动将单元格的扩展方式改成纵向扩展,如:

二:编写API代码

1、将excel文件转换成IReport对象

String excelFile=“D:\\imp.xls”;

String reportFile=“D:\\imp.raq”;

ExcelImporter ei=null;

try {

ei = new ExcelImporter(excelFile);

} catch (Exception e) {

// TODO 自动生成 catch 块

e.printStackTrace();

IReport ereport=ei.getReport(0);//获得excel第一个sheet

2、计算raq,设置相关环境变量(此例子为CS程序,需要设置数据库连接),并将生成后的Ireport转换成RowReport

ReportDefine rd=null;

try {

rd = (ReportDefine)ReportUtils.read( reportFile );

} catch (Exception e) {

// TODO 自动生成 catch

e.printStackTrace();

}

Context context = new Context();

Connection connection = null;

try {

Driver driver = (Driver) Class.forName(“org.hsqldb.jdbcDriver”).newInstance();

DriverManager.registerDriver(driver);

connection = DriverManager.getConnection(“jdbc:hsqldb:hsql://localhost/runqianDB”, “sa”, “”);

} catch (Exception e) {

e.printStackTrace();

}

// 设置数据源,动态改变连接参数

context.setDefDataSourceName(“demo”);

context.setConnection(“demo”,connection);

DataSourceConfig dsoc = new DataSourceConfig(DBTypes.ORACLE, true, “GBK”, “GBK”,false);

context.setDataSourceConfig(“demo”, dsoc);

Engine enging = new Engine( rd, context);

IReport iReport = enging.calc();

RowReport rr = ( RowReport ) iReport;

因为报表是一个空白报表,就两行,将来导入数据时要求行自增加,所以需要获得扩展行所对应的明细ID

String did = rr.getDetailID( 2 ); //第二行是扩展主行

RowReportSaver rowSaver = new RowReportSaver( rr, null, context );

接下来就是做循环将excel的数据导入到填报表中,注意,循环时要按照excel所生成的ireport做循环。并且没循环一行要对报表新增一行:

for(int i=1;i<=ereport.getRowCount();i++){

for(short j=1;j<=ereport.getColCount();j++){

Area area = rr.insertDetail( did );

Object value=ereport.getCell(i, (short)j).getValue();

if(value!=null){

try {

rowSaver.setCellInputValue( i+1, (short)j, value.toString(), dateF, timeF, datetimeF );

} catch (Exception e) {

// TODO 自动生成 catch 块

e.printStackTrace();

}

}

}

}

最后调用保存方法即可:

rowSaver.save();

这样就能将不定行的excel文件通过程序导入到对应的数据库中。

具体代码及文件见附件

热门文章