通过行式报表将不定行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文件通过程序导入到对应的数据库中。
具体代码及文件见附件