最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

C#實(shí)現(xiàn)讀取Word表格到DataSet

 更新時(shí)間:2023年12月26日 08:56:04   作者:初九之潛龍勿用  
在應(yīng)用項(xiàng)目里,多數(shù)情況下我們會(huì)遇到導(dǎo)入 Excel 文件數(shù)據(jù)到數(shù)據(jù)庫(kù)的功能需求,但某些情況下,也存在使用 Word 進(jìn)行表格數(shù)據(jù)編輯的情況,這其中也包括導(dǎo)入Word內(nèi)容的功能,比如表格數(shù)據(jù)導(dǎo)出到DataSet數(shù)據(jù)集,本文將給大家介紹了C#讀取Word表格到DataSet

功能需求

在應(yīng)用項(xiàng)目里,多數(shù)情況下我們會(huì)遇到導(dǎo)入 Excel 文件數(shù)據(jù)到數(shù)據(jù)庫(kù)的功能需求,但某些情況下,也存在使用 Word 進(jìn)行表格數(shù)據(jù)編輯的情況。Word 和 Excel 其實(shí)各有特點(diǎn),用戶的習(xí)慣不同,即使同一數(shù)據(jù)源,可能提供的數(shù)據(jù)源文件類型也不同,這其中也包括導(dǎo)入Word內(nèi)容的功能,比如表格數(shù)據(jù)導(dǎo)出到DataSet數(shù)據(jù)集。

Office 數(shù)據(jù)源的一些映射關(guān)系

下圖是一個(gè)簡(jiǎn)單的 Office 數(shù)據(jù)源的映射關(guān)系:

1、第一層級(jí)比如 WORD / EXCEL 為應(yīng)用層級(jí)(Application)、 DATASET / DATABASE 為數(shù)據(jù)容器

2、第二層級(jí),比如WORD 包含一個(gè)文檔對(duì)象(Docment)、Excel 包含一個(gè)工作簿對(duì)象(WorkBook)、DataSet / DataBase 包括一組數(shù)據(jù)表對(duì)象(Tables)

3、第三層級(jí),比如Word里的表格對(duì)象(Table)、Excel里的工作表對(duì)象(Sheet)

最實(shí)際的工作任務(wù),是要將Table或Sheet對(duì)象的二維數(shù)據(jù)對(duì)應(yīng)導(dǎo)出生成到 DataSet 里的 Table 對(duì)象,如果有多個(gè)則生成對(duì)應(yīng)的集合。最后我們可能會(huì)再次導(dǎo)出到 DataBase 的數(shù)據(jù)表集合里(Tables)。

范例運(yùn)行環(huán)境

操作系統(tǒng): Windows Server 2019 DataCenter

操作系統(tǒng)上安裝 Office Word 2016

.net版本: .netFramework4.7.1 或以上

開發(fā)工具:VS2019  C#

配置Office DCOM

對(duì)于安裝原生Office應(yīng)用,我們需要對(duì)DCOM進(jìn)行進(jìn)一步的配置方可使用其API。

打開控制面板、管理工具、組件服務(wù):

點(diǎn)擊組件服務(wù)、計(jì)算機(jī)、我的電腦、DCOM配置 

找到 Microsoft Word97-2003 文檔應(yīng)用程序

選擇屬性、打開標(biāo)識(shí)選項(xiàng)卡、選擇下列用戶選項(xiàng),設(shè)置啟動(dòng)Word應(yīng)用的用戶,點(diǎn)確定即可。

理論上設(shè)置到這里就可以了,但以防萬(wàn)一,可以繼續(xù)設(shè)置啟動(dòng)權(quán)限,選擇安全選項(xiàng)卡、啟動(dòng)和激活權(quán)限,如下圖:

關(guān)鍵代碼

組件庫(kù)引入

核心代碼

public DataSet WordAsDataSet(string _filename) 方法,傳入要讀取的 WORD 文件路徑即可,方法會(huì)遍歷該WORD里的TABLES對(duì)象集合,如果找到TABLE對(duì)象,則按列的順序創(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)建一個(gè)名為WordApp的組件對(duì)象
            DateTime beforetime = DateTime.Now;
            Word.Application WordApp = new Word.Application();
            //創(chuàng)建一個(gè)名為WordDoc的文檔對(duì)象
            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)閉顯示拼寫錯(cuò)誤提示框
 
            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組件對(duì)象
            WordApp.Quit(ref Nothing, ref Nothing, ref Nothing);
 
            KillProcessByStartTime("WINWORD", beforetime, aftertime);
 
            return ds;
        }

殺掉進(jìn)程

這是一個(gè)無(wú)奈之舉,嘗試了一些方法,但某些情況下仍然無(wú)法釋放掉 Word 應(yīng)用進(jìn)程,因此根據(jù)時(shí)間點(diǎn)范圍寫了一個(gè)強(qiáng)制殺掉進(jìn)程的方法。

示例代碼如下:

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é)

在實(shí)際的應(yīng)用中,無(wú)論是導(dǎo)入的文件格式還是導(dǎo)出的數(shù)據(jù)源,都是要結(jié)合客戶的需求進(jìn)行的。

在功能實(shí)現(xiàn)前,需要約定模板文件的格式,字段內(nèi)容的意義、長(zhǎng)度等。導(dǎo)入到 DataSet 成功后,再根據(jù)業(yè)務(wù)邏輯進(jìn)行后續(xù)操作再加工,或直接導(dǎo)入到規(guī)范的數(shù)據(jù)表里(如 MS SQL SERVER)。

這些代碼我們提供了一些操作WORD相關(guān)的關(guān)鍵方法,這里僅作參考,歡迎大家評(píng)論指教!

以上就是C#實(shí)現(xiàn)讀取Word表格到DataSet的詳細(xì)內(nèi)容,更多關(guān)于C#讀取Word到DataSet的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • C# 字符串處理小工具

    C# 字符串處理小工具

    本文主要介紹C#字符串處理小工具,實(shí)現(xiàn)功能包括:轉(zhuǎn)換為大寫;轉(zhuǎn)換為小寫;反轉(zhuǎn)字符串;匹配某字符串出現(xiàn)次數(shù);正則匹配;base64加密;base64解密;ROT13加密解密;MD5 32位加密。具有很好的參考價(jià)值。下面跟著小編一起來(lái)看下吧
    2017-03-03
  • 淺談C#六大設(shè)計(jì)原則

    淺談C#六大設(shè)計(jì)原則

    這篇文章主要介紹了C#六大設(shè)計(jì)原則的相關(guān)內(nèi)容,文中代碼非常細(xì)致,供大家參考和學(xué)習(xí),感興趣的朋友可以了解下
    2020-06-06
  • C# 6.0的屬性(Property)的語(yǔ)法與初始值詳解

    C# 6.0的屬性(Property)的語(yǔ)法與初始值詳解

    下面小編就為大家?guī)?lái)一篇C# 6.0的屬性(Property)的語(yǔ)法與初始值詳解。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2016-07-07
  • c# SendMail發(fā)送郵件實(shí)例代碼

    c# SendMail發(fā)送郵件實(shí)例代碼

    這篇文章介紹了c# SendMail發(fā)送郵件實(shí)例代碼,有需要的朋友可以參考一下
    2013-09-09
  • C#帶你玩掃雷(附源碼)

    C#帶你玩掃雷(附源碼)

    這篇文章主要介紹了C#帶你玩掃雷(附源碼),詳細(xì)的介紹實(shí)現(xiàn)掃雷的方法,具體一定的參考價(jià)值,有興趣的可以了解一下
    2017-10-10
  • C#控制Excel Sheet使其自適應(yīng)頁(yè)寬與列寬的方法

    C#控制Excel Sheet使其自適應(yīng)頁(yè)寬與列寬的方法

    這篇文章主要介紹了C#控制Excel Sheet使其自適應(yīng)頁(yè)寬與列寬的方法,涉及C#操作Excel的相關(guān)技巧,具有一定參考借鑒價(jià)值,需要的朋友可以參考下
    2016-06-06
  • C#如何綁定多個(gè)按鈕到同一個(gè)事件

    C#如何綁定多個(gè)按鈕到同一個(gè)事件

    這篇文章主要介紹了C#如何綁定多個(gè)按鈕到同一個(gè)事件,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-04-04
  • C#查看/寫入日志到Windows事件查看器的操作方法

    C#查看/寫入日志到Windows事件查看器的操作方法

    Windows 操作系統(tǒng)將與計(jì)算機(jī)的系統(tǒng)性能、應(yīng)用程序和安全方面相關(guān)的每個(gè)事件記錄在 C:\WINDOWS\system32\winevt 的日志中,事件查看器從這些原始事件日志中讀取信息,然后以可讀格式呈現(xiàn)信息,本文介紹了C#如何查看/寫入日志到Windows事件查看器,需要的朋友可以參考下
    2024-09-09
  • C#中兩個(gè)byte如何相加

    C#中兩個(gè)byte如何相加

    可能有的看到這個(gè)題目就會(huì)覺得這不簡(jiǎn)單嗎?直接用+號(hào)相加就行了,可是當(dāng)你實(shí)際操作運(yùn)行的時(shí)候就會(huì)發(fā)現(xiàn)有錯(cuò)誤了,那么是什么錯(cuò)誤?那該如何讓C#中兩個(gè)byte相加呢?通過(guò)下面這篇文章來(lái)一起學(xué)習(xí)學(xué)習(xí)吧。
    2016-11-11
  • C#實(shí)現(xiàn)身份證實(shí)名認(rèn)證接口的示例代碼

    C#實(shí)現(xiàn)身份證實(shí)名認(rèn)證接口的示例代碼

    身份證實(shí)名認(rèn)證,即通過(guò)姓名和身份證號(hào)校驗(yàn)個(gè)人信息的匹配程度,廣泛應(yīng)用于金融、互聯(lián)網(wǎng)等多個(gè)領(lǐng)域,本文主要介紹了C#實(shí)現(xiàn)身份證實(shí)名認(rèn)證接口的示例代碼,感興趣的可以了解一下
    2024-09-09

最新評(píng)論

丰城市| 大新县| 南靖县| 马山县| 文水县| 新宾| 山西省| 曲靖市| 青铜峡市| 含山县| 宣威市| 盱眙县| 大悟县| 固镇县| 克什克腾旗| 乐业县| 抚远县| 河东区| 桦甸市| 饶河县| 大余县| 将乐县| 当涂县| 乌兰浩特市| 疏附县| 霍州市| 禄劝| 曲水县| 武穴市| 阜阳市| 南投市| 陆川县| 镇沅| 吉安县| 思南县| 肥城市| 上犹县| 保亭| 临高县| 额尔古纳市| 大名县|