C#實現(xiàn)讀取Word表格到DataSet
功能需求
在應(yīng)用項目里,多數(shù)情況下我們會遇到導(dǎo)入 Excel 文件數(shù)據(jù)到數(shù)據(jù)庫的功能需求,但某些情況下,也存在使用 Word 進行表格數(shù)據(jù)編輯的情況。Word 和 Excel 其實各有特點,用戶的習(xí)慣不同,即使同一數(shù)據(jù)源,可能提供的數(shù)據(jù)源文件類型也不同,這其中也包括導(dǎo)入Word內(nèi)容的功能,比如表格數(shù)據(jù)導(dǎo)出到DataSet數(shù)據(jù)集。
Office 數(shù)據(jù)源的一些映射關(guān)系
下圖是一個簡單的 Office 數(shù)據(jù)源的映射關(guān)系:
1、第一層級比如 WORD / EXCEL 為應(yīng)用層級(Application)、 DATASET / DATABASE 為數(shù)據(jù)容器
2、第二層級,比如WORD 包含一個文檔對象(Docment)、Excel 包含一個工作簿對象(WorkBook)、DataSet / DataBase 包括一組數(shù)據(jù)表對象(Tables)
3、第三層級,比如Word里的表格對象(Table)、Excel里的工作表對象(Sheet)
最實際的工作任務(wù),是要將Table或Sheet對象的二維數(shù)據(jù)對應(yīng)導(dǎo)出生成到 DataSet 里的 Table 對象,如果有多個則生成對應(yīng)的集合。最后我們可能會再次導(dǎo)出到 DataBase 的數(shù)據(jù)表集合里(Tables)。
范例運行環(huán)境
操作系統(tǒng): Windows Server 2019 DataCenter
操作系統(tǒng)上安裝 Office Word 2016
.net版本: .netFramework4.7.1 或以上
開發(fā)工具:VS2019 C#
配置Office DCOM
對于安裝原生Office應(yīng)用,我們需要對DCOM進行進一步的配置方可使用其API。
打開控制面板、管理工具、組件服務(wù):
點擊組件服務(wù)、計算機、我的電腦、DCOM配置
找到 Microsoft Word97-2003 文檔應(yīng)用程序
選擇屬性、打開標識選項卡、選擇下列用戶選項,設(shè)置啟動Word應(yīng)用的用戶,點確定即可。
理論上設(shè)置到這里就可以了,但以防萬一,可以繼續(xù)設(shè)置啟動權(quán)限,選擇安全選項卡、啟動和激活權(quán)限,如下圖:
關(guān)鍵代碼
組件庫引入
核心代碼
public DataSet WordAsDataSet(string _filename) 方法,傳入要讀取的 WORD 文件路徑即可,方法會遍歷該WORD里的TABLES對象集合,如果找到TABLE對象,則按列的順序創(chuàng)建字段列,比如F1、F2...Fn,以些類推,從第二行起為記錄行,則根據(jù)創(chuàng)建的結(jié)構(gòu)寫入到 DataTable中。
public DataSet WordAsDataSet(string _filename) { DataSet ds = new DataSet(); Object Nothing = System.Reflection.Missing.Value; object filename = _filename; //創(chuàng)建一個名為WordApp的組件對象 DateTime beforetime = DateTime.Now; Word.Application WordApp = new Word.Application(); //創(chuàng)建一個名為WordDoc的文檔對象 WordApp.DisplayAlerts = Word.WdAlertLevel.wdAlertsNone; Word.Document WordDoc = WordApp.Documents.Open(ref filename, ref Nothing, ref Nothing, ref Nothing, ref Nothing, ref Nothing, ref Nothing, ref Nothing, ref Nothing, ref Nothing, ref Nothing, ref Nothing, ref Nothing, ref Nothing, ref Nothing, ref Nothing); WordDoc.SpellingChecked = false;//關(guān)閉拼寫檢查 WordDoc.ShowSpellingErrors = false;//關(guān)閉顯示拼寫錯誤提示框 DateTime aftertime = DateTime.Now; //遍歷所有的Word里的表格,并寫到數(shù)據(jù)集的TABLES集合里 foreach (Word.Table wTable in WordDoc.Tables) { System.Data.DataTable dt = new System.Data.DataTable(); for (int colPos = 1; colPos <= wTable.Columns.Count; colPos++) { DataColumn dc = new DataColumn(); dc.ColumnName = "F" + colPos.ToString(); dt.Columns.Add(dc); } for (int rowPos = 1; rowPos <= wTable.Rows.Count; rowPos++) { DataRow drNew = dt.NewRow(); int columnIndex = 0; foreach (Word.Cell cellObj in wTable.Rows[rowPos].Cells) { drNew[columnIndex] = cellObj.Range.Text.Remove(cellObj.Range.Text.Length - 2, 2);//remove \r\a columnIndex++; } dt.Rows.Add(drNew); } ds.Tables.Add(dt); } WordDoc.Close(ref Nothing, ref Nothing, ref Nothing); //關(guān)閉WordApp組件對象 WordApp.Quit(ref Nothing, ref Nothing, ref Nothing); KillProcessByStartTime("WINWORD", beforetime, aftertime); return ds; }
殺掉進程
這是一個無奈之舉,嘗試了一些方法,但某些情況下仍然無法釋放掉 Word 應(yīng)用進程,因此根據(jù)時間點范圍寫了一個強制殺掉進程的方法。
示例代碼如下:
public string KillProcessByStartTime(string processName,DateTime beforetime,DateTime aftertime) { Process[] ps = Process.GetProcesses(); foreach (Process p in ps) { if(p.ProcessName.ToUpper()!=processName) continue; if(p.StartTime > beforetime && p.StartTime < aftertime) { try { p.Kill(); } catch(Exception e) { return e.Message; } } } return ""; }
總結(jié)
在實際的應(yīng)用中,無論是導(dǎo)入的文件格式還是導(dǎo)出的數(shù)據(jù)源,都是要結(jié)合客戶的需求進行的。
在功能實現(xiàn)前,需要約定模板文件的格式,字段內(nèi)容的意義、長度等。導(dǎo)入到 DataSet 成功后,再根據(jù)業(yè)務(wù)邏輯進行后續(xù)操作再加工,或直接導(dǎo)入到規(guī)范的數(shù)據(jù)表里(如 MS SQL SERVER)。
這些代碼我們提供了一些操作WORD相關(guān)的關(guān)鍵方法,這里僅作參考,歡迎大家評論指教!
以上就是C#實現(xiàn)讀取Word表格到DataSet的詳細內(nèi)容,更多關(guān)于C#讀取Word到DataSet的資料請關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
Winform?控件優(yōu)化LayeredWindow無鋸齒圓角窗體
這篇文章主要為大家介紹了Winform?控件優(yōu)化LayeredWindow實現(xiàn)無鋸齒圓角窗體示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2022-09-09C#數(shù)據(jù)結(jié)構(gòu)之堆棧(Stack)實例詳解
這篇文章主要介紹了C#數(shù)據(jù)結(jié)構(gòu)之堆棧(Stack),結(jié)合實例形式較為詳細的分析了堆棧的原理與C#實現(xiàn)堆棧功能的相關(guān)技巧,具有一定參考借鑒價值,需要的朋友可以參考下2015-11-11C#實現(xiàn)的4種常用數(shù)據(jù)校驗方法小結(jié)(CRC校驗,LRC校驗,BCC校驗,累加和校驗)
本文主要介紹了C#實現(xiàn)的4種常用數(shù)據(jù)校驗方法小結(jié)(CRC校驗,LRC校驗,BCC校驗,累加和校驗),文中通過示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下2022-03-03詳解WPF如何在Panel中實現(xiàn)設(shè)置所有子項間距
這篇文章主要為大家詳細介紹了WPF如何在Panel中實現(xiàn)設(shè)置所有子項間距,本文借鑒了 Qt 中的 Spacing 設(shè)置方法,感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下2024-10-10