最近部門有一個(gè)海外客戶,需要我們提供英文的結(jié)算單,由于國內(nèi)的柜臺(tái)系統(tǒng)只有提供中文版的結(jié)算單,所以只能通過柜臺(tái)導(dǎo)出所需要的基礎(chǔ)數(shù)據(jù),然后轉(zhuǎn)換為英文版的結(jié)算單。因?yàn)榛A(chǔ)數(shù)據(jù)是csv結(jié)尾的文件,所以我就想能夠通過把csv文件導(dǎo)入到Excel或Access中(也可以導(dǎo)入到SQL Server數(shù)據(jù)庫中),然后再獲取相應(yīng)的列數(shù)據(jù),對(duì)其進(jìn)行中英文轉(zhuǎn)換。 具體轉(zhuǎn)換細(xì)節(jié)就不做介紹了,今天主要為大家介紹如何從Excel文件或Access數(shù)據(jù)庫中獲取指定列數(shù)據(jù)。其實(shí)微軟提供2種引擎可供在不打開Excel和Access的情況下獲取數(shù)據(jù)。分別是Microsoft.Jet.OLEDB.4.0(以下簡(jiǎn)稱 Jet 引擎)和Microsoft.ACE.OLEDB.12.0(以下簡(jiǎn)稱 ACE 引擎)。 在測(cè)試過程中,我發(fā)現(xiàn)以上兩個(gè)引擎都可以用來訪問Excel擴(kuò)展名為*.xlsm文件。但Jet引擎只能用于訪問擴(kuò)展名為.mdb的Access文件,ACE引擎既可以訪擴(kuò)展名為.mdb的Access文件,也可以訪問擴(kuò)展名為.accdb的Access文件。 為了更加直觀的演示,我制作了一個(gè)虛擬數(shù)據(jù),數(shù)據(jù)內(nèi)容如下圖所示: 通過上圖可以看出,Sheet1工作表中有5列11行數(shù)據(jù),如果制作的報(bào)表中只需要其中的姓名、學(xué)號(hào)、身份證以及出生日期。那該如何操作呢?其中姓名、學(xué)號(hào)和身份證3列可以直接從上圖中獲取,出生日期列需要經(jīng)過截取而來。 從Excel中獲取數(shù)據(jù),可以通過以下代碼實(shí)現(xiàn),代碼如下:
核心的代碼就是使用Jet和ACE引擎,上段代碼的作用是從當(dāng)前打開的工作簿Sheet1工作表中獲取姓名、學(xué)號(hào)、身份證以及出生日期信息。其中出生日期信息通過對(duì)身份證列進(jìn)行mid截取,再把得到的列通過as關(guān)鍵詞變更列名為出生日期。 上面的代碼放入模塊后,按下F5或點(diǎn)擊綠色圖標(biāo)會(huì)提示如下錯(cuò)誤(如果正常運(yùn)行請(qǐng)忽略,第一次使用會(huì)出現(xiàn)): 出現(xiàn)上圖的錯(cuò)誤是由于Excel VBE中未引用相應(yīng)的Library,可以通過【工具】→【引用】,勾選類似【Microsoft ActiveX Data Objects *.*】并點(diǎn)擊確定。我這里是Microsoft ActiveX Data Objects 6.1,根據(jù)各位小伙伴安裝的Office版本的不同,版本號(hào)也會(huì)不同。 前期準(zhǔn)備完成后,我們一起來看看該段代碼如何運(yùn)作的,詳見如下動(dòng)態(tài)圖: 其實(shí)對(duì)于conn.ConnectionString也可以使用ACE引擎,把Jet引擎注釋掉即可,可以獲得同樣的效果。 為了充分演示Jet和ACE引擎,我特地建立了2個(gè)Access文件,除了文件格式不一樣外,里面的數(shù)據(jù)都是一樣的,如下圖所示: 為了演示Jet和ACE引擎的區(qū)別,如下動(dòng)態(tài)圖分別使用ACE和Jet引擎來連接.accdb和.mdb文件,效果如下: 通過對(duì)比,可以發(fā)現(xiàn)使用ACE引擎可以連接.accdb和.mdb文件,但Jet引擎只能連接.mdb文件,當(dāng)連接.accdb文件的時(shí)候,提示不可識(shí)別的數(shù)據(jù)庫格式,如下圖所示: 通過上面的介紹,已經(jīng)能夠從導(dǎo)出的數(shù)據(jù)中有條件的篩選出所需要的列數(shù)據(jù),然后需要做的就是對(duì)其進(jìn)行中文翻譯英文即可。 |
|