劉超
(南充廣播電視大學,四川 南充 637000)
基于C#語言直接讀取大量表格文件實踐操作的探討
劉超
(南充廣播電視大學,四川 南充 637000)
本文討論了如何對大量結(jié)構(gòu)相似的excel文件進行同時讀寫,并轉(zhuǎn)為另一種格式的常用方法.詳細的探討了如何使用com組件來對excel進行讀寫,避開文件中的隱藏行列,所見即所得,從而保證工作中的數(shù)據(jù)得到較好的保存與轉(zhuǎn)換.
c#;Excel;讀取;轉(zhuǎn)換
很多企事業(yè)機構(gòu)的日常工作中,由于各種企業(yè)應用系統(tǒng)無法完全覆蓋所有功能需要,或新老系統(tǒng)不同步,出現(xiàn)大量相同格式的表格重復出現(xiàn),對這類表格中的數(shù)據(jù)進行收集整理時,常常會遇到很多困難,比如不是標準格式無法導入數(shù)據(jù)庫,或者無法與其他的數(shù)據(jù)表格進行比對等等,嚴重降低了工作效率.這個問題的解決最好通過某種簡便的方式來進行轉(zhuǎn)化,讀取其中的數(shù)據(jù),轉(zhuǎn)化成另一種格式,來進行處理.本次的討論中避開了將表格導入數(shù)據(jù)庫中使用,因為在日常辦公中,對數(shù)據(jù)庫的使用進行推廣到一般員工還有很大的困難.本文只討論格式的轉(zhuǎn)化.
對于處理對于日常行政工作,涉及的面廣點多,選取開發(fā)語言就要能適應多種應用,比如WINDOWS窗體應用,WINDOWS應用程序,WEB應用程序,數(shù)據(jù)庫應用,表格文檔應用等等,需用語言有較為均衡的開發(fā)能力.C#恰恰應時而生.C#是微軟開發(fā)基于.net框架的一個面向?qū)ο蟮木幊陶Z言.和java同屬于C/C++家族,有很多相似性,易于學習.其源碼會編譯成msil在運行,與com是直接集成的,效率高,有很好的通用性.
編輯環(huán)境使用Microsoft Visual Studio2013版,它提供了高級開發(fā)工具,調(diào)試功能,數(shù)據(jù)庫功能,易于在各種平臺快速的開發(fā)應用程序.可以方便用于開發(fā)高性能的Windows應用程序,移動應用程序,網(wǎng)絡應用/服務程序,智能設備的應用程序等等.
在本項目中,C#讀寫的文件是文件夾中大量具有相同格式的表格.讀取文件后將讀出的內(nèi)容放入按要求格式生成的文件中.程序流程圖如圖3-1.
3.1 系統(tǒng)的架構(gòu)分析
本項目為一個windows桌面應用程序,由頂層向下逐步開發(fā).過程中使用多個button控件,來控制文件的讀取過程,詳細流程如下圖:
圖3-1
圖3-2
3.2 讀取中的問題一
讀取表格中文件,個別文件中會有多個sheet文件,由于做表中對文件歸類的習慣,許多工作人員會把多個文件合成到一個文件中,以多個sheet表的形式存儲.這樣文件夾中的文件既有只含一個可用sheet的文件,也有含多個sheet的文件.首先
3.3 讀取中的問題二
Excel文件中會有隱藏行列.一般情況下,表格制作人并不希望將表格中隱藏的項目讀出,但隱藏的行列代表以后會用,但現(xiàn)在不會用,所以不能刪除,且不能讀出來.
解決這個問題的方法就是對行列添加標記flag,在flag為真的情況下,讀取該行列,否則不讀取.設置判斷if (flagShowRow[t]==0)continue;
讀取文件之前首先對文件進行一遍預讀取,對隱藏的列進行標記
對待隱藏的行也是采取同樣的方式.
3.4 讀取中的問題三
因為一次讀取的文件比較多,兼顧效率的情況下使用是數(shù)組為二維數(shù)組.由于excel中的文件是人為操作的,所以不可避免里面會有各種無意間添加進去的內(nèi)容,比如空格.這種情況下,我們收集對比表格中的數(shù)據(jù)時采用截取其中的部分內(nèi)容,讀掉了空格的內(nèi)容.
在對多個文件,多個sheet,隱藏行列進行過分析標注后,文件內(nèi)容的讀取就相對簡單一些.在判斷是否為需要的數(shù)據(jù)之后,調(diào)用讀入程序,將需要的數(shù)據(jù)用大數(shù)組進行存儲resultOfExtract(Flag, resultOfColumnExtr, numOfColumn, classInfo, OleDsExcle.Tables[i].Rows[t][1].ToString(),OleDsExcle.Tables[i].Rows[t][0].ToString() ,
3.5 寫入固定格式的表格
所有需要讀取得內(nèi)容全部放在數(shù)組中,將數(shù)組直接寫入的文件即可,使用定義類:System.IO.StreamWriter sw= new System.IO.StreamWriter("d:/sheet1.xls",true,System.Text.Encoding.Default);
以字符串的方式寫入文件
3.6 程序讀取過程的顯示
程序讀取的過程在屏幕上顯示出來,細心的員工會在這個過程簡單的發(fā)現(xiàn)一些問題,所以讀取的過程使用了DataGridViewRowPostPaintEventArgs類來進行顯示控制.
圖3-3 程序運行效果圖
3.7 讀取結(jié)果
讀取完成后,自定義生成的文件名,格式一般為.exl,為一般的wps和office可以打開的文件.輸出結(jié)果正確.本文將具有復雜表頭,三維數(shù)據(jù)表格轉(zhuǎn)化成二維數(shù)據(jù)表格,方便了下一步的比對或者輸入數(shù)據(jù)庫的工作.
計算機技術(shù)的應用和發(fā)展不光是發(fā)展出新的應用或者算法,更主要的是用來解決實際工作的復雜問題,提高工作效率,從吸引眼球?qū)m椊鉀Q人們?nèi)粘9ぷ髦杏龅降膹碗s問題.由于需求分析的復雜,常常只有深入這個工作的員工才能更好的做出需求分析,如果基層員工能有較高的技術(shù)水平解決這些問題,那就是最好的方案.
該項目的從立項到完成大概花費了五個月的時間,其中感慨最大的是數(shù)據(jù)來源的不確定性和統(tǒng)一化的處理.在相互的退讓中,程序進行了相當大的修改與完善,肯定在以后的使用過程還會有跟多的完善與值得思考的地方.
微軟給我們提供一個很好的語言,一個很好的平臺,在這個平臺上我們可以解決實際工作中的很多問題.希望早日有國產(chǎn)的語言和平臺來滿足我們的日常開發(fā)需要.
〔1〕龍馬高新教育.c#從入門到精通[M].北京:人民郵電出版社,2015.
〔2〕ScoRAllen,Syad Fahad Gilani.c#數(shù)據(jù)庫入門經(jīng)典[M].北京:清華大學出版社,2003.
〔3〕Simon Robinson,K ScoRAllen.中高級編程[M].北京:清華大學出版社,2007.
TP312
A
1673-260X(2016)12-0017-02
2016-10-21
本文系四川廣播電視大學教改項目(XMKYC2016011Y)研究成果