
Excel 數(shù)據(jù)轉存數(shù)據(jù)庫的應用框架
隨著企業(yè)IT系統(tǒng)的不斷升級,很多企業(yè)有提升遺留系統(tǒng)的強烈需求。而整合遺留系統(tǒng)中的信息資源是其中最為關鍵的一步,進而可對信息進行數(shù)據(jù)挖掘等創(chuàng)新工作。本文涉及這 樣的一個應用案例,企業(yè)的數(shù)據(jù)信息是以 Excel 文件作為其附件的方式,分散存儲在企業(yè)不同的服務器上的,客戶要求把這些文件里面的數(shù)據(jù)信息轉存到數(shù)據(jù)庫中。
讀者可能也會遇到其它的應用場景,要求把 Excel 文件中的數(shù)據(jù)信息解析出來并存入到數(shù)據(jù)庫中。
本文則提供了一種相對高效而智能的解決方案用以解析 excel 文件,并轉存入數(shù)據(jù)庫中。
Apache POI (POI-HSSF and POI-XSSF) 簡介
POI 是 Apache 基金組織的子項目,POI(Poor Obfuscation Implementation)的目標就是提供一組 Java API 來使得基于 Microsoft OLE 2 Compound Document 格式的 Microsoft Office 文件易于操作。 HSSF(Horrible Spreadsheet Format)是 POI 項目 Excel 文件格式(97 - 2007)的純 java 實現(xiàn),通過 HSSF,開發(fā)者可用純 Java 代碼來讀取、寫入、修改 Excel 文件。而 XSSF 則是 Excel 2007 OOXML(.xlsx) 文件格式的純 java 實現(xiàn)。
本文主要涉及到應用 HSSF 和 XSSF 讀取 Excel 文件中的數(shù)據(jù)。
如 何把 Excel 表里面的數(shù)據(jù)映射為關系數(shù)據(jù)庫表中的數(shù)據(jù)呢?關系數(shù)據(jù)庫中的二維表是結構化的數(shù)據(jù)存儲,而一個 Excel 文件的一個 Sheet 頁面就可能包含多個可映射為數(shù)據(jù)庫表結構的信息塊。這個信息塊可能很簡單,也可能非常復雜。在本文中,針對 Excel 中信息塊的實際情況,我們定義了幾種 Excel 文件到數(shù)據(jù)庫表的映射規(guī)則。這些規(guī)則就是我們用以解析的元數(shù)據(jù)。離開了這些元數(shù)據(jù),我們就談不上智能而高效的解析了。
映射規(guī)則一:單元格單一映射
Excel 表中的一個單元格(cell)對應關系數(shù)據(jù)庫中某一個模式(Schema)下一張表(Table)的一個域(Field)。 如: A1 -> name
映射規(guī)則二:單元格組合映射
Excel 表中的多個單元格對應關系數(shù)據(jù)庫中某一個模式(Schema)下一張表(Table)的一個域(Field)。 組合的方式是字符串的連接,比如 C1,C2, F3 -> address 。可以在映射規(guī)則里定義字符串的分隔符,例如,在上面的例子中是用逗號“,”組合的。
映射規(guī)則三:Excel 列的單一映射
Excel 表中的某一列的數(shù)據(jù)對應關系數(shù)據(jù)庫中某一個模式(Schema)下一張表(Table)的一個域(Field)的數(shù)據(jù)。和前面兩條規(guī)則相比較,該規(guī)則是將信息塊中行的記錄和數(shù)據(jù)庫中表的行記錄相對應起來的。例如 Column H -> 出口額。
映射規(guī)則四:Excel 列的組合映射
如 下圖 1 所示,Excel 表中的多列的數(shù)據(jù)組合對應關系數(shù)據(jù)庫中某一個模式(Schema)下一張表(Table)的一個域(Field)的數(shù)據(jù)。組合的方式是字符串數(shù)據(jù)的拼接, 分隔符也可以在映射規(guī)則中定義。例如 Column A, Column B, Column C -> 授信統(tǒng)計類型。
以上四種規(guī)則比較常用,但由于 Excel 文件中信息塊結構的復雜性,我們還可以根據(jù)需要定義其它的映射規(guī)則。(比如,Excel 文件以附近形式放置在 Domino 服務器上的,則可以結合 Domino 文檔中的域來定義映射規(guī)則)
讀者可能會問,如何自動的生成這些映射規(guī)則呢?完全自動的生成,是很難做到的。我們是應用 Symphony Container,構建復合應用程序輔助“專家”來生成映射規(guī)則的。換句話說,一定有一個“專家”需要根據(jù)領域業(yè)務需求,完成數(shù)據(jù)庫表的設計。在設計表的過程中,知 道那些 excel 文件里的信息塊需要提取出來?;谶@些知識,并利用一些輔助工具生成出映射規(guī)則元數(shù)據(jù)信息。
下面是基于 XML 語法結構的映射元數(shù)據(jù)片段,如清單 1 所示(如果是 Domino 的應用,可以創(chuàng)建 Domino 的文檔用以保存映射元數(shù)據(jù),進而應用 Notes 的 Java API 來解析)。
如圖 2 所示,本文介紹的框架程序有兩個入口,針對的是兩種情況(如果,這兩種情況都不是讀者所遇見的,比如 excel 文件是以大對象形式存儲在 Oracle 數(shù)據(jù)庫中,那么讀者需要自己寫解析器,拿到 excel 文件,本文略之)。
如 果 Excel 文件在文件系統(tǒng)中,則輸出 Agent 模塊是主程序。它首先獲取文件系統(tǒng)中的 Excel 文件,然后可以啟動多個線程去處理一批 Excel 文件。獲取 Excel 文件的類型和版本號,根據(jù) Excel 類型和版本號去獲取用以描述 Excel 和關系數(shù)據(jù)庫的映射元數(shù)據(jù),就是上節(jié)我們講述的內容。進而解析元數(shù)據(jù)構建元數(shù)據(jù)的內存模型。并且采用緩存機制,同一種類型,并且是同一種版本的 Excel 文件應用內存中已經構建好的元數(shù)據(jù)模型來解析,不必每次都去重新獲取元數(shù)據(jù)。這樣可以顯著的提高性能。
如 果 Excel 文件是存放在 Domino 服務器上的,則需要一個 Domino Agent 程序主動調用輸出 Agent 所提供的接口,批量的轉換用解析程序從 domino 數(shù)據(jù)文檔中解析出來的 excel 文件。
按照映射的元數(shù)據(jù)模型,應用 HSSF/XSSF 解析 Excel 的相應單元格、列,進而構造 SQL 語句(采用 JDBC 方式的模式)。在一個事務中提交該 Excel 文件所要執(zhí)行的所有 SQL 語句, 保證一個 Excel 文件寫入或者完全成功,或者出錯回滾,并報告錯誤信息。如清單 2 所示。
本 轉換框架具有很大的可擴展性,我們不局限于遺留系統(tǒng)中已有的 Excel 文件信息,遺留系統(tǒng)可以繼續(xù)使用,比如用戶可以繼續(xù)提交新類型的以 Excel 文件為存儲格式的數(shù)據(jù)信息。系統(tǒng)可以定期不定期的進行轉換工作。由圖 2 可見,該轉換框架清晰明了,是解決這類問題的一個通用模式。
在 Excel 解析的過程中,對于映射規(guī)則四,我們需要額外的算法支持。
在 映射規(guī)則四中,我們定義的規(guī)則是,Excel 表的多列對應關系數(shù)據(jù)庫中表的一個域。組合的方式是字符串的連接。問題是 Excel 表中,有很多單元格是合并的單元格,對于合并的單元格我們需要進行特殊的處理,目的是使得組合后的數(shù)據(jù)內容比較準確的表達了原 Excel 文件信息塊中的內容信息。清單 3 是 POI API 獲取 Excel 一個給定單元格值的程序。
對 于合并的單元格,應用上面的 API,除了左上角第一個單元格有值外,其它已經合并起來的單元格返回值均是 null 。 HSSF 的解析 API 中對此有一個類叫 CellRangeAddress,該類用以記錄 Excel 表中被合并(Merged)的一個區(qū)域。在程序中,我們只關心給定區(qū)域內的合并單元塊,這樣可以極大的提高性能,如清單 4 所示。
在清單 5 中,我們給出了如何獲取某一行內指定列的組合值。
本 文的解決方案不局限于 IBM DB2 數(shù)據(jù)庫,同時支持 MySQL 等若干數(shù)據(jù)庫。針對不同數(shù)據(jù)庫的數(shù)據(jù)類型,解析框架會動態(tài)的加載相應的類型配置文件,并對解析到的 Excel 信息作相應的修整(比如:DB2 數(shù)據(jù)庫某一字段的數(shù)據(jù)類型要求是 decimal 的 , 如果解析器取到的 excel 相應的內容是字符串格式的話,那么需要進行轉換,并保證一定的容錯性),從而保證生成正確的 SQL 語句信息。
本 文提供了一種解決Excel數(shù)據(jù)轉存數(shù)據(jù)庫的通用解決方案。重點介紹了幾種映射規(guī)則,這些規(guī)則都是最基本的,也是最常用的,讀者可以根據(jù)需要,基于此而設計更復雜的映射規(guī)則。同時本 文也著重介紹了,映射規(guī)則四的一些實現(xiàn)算法,希望能夠為被這類問題所困擾的同志們提供一些有價值的參考。
數(shù)據(jù)分析咨詢請掃描二維碼
若不方便掃碼,搜微信號:CDAshujufenxi
LSTM 模型輸入長度選擇技巧:提升序列建模效能的關鍵? 在循環(huán)神經網絡(RNN)家族中,長短期記憶網絡(LSTM)憑借其解決長序列 ...
2025-07-11CDA 數(shù)據(jù)分析師報考條件詳解與準備指南? ? 在數(shù)據(jù)驅動決策的時代浪潮下,CDA 數(shù)據(jù)分析師認證愈發(fā)受到矚目,成為眾多有志投身數(shù) ...
2025-07-11數(shù)據(jù)透視表中兩列相乘合計的實用指南? 在數(shù)據(jù)分析的日常工作中,數(shù)據(jù)透視表憑借其強大的數(shù)據(jù)匯總和分析功能,成為了 Excel 用戶 ...
2025-07-11尊敬的考生: 您好! 我們誠摯通知您,CDA Level I和 Level II考試大綱將于 2025年7月25日 實施重大更新。 此次更新旨在確保認 ...
2025-07-10BI 大數(shù)據(jù)分析師:連接數(shù)據(jù)與業(yè)務的價值轉化者? ? 在大數(shù)據(jù)與商業(yè)智能(Business Intelligence,簡稱 BI)深度融合的時代,BI ...
2025-07-10SQL 在預測分析中的應用:從數(shù)據(jù)查詢到趨勢預判? ? 在數(shù)據(jù)驅動決策的時代,預測分析作為挖掘數(shù)據(jù)潛在價值的核心手段,正被廣泛 ...
2025-07-10數(shù)據(jù)查詢結束后:分析師的收尾工作與價值深化? ? 在數(shù)據(jù)分析的全流程中,“query end”(查詢結束)并非工作的終點,而是將數(shù) ...
2025-07-10CDA 數(shù)據(jù)分析師考試:從報考到取證的全攻略? 在數(shù)字經濟蓬勃發(fā)展的今天,數(shù)據(jù)分析師已成為各行業(yè)爭搶的核心人才,而 CDA(Certi ...
2025-07-09【CDA干貨】單樣本趨勢性檢驗:捕捉數(shù)據(jù)背后的時間軌跡? 在數(shù)據(jù)分析的版圖中,單樣本趨勢性檢驗如同一位耐心的偵探,專注于從單 ...
2025-07-09year_month數(shù)據(jù)類型:時間維度的精準切片? ? 在數(shù)據(jù)的世界里,時間是最不可或缺的維度之一,而year_month數(shù)據(jù)類型就像一把精準 ...
2025-07-09CDA 備考干貨:Python 在數(shù)據(jù)分析中的核心應用與實戰(zhàn)技巧? ? 在 CDA 數(shù)據(jù)分析師認證考試中,Python 作為數(shù)據(jù)處理與分析的核心 ...
2025-07-08SPSS 中的 Mann-Kendall 檢驗:數(shù)據(jù)趨勢與突變分析的有力工具? ? ? 在數(shù)據(jù)分析的廣袤領域中,準確捕捉數(shù)據(jù)的趨勢變化以及識別 ...
2025-07-08備戰(zhàn) CDA 數(shù)據(jù)分析師考試:需要多久?如何規(guī)劃? CDA(Certified Data Analyst)數(shù)據(jù)分析師認證作為國內權威的數(shù)據(jù)分析能力認證 ...
2025-07-08LSTM 輸出不確定的成因、影響與應對策略? 長短期記憶網絡(LSTM)作為循環(huán)神經網絡(RNN)的一種變體,憑借獨特的門控機制,在 ...
2025-07-07統(tǒng)計學方法在市場調研數(shù)據(jù)中的深度應用? 市場調研是企業(yè)洞察市場動態(tài)、了解消費者需求的重要途徑,而統(tǒng)計學方法則是市場調研數(shù) ...
2025-07-07CDA數(shù)據(jù)分析師證書考試全攻略? 在數(shù)字化浪潮席卷全球的當下,數(shù)據(jù)已成為企業(yè)決策、行業(yè)發(fā)展的核心驅動力,數(shù)據(jù)分析師也因此成為 ...
2025-07-07剖析 CDA 數(shù)據(jù)分析師考試題型:解鎖高效備考與答題策略? CDA(Certified Data Analyst)數(shù)據(jù)分析師考試作為衡量數(shù)據(jù)專業(yè)能力的 ...
2025-07-04SQL Server 字符串截取轉日期:解鎖數(shù)據(jù)處理的關鍵技能? 在數(shù)據(jù)處理與分析工作中,數(shù)據(jù)格式的規(guī)范性是保證后續(xù)分析準確性的基礎 ...
2025-07-04CDA 數(shù)據(jù)分析師視角:從數(shù)據(jù)迷霧中探尋商業(yè)真相? 在數(shù)字化浪潮席卷全球的今天,數(shù)據(jù)已成為企業(yè)決策的核心驅動力,CDA(Certifie ...
2025-07-04CDA 數(shù)據(jù)分析師:開啟數(shù)據(jù)職業(yè)發(fā)展新征程? ? 在數(shù)據(jù)成為核心生產要素的今天,數(shù)據(jù)分析師的職業(yè)價值愈發(fā)凸顯。CDA(Certified D ...
2025-07-03