导入特殊行式类型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();
}
}
总结:
有些时候,单纯用普通报表或者行式报表都难以达到业务需求,这时候可能就需要变通一下。通过润乾的二次开发接口已经已有的一些函数可方便完成这种功能