国产日韩欧美一区二区三区三州_亚洲少妇熟女av_久久久久亚洲av国产精品_波多野结衣网站一区二区_亚洲欧美色片在线91_国产亚洲精品精品国产优播av_日本一区二区三区波多野结衣 _久久国产av不卡

?

基于.Net的Excel和數(shù)據(jù)庫(kù)數(shù)據(jù)轉(zhuǎn)換

2013-04-29 00:44:03王毅飛
計(jì)算機(jī)時(shí)代 2013年5期
關(guān)鍵詞:數(shù)據(jù)庫(kù)

摘 要: 根據(jù)軍事理論練習(xí)系統(tǒng)的需求,分析了將Excel電子表格中的試題數(shù)據(jù)導(dǎo)入到Access數(shù)據(jù)庫(kù)中,以及將學(xué)生成績(jī)等信息導(dǎo)出到Excel電子表格的原理和方法,并應(yīng)用于實(shí)際解決方案,有效提高了工作效率。

關(guān)鍵詞: .Net; Excel; 數(shù)據(jù)庫(kù); 數(shù)據(jù)轉(zhuǎn)換

中圖分類(lèi)號(hào):TP393 文獻(xiàn)標(biāo)志碼:A 文章編號(hào):1006-8228(2013)05-33-04

Conversion of Excel and data in the database based on .NET

——take military theory practice system as an example

Wang Yilfei

(Comprehensive experimental teaching center of arts, Zhejiang normal university, Jinhua, Zhejiang 321004, China)

Abstract: According to requirements of the military practice theory system, the principles of importing the data of examination questions to Access database and exporting the students' information, such as marks to the spreadsheet of Excel, are analyzed. These principles, which can improve the working efficiency, are applied to the practical solutions.

Key words: .Net; Excel; database; data conversion

0 引言

軍事理論練習(xí)系統(tǒng)是在浙江省軍事理論教育基礎(chǔ)上,供學(xué)生練習(xí)軍事理論知識(shí)的系統(tǒng)。通過(guò)練習(xí)可使學(xué)生掌握相關(guān)軍事理論基礎(chǔ)知識(shí),增強(qiáng)學(xué)生國(guó)防、愛(ài)國(guó)意識(shí)。

該系統(tǒng)是一個(gè)基于Web的.NET應(yīng)用程序,數(shù)據(jù)庫(kù)服務(wù)器采用Access數(shù)據(jù)庫(kù)。在開(kāi)發(fā)該系統(tǒng)時(shí),原始試題庫(kù)是以Excle電子表格格式(.xls)存在,并且需要將學(xué)生成績(jī)導(dǎo)出到Excle電子表格中,因此手工操作任務(wù)繁重,效率低下。故需要實(shí)現(xiàn)Excle電子表格和Access數(shù)據(jù)庫(kù)之間的數(shù)據(jù)轉(zhuǎn)換。

1 .Net中數(shù)據(jù)轉(zhuǎn)換的原理分析

本文將Excel電子表格中的數(shù)據(jù)提取到Access數(shù)據(jù)庫(kù)中的過(guò)程稱(chēng)為數(shù)據(jù)的導(dǎo)入,反之將Access數(shù)據(jù)庫(kù)中的數(shù)據(jù)提取到Excel電子表格的數(shù)據(jù)稱(chēng)為數(shù)據(jù)的導(dǎo)出,通過(guò).Net平臺(tái)實(shí)現(xiàn),基本框架如圖1所示。

[數(shù)據(jù)庫(kù)] [.NET平臺(tái)] [Excel]

圖1

1.1 從Excel表格中導(dǎo)入數(shù)據(jù)至數(shù)據(jù)庫(kù)

1.1.1 使用數(shù)據(jù)庫(kù)管理工具實(shí)現(xiàn)

某些數(shù)據(jù)庫(kù)管理工具會(huì)提供相應(yīng)的工具,將Excel電子表格的數(shù)據(jù)導(dǎo)入到相應(yīng)的數(shù)據(jù)庫(kù)中,如Sql Server 2000提供了“導(dǎo)入數(shù)據(jù)”功能,通過(guò)DTS 導(dǎo)入/導(dǎo)出向?qū)?,方便?shí)現(xiàn)數(shù)據(jù)的導(dǎo)入。

1.1.2 編寫(xiě)代碼實(shí)現(xiàn)

通過(guò).NET編寫(xiě)代碼也可實(shí)現(xiàn)將Excel電子表格中的數(shù)據(jù)導(dǎo)入數(shù)據(jù)庫(kù),實(shí)現(xiàn)過(guò)程如圖2所示。

[Excel] [DataSet] [Access]

圖2

具體實(shí)現(xiàn)步驟是:將Excel電子表格作為數(shù)據(jù)源,通過(guò).NET Framework提供的相關(guān)類(lèi)庫(kù),將Excel數(shù)據(jù)源中的數(shù)據(jù)導(dǎo)入到DataSet中,然后將DataSet中的數(shù)據(jù)以循環(huán)的方式依次插入數(shù)據(jù)庫(kù)中。

下面為.NET相關(guān)類(lèi)庫(kù)的介紹。

⑴ 公共類(lèi)。.Net提供的斷開(kāi)連接時(shí)數(shù)據(jù)的脫機(jī)容器相關(guān)類(lèi)有以下。

a. DataSet:這個(gè)對(duì)象主要用于斷開(kāi)數(shù)據(jù)庫(kù)連接時(shí),是數(shù)據(jù)的脫機(jī)容器,它包含一組DataTable,以及這些表之間的關(guān)系。

b. DataTable:數(shù)據(jù)的一個(gè)容器,DataTable由一個(gè)或多個(gè)DataColumn組成,每個(gè)DataColumn由一個(gè)或多個(gè)包含數(shù)據(jù)的DataRow組成。

c. DataRow:包含許多數(shù)值,類(lèi)似于數(shù)據(jù)庫(kù)表中的一行或電子表格中的一行。

d. DataColumn:包含列的定義,例如列名稱(chēng)和數(shù)據(jù)類(lèi)型。

e. DataRelation:DataSet中兩個(gè)DataTable之間的關(guān)系,用于外鍵和主從關(guān)系。

f. Constraint:為DataColumn(或一組數(shù)據(jù)列)定義規(guī)則,例如惟一值。

DataSet中各個(gè)類(lèi)的關(guān)系如圖3所示。

[DataSet] [Tables] [DataTables] [Columns] [Rows] [Constraints] [DataColumn] [DataRow] [Constraint] [Tables] [Tables]

圖3 DataSet中各個(gè)類(lèi)的關(guān)系圖

⑵ 操作數(shù)據(jù)庫(kù)的類(lèi)。每個(gè)特定的數(shù)據(jù)庫(kù)都會(huì)有特定的數(shù)據(jù)庫(kù)連接的類(lèi),這里以Access數(shù)據(jù)庫(kù)為例介紹這些類(lèi)。

a. OleDbConnection:數(shù)據(jù)庫(kù)連接對(duì)象,用于創(chuàng)建一個(gè)程序和access數(shù)據(jù)庫(kù)的連接。

b. OleDbCommand: 表示要對(duì)數(shù)據(jù)源執(zhí)行的 SQL 語(yǔ)句或存儲(chǔ)過(guò)程。

c. OleDbCommandBuilder:用于從一個(gè)SELECT語(yǔ)句中生成Sql命令。自動(dòng)生成用于協(xié)調(diào)對(duì) DataSet 的更改與關(guān)聯(lián)數(shù)據(jù)庫(kù)的單表命令。

d. OleDbDataAdapter:用于存儲(chǔ)選擇、插入、更新和刪除語(yǔ)句的類(lèi),也可以用于生成DataSet和更新數(shù)據(jù)庫(kù)。

使用相關(guān)類(lèi)的流程是:通過(guò)OleDbConnection類(lèi)建立一個(gè)與數(shù)據(jù)庫(kù)的連接,然后建立OleDbCommand對(duì)象,傳入要執(zhí)行的sql語(yǔ)句和要使用的連接,然后選擇要執(zhí)行的操作(例如執(zhí)行插入或更新操作)[1]。

1.2 將數(shù)據(jù)庫(kù)中的數(shù)據(jù)導(dǎo)出至Excel電子表格

1.2.1 使用數(shù)據(jù)庫(kù)管理工具實(shí)現(xiàn)

Excle的數(shù)據(jù)導(dǎo)出,有些數(shù)據(jù)庫(kù)管理工具也提供了相應(yīng)的轉(zhuǎn)換工具。如sql server 2000“企業(yè)管理器”工具,提供了數(shù)據(jù)的導(dǎo)出功能,可以將數(shù)據(jù)導(dǎo)出至Excle電子表格。

1.2.2 編碼方式實(shí)現(xiàn)

將數(shù)據(jù)導(dǎo)出至Excel電子表格文件,也可類(lèi)似于將Excel電子表格中的數(shù)據(jù)導(dǎo)入到數(shù)據(jù)庫(kù)的方法,將Excel電子表格當(dāng)作數(shù)據(jù)源對(duì)其進(jìn)行操作。

另一種方法是使用Excel文檔對(duì)象,建立一個(gè)Excel文檔,然后將數(shù)據(jù)插入文檔中,實(shí)現(xiàn)過(guò)程如下:

[Access] [DataSet] [Excel文檔對(duì)象] [Excel]

由于Excel文檔中的數(shù)據(jù)是高度結(jié)構(gòu)化的,因此該對(duì)象模型也具有層次結(jié)構(gòu)并且簡(jiǎn)單明了。Excel提供了數(shù)百個(gè)可能需要與之交互的對(duì)象,完成數(shù)據(jù)導(dǎo)出只需掌握少數(shù)幾個(gè)對(duì)象模型。這些對(duì)象包括四種:

[ ][Application][ ][WorkBook][ ][WorkSheet][ ][Range]

⑴ Application對(duì)象

Microsoft.Office.Interop.Excel.Application類(lèi)表示Excel應(yīng)用程序本身。該類(lèi)公開(kāi)了大量有關(guān)正在運(yùn)行的應(yīng)用程序、應(yīng)用于該實(shí)例的選項(xiàng)以及在該實(shí)例中打開(kāi)的當(dāng)前用戶(hù)的對(duì)象的信息[2]。

⑵ Workbook對(duì)象

Microsoft.Office.Interop.Excel.Workbook類(lèi)表示Excel應(yīng)用程序內(nèi)的單個(gè)工作簿,是Workbooks集合的成員[2]。

⑶ Worksheet對(duì)象

Microsoft.Office.Interop.Excel.Worksheet類(lèi)表示Excel應(yīng)用程序內(nèi)的單個(gè)工作表,是Worksheets集合的成員。Microsoft.Office.Interop.Excel.Worksheet的許多屬性、方法和事件與 Application或Microsoft.Office.Interop.Excel.Workbook類(lèi)提供的成員完全相同或相似[2]。

⑷ Range對(duì)象

Microsoft.Office.Interop.Excel.Range對(duì)象是Excel應(yīng)用程序中最常用的對(duì)象。在能夠處理 Excel 內(nèi)的任何范圍之前,必須將它表示為Range對(duì)象,并處理該對(duì)象的方法和屬性。Range對(duì)象表示一個(gè)單元格、一行、一列、包含一個(gè)或多個(gè)單元格塊(可以連續(xù),也可以不連續(xù))的單元格選定范圍,甚至可以是多個(gè)工作表中的一組單元格[2]。

要建立一個(gè)完整的Excel電子表格,就必須通過(guò)以上的對(duì)象來(lái)完成。

1.3 實(shí)現(xiàn)方式的比較

要實(shí)現(xiàn)Excel電子表格和數(shù)據(jù)庫(kù)之間的通訊,可以使用數(shù)據(jù)庫(kù)管理系統(tǒng)提供的相關(guān)工具進(jìn)行導(dǎo)入和導(dǎo)出操作,但使用這種方法的缺點(diǎn)是,我們不能根據(jù)我們的需要對(duì)導(dǎo)入數(shù)據(jù)庫(kù)的數(shù)據(jù)進(jìn)行更改,同樣的當(dāng)導(dǎo)出時(shí)我們也不能根據(jù)我們的需要添加其他信息。因此,本系統(tǒng)采用編寫(xiě)代碼的方式實(shí)現(xiàn)Excel電子表格和數(shù)據(jù)庫(kù)之間的數(shù)據(jù)轉(zhuǎn)換。

1.4 使用多線程技術(shù)

線程是程序中獨(dú)立的指令流,使用C#編寫(xiě)任何程序時(shí),都有一個(gè)入口:Main()方法。程序從Main方法的第一條語(yǔ)句開(kāi)始執(zhí)行,直到這個(gè)方法為止,Main()方法的執(zhí)行是在一個(gè)線程中即主線程。在應(yīng)用程序中,當(dāng)用戶(hù)在一個(gè)任務(wù)正在執(zhí)行的過(guò)程中,希望執(zhí)行其他的任務(wù)時(shí),應(yīng)使用多線程技術(shù)實(shí)現(xiàn)。如在使用Microsoft Word時(shí),當(dāng)我們輸入英文單詞時(shí),該軟件也會(huì)對(duì)單詞進(jìn)行拼寫(xiě)檢查,此外還有一個(gè)線程將Word文檔自動(dòng)保存至臨時(shí)文件中等等,這些功能都是同時(shí)工作的,即使用了多線程技術(shù)[3]。

在C#中,多線程的實(shí)現(xiàn)主要有兩種方法。

⑴ 通過(guò)異步委托實(shí)現(xiàn)線程

委托是一種特殊的對(duì)象類(lèi)型,一般對(duì)象類(lèi)型都包含數(shù)據(jù),但委托只包含方法的地址,可以通過(guò)委托調(diào)用方法。委托用于將方法作為參數(shù)傳遞給其他方法。事件處理程序就是通過(guò)委托調(diào)用的方法,可以創(chuàng)建一個(gè)自定義方法,當(dāng)發(fā)生特定事件時(shí)某個(gè)類(lèi)(如LABLE控件)就可以調(diào)用該方法。以下給出具體操作步驟[3]。

a. 定義了一個(gè)委托:

public delegate int DelegateAdd(int x, int y);

該示例定義了一個(gè)委托(DelegateAdd),而且定義該委托的每個(gè)實(shí)例都包含一個(gè)方法的細(xì)節(jié),該方法帶有兩個(gè)int類(lèi)型的參數(shù)(x,y),且返回值是int類(lèi)型的。

b. 定義一個(gè)方法:

Public int add(int x,int y)

{ return x+y;

}

該方法的定義符合委托的要求(兩個(gè)int類(lèi)型的參數(shù),int類(lèi)型的返回值)。

c. 將委托實(shí)例化:

delegate Add=new DelegateAdd (add);

即將委托指向方法的地址,然后操作委托調(diào)用方法:

Int z=delegateAdd(1,2);

⑵ 通過(guò)Thread類(lèi)實(shí)現(xiàn)多線程

Thread類(lèi)是.NET框架中的一個(gè)多線程類(lèi),使用該類(lèi)可以創(chuàng)建和控制線程。使用該線程類(lèi)的步驟主要是:

a. 創(chuàng)建一個(gè)方法,并不直接在主線程使用而是通過(guò)線程調(diào)用:

Public void threadDemo()

{ Console.WriteLine("test");

}

b. 創(chuàng)建一個(gè)線程,并使該線程指向方法的引用,代碼如下:

Thread t=new Thread(threadDemo);

該代碼定義了一個(gè)線程類(lèi)(t),并使該示例指向。

c. 啟動(dòng)線程:

// 開(kāi)啟線程

t.Start();

//線程休眠

Thread.Sleep(0);[3]

2 具體實(shí)現(xiàn)

為了方便操作,把對(duì)數(shù)據(jù)庫(kù)的操作封裝在一個(gè)類(lèi)中。取名為L(zhǎng)inkDataBase.cs,該類(lèi)主要實(shí)現(xiàn)數(shù)據(jù)庫(kù)數(shù)據(jù)的增、刪、改、查等操作。

2.1 導(dǎo)入

Public void ExcelToDB() {

//Excel電子表格連接字符串

string ExcelConnString=string.Format("Provider=Microsoft.Jet.

OLEDB.4.0;Data Source={0}; Extended Properties

=Excel8.0;",

openFileDialog1.FileName);

//Access數(shù)據(jù)庫(kù)連接字符串

string AccessConnString=string.Format("Provider=Microsoft

.Jet.OLEDB.4.0;Data Source={0};User ID=;Password=;",

Application.StartupPath+"\\Data.mdb");

//創(chuàng)建與Excel電子表格的連接

OleDbConnection ExcelConnection=new OleDbConnection

(ExcelConnString);

//打開(kāi)一個(gè)電子表格的連接

ExcelConnection.Open();

//執(zhí)行的SQL語(yǔ)句

string strExcel="select * from [jichu$]";

//通過(guò)打開(kāi)的連接(ExcelConnection),執(zhí)行指點(diǎn)的SQL語(yǔ)句

(strExcel)

OleDbDataAdapter ExcelCommand=new OleDbDataAdapter

(strExcel, ExcelConnection);

//創(chuàng)建一個(gè)脫機(jī)容器,并將查詢(xún)數(shù)據(jù)生成(ExcelCommand.Fill())

到這個(gè)脫機(jī)容器(ds)中

DataSet ds=new DataSet();

ExcelCommand.Fill(ds,"DB_Base");

//將查找到的表保存至access數(shù)據(jù)庫(kù)

foreach (DataRow dr in ds.Tables[0].Rows)

{ //創(chuàng)建Access數(shù)據(jù)庫(kù)的連接并打開(kāi)一個(gè)連接

OleDbConnection AccessConnection=new

OleDbConnection(AccessConnString);

AccessConnection.Open();

//通過(guò)可用連接將數(shù)據(jù)通過(guò)SQL語(yǔ)句插入到Access數(shù)據(jù)庫(kù)中

OleDbCommand AccessCommand=new OleDbCommand

("insert into DB_Base values("+dr[0]+",'"+dr[1]+"',

'"+dr[2]+"','"+dr[3]+"','"+dr[4]+"','"+dr[5]+"','"+dr[6]+"',

'"+dr[7]+"','"+dr[8]+"','"+dr[9]+"')", AccessConnection);

AccessCommand.ExecuteNonQuery();

//關(guān)閉連接

accessConnection.Close();

}

}

2.2 導(dǎo)出

Public void DBToExcel() {

//初始化Excel電子表格文檔對(duì)象

m_objRange=null; //工作表中區(qū)間對(duì)象

m_objSheet=null; //工作表對(duì)象

m_objSheets=null; //工作表集合對(duì)象

m_objBooks=null; //工作薄集合對(duì)象

m_objBook=null; //工作薄對(duì)象

m_objExcel=null; //Excel對(duì)象

object[] objHeaders=null;

int nFields=0;//記錄字段總數(shù)

DataSet ds=new DataSet();

// Start a new workbook in Excel.

//新建一個(gè)Excel應(yīng)用程序,進(jìn)而建立一個(gè)工作薄

m_objExcel=new Excel.Application();

m_objBooks=(Excel.Workbooks)m_objExcel.Workbooks;

m_objBook=(Excel._Workbook)(m_objBooks.Add(m_objOpt));

//在工作薄中找到第一個(gè)工作表

m_objSheets=(Excel.Sheets)m_objBook.Worksheets;

m_objSheet=(Excel._Worksheet)(m_objSheets.get_Item(1));

//查找數(shù)據(jù)庫(kù)中的數(shù)據(jù)

DataTable dt=dbhelp.SelectDataBase("select * from users");

nFields=dt.Columns.Count;//得到記錄數(shù)

objHeaders=new object[nFields];

int i=0;

//得到數(shù)據(jù)庫(kù)的字段名

foreach (DataColumn dc in dt.Columns)

{ objHeaders[i]=dc.ColumnName;

i++;

}

//設(shè)置單元格格式

m_objRange=m_objSheet.get_Range("A1", m_objOpt);

m_objRange.EntireColumn.NumberFormatLocal="@";

//設(shè)置單元格每一列標(biāo)題,以數(shù)據(jù)庫(kù)字段命名

m_objRange=m_objRange.get_Resize(1, nFields);

m_objRange.Value2=objHeaders;

//將數(shù)據(jù)依次插入單元格

for (int j=0; j

{ for (int k=0; k

{ m_objRange.Cells[j+2, k+1]=dt.Rows[j][k];

}

}

//保存電子表格

m_objBook.SaveAs(m_strSampleFolder+"book.xls",m_objOpt,

m_objOpt,m_objOpt, m_objOpt, m_objOpt,

Excel.XlSaveAsAccessMode.xlNoChange, m_objOpt,

m_objOpt, m_objOpt, m_objOpt, m_objOpt);

m_objBook.Close(false, m_objOpt, m_objOpt);

//退出電子表格應(yīng)用程序

m_objExcel.Quit();

}

2.3 多線程技術(shù)的使用

當(dāng)導(dǎo)入導(dǎo)出的數(shù)據(jù)量比較小時(shí),基本上不需要使用多線程,但當(dāng)導(dǎo)入導(dǎo)出的數(shù)據(jù)量較大時(shí),不使用多線程技術(shù)就會(huì)產(chǎn)生“假死”現(xiàn)象,而使用多線程可以很好地解決這一問(wèn)題。

3 結(jié)束語(yǔ)

軍事理論練習(xí)系統(tǒng)實(shí)現(xiàn)了C#將Exclel電子表格中的數(shù)據(jù)轉(zhuǎn)換到Access數(shù)據(jù)中,同時(shí)也實(shí)現(xiàn)了將Access數(shù)據(jù)庫(kù)的數(shù)據(jù)導(dǎo)出到Excel電子表格。通過(guò)相關(guān)方法的擴(kuò)展,我們可以實(shí)現(xiàn)Excel電子表格與任何關(guān)系型數(shù)據(jù)庫(kù)的數(shù)據(jù)相互轉(zhuǎn)換;可將其應(yīng)用于其他軟件或系統(tǒng)中,以提高效率。

參考文獻(xiàn):

[1] Christian Nagel等著,李銘翻譯.C#高級(jí)編程(第6版)[M].清華大學(xué)

出版社,2008.

[2] 王毅飛.基于網(wǎng)絡(luò)協(xié)同的IT技能計(jì)算機(jī)輔助評(píng)價(jià)系統(tǒng)研究[D].浙江

師范大學(xué)碩士學(xué)位論文,2011.

[3] 張焰林.基于VB.NET的多線程技術(shù)應(yīng)用[J].計(jì)算機(jī)系統(tǒng)應(yīng)用,

2009.2.

[4] 張文博,余文芳.ASP.NET編程中對(duì)Excel文檔操作的探討及應(yīng)用[J].

計(jì)算機(jī)系統(tǒng)應(yīng)用,2010.19(3).

[5] 張麗英.基于.NET的Excel數(shù)據(jù)批量導(dǎo)入SQLServer的設(shè)計(jì)與實(shí)現(xiàn)[J].

南通紡織職業(yè)技術(shù)學(xué)院學(xué)報(bào),2012.1.

猜你喜歡
數(shù)據(jù)庫(kù)
數(shù)據(jù)庫(kù)
數(shù)據(jù)庫(kù)
數(shù)據(jù)庫(kù)
數(shù)據(jù)庫(kù)
个旧市| 紫阳县| 双牌县| 柳州市| 太湖县| 镇赉县| 康保县| 湄潭县| 鄄城县| 克拉玛依市| 贵州省| 鄂伦春自治旗| 中超| 宁津县| 富蕴县| 崇文区| 抚远县| 乌拉特中旗| 开封县| 封开县| 富民县| 岳阳市| 宁海县| 宜兰县| 邻水| 白城市| 屏山县| 三门县| 涿州市| 达州市| 津南区| 从江县| 乐清市| 改则县| 右玉县| 普宁市| 四平市| 鹤峰县| 平南县| 广宁县| 内乡县|