使用開源計算引擎提升Excel格式文件處理效率( 二 )


esProc SPL就是其中的佼佼者 。
SPL內置高級讀寫函數SPL是JVM下開源的計算引擎,它對POI也進行了封裝,內置簡單易用的高級函數 , 可解析\生成各類格式規則或不規則的xls , 并自動生成結構化數據對象 。
解析格式規則的行式Excel,SPL提供了T函數 。比如解析前面的xls文件,用封裝前的POI要幾十行,封裝后只要一句:
=T("d:\Orders.xls")
解析行式Excel是很常見的任務,SPL用T函數封裝了POI的功能,接口簡單易用 。無論xls還是xlsx,T函數都可以統一解析 。可自動進行類型轉換,開發者無須在細節浪費時間 。T函數可自動區分首行的列名和其他行的數據,并根據列名創建序表(SPL的結構化數據對象)并填入數據:

使用開源計算引擎提升Excel格式文件處理效率

文章插圖
讀入并解析成序表后,就可以使用SPL提供的豐富的結構化數據處理方法了:
取第3條記錄:A1(3)
取后3條記錄:A1.m([-1,-2,-3])
取記錄的字段值:A1(3).Amount*0.05
修改記錄的字段值:A1(3).Amount = A1(3). Amount*1.05
取一列 , 返回集合:A1.(Amount)
取幾列,返回集合的集合:A1.([CLIENT,AMOUNT])
追加記錄:A1.insert(200,"APPL",10,2400.4,date("2010-10-10"))
先按字段取再按記錄序號?。篈1.(AMOUNT)(2);等價于先按記錄序號取再按字段?。篈1(2).AMOUNT
解析格式較不規則的行式xls,SPL提供了xlsimport函數,內置豐富而簡潔的讀取功能:
沒有列名 , 首行直接是數據:file("D:\Orders.xlsx").xlsimport()
跳過前2行的標題區:file("D:/Orders.xlsx").xlsimport@t(;,3)
從第3行讀到第10行:file("D:/Orders.xlsx").xlsimport@t(;,3:10)
只讀取其中3個列:file("D:/Orders.xlsx").xlsimport@t(OrderID,Amount,OrderDate)
讀取名為"sales"的特定sheet:file("D:/Orders.xlsx").xlsimport@t(;"sales")
函數xlsimport還具有讀取倒數N行、密碼打開文件、讀大文件等功能,這里不再詳述 。
解析格式很不規則的xls,SPL提供了xlscell函數,可以讀寫指定sheet里指定片區的數據,比如讀取第1個sheet里的A2格:
=file("d:/Orders.xlsx").xlsopen().xlscell("C2")
配合SPL靈活的語法,就可以解析自由格式的xls,比如將下面的文件讀為規范的二維表(序表):
使用開源計算引擎提升Excel格式文件處理效率

文章插圖
這個文件格式很不規則,直接基于POI寫Java代碼是個浩大的工程,而SPL代碼就簡短得多:
使用開源計算引擎提升Excel格式文件處理效率

文章插圖
生成規則的行式xls,SPL提供了xlsexport函數,用法也很簡單 。比如,上面例子的解析結果是個序表,存在SPL的A1格中 , 下面將A1寫入新xls的第一個sheet,首行為列名,只要一句代碼:=file("e:/result.xlsx").xlsexport@t(A1)
xlsexport函數的功能豐富多樣,可以將序表寫入指定sheet,或只寫入序表的部分行,或只寫入指定的列:=file("e:/scores.xlsx").xlsexport@t(A1,No,Name,Class,Maths)
xlsexport函數還可以方便地追加數據,比如對于已經存在且有數據的xls , 將序表A1追加到該文件末尾,外觀風格與原文件末行保持一致:=file("e:/scores.xlsx").xlsexport@a(A1)
不規則片區寫入數據,可以使用前面的xlscell函數 。比如,xls中藍色單元格是不規則的表頭,需要在相應的白色單元格中填入數據,如下圖:
使用開源計算引擎提升Excel格式文件處理效率

文章插圖
直接用POI要大段冗長的代碼,而SPL代碼就簡短許多:
使用開源計算引擎提升Excel格式文件處理效率

文章插圖
注意,第6、9、11行有連續單元格,SPL可以簡化代碼一起填入,POI只能依次填入 。
SPL提供足夠的查詢計算能力查詢計算是Excel處理任務的重點 , SPL提供了豐富的計算函數、字符串函數、日期函數,以及標準SQL語法,不僅支持日常的xls計算,也能計算內容不規則的xls和邏輯復雜的xls 。
SPL提供了豐富的計算函數,可直接完成基礎計算 。比如前面的分組匯總,只要一句:
A1.groups(SellerId;sum(Amount))
更多計算:
條件查詢:A1.select(Amount>1000 && Amount<=3000 && like(Client,"

推薦閱讀