报表知识库
我要提问

导入特殊行式类型excel数据提交入库

业务场景:

利用润乾报表的API可以方便实现导入excel中的数据提交入库,通常可以分为两种,普通报表和行式报表,普通报表即报表格式固定,报表中的数据格式无规律。行式报表通常不定行数据的提交。但我们可能会遇到这种情况,如下图所示:

其中,编制单位以及金额单位需要提交数据入库,并且第6,7行是不固定的,即是不定行的。

处理思路:

对于这种报表,单纯用普通报表的导入提交或者是行式报表的导入提交都是不行的。可以用如下的思路来解决:

1:报表还是设置成普通报表,否则编制单位以及金额单位提交不了

2:获取到导入excel的数据行后,生成to(1,N)的表达式,用于扩展出不定行。

利用这个方法,既可以变相解决不定行的问题。

相关代码:

生成to函数并写到单元格表达式:

private IReport calcReport(String reportFile) throws Exception {

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

cxt = new Context();

Connection connection = null;

try {

Driver driver = (Driver) Class.forName(“com.newatlanta.jturbo.driver.Driver”)

.newInstance();

DriverManager.registerDriver(driver);

connection = DriverManager.getConnection(

“jdbc:JTurbo://localhost/runqian/charset=GBK”, “sa”, “sa”);

} catch (Exception e) {

e.printStackTrace();

}

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

cxt.setDefDataSourceName(“jdbc/defualt”);

// 设置数据连接,也可以设置连接池工厂,cxt.setConnectionFactory(sourceName,connectionFactory)

// 其中connectionFactory这个类必须implements IConnectionFactory,并且实现他的public

// java.sql.Connection getConnection() throws Exception 方法

cxt.setConnection(“jdbc/defualt”, connection);

DataSourceConfig dsoc = new DataSourceConfig(2, true, “GBK”, “GBK”,

false);

cxt.setDataSourceConfig(“jdbc/defualt”, dsoc);

int excelcount=excelReport.getRowCount()-1;

INormalCell a2=rd.getCell(2, (short)1);

IByteMap a2map=new ByteMap();

String value=“to(1,”+excelcount+“)”;

a2map.put(INormalCell.VALUE,value); //设置单元格的数据值表达式

a2.setExpMap(a2map);

rd.setCell(2, (short)1, a2);

Engine engine = new Engine(rd, cxt);

IReport iReport = engine.calc();

return iReport;

}

提交入库的代码

public void saveFromExcel(String reportFile, String excelFile, int sheetNum)

throws Exception {

ArrayList <IReport>al=new ArrayList<IReport>(sheetNum);

al=excelToReport( excelFile,sheetNum);

for(int s=0;s<al.size();s++){

excelReport = al.get(s);

IReport report = calcReport(reportFile);

System.out.println(report);

System.out.println(al.size());

System.out.println(有效行:===”+getExcelReportCount(excelReport));

for(int i=2;i<=getExcelReportCount(excelReport);i++){

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

for(int j=1;j<excelReport.getColCount();j++){

INormalCell iCell=report.getCell(i, (short)(j+1));

INormalCell iExcelCell=excelReport.getCell(i, (short)j);

System.out.println(+i+行;第+j+列:数据为:+iExcelCell.getValue());

if(iCell.getInputProperty()!=null){

iCell.getInputProperty().setInputValue(iExcelCell.getValue());

}else{

InputProperty ip = new InputProperty();

ip.setInputValue(iExcelCell.getValue());

iCell.setInputProperty( ip );

}

}

}

DataSaver dsave = new DataSaver((ExtCellSet)report,null,cxt);

dsave.save();

}

}

总结:

有些时候,单纯用普通报表或者行式报表都难以达到业务需求,这时候可能就需要变通一下。通过润乾的二次开发接口已经已有的一些函数可方便完成这种功能