使用 Visual Studio Tools for Office(VSTO)訪問Excel數據表
這個方法不限於32位系統,64位系統也可以通過COM對象訪問Excel,但要有Microsoft Office Object Library存在。在安裝VS2008 過程中可以選擇安裝VSTO模塊。以下以建立文件級程序來說明如何使用VSTO。
先說俺的系統配置:
系統:Windows Server 2003 R2 X64
開發軟件:Microsoft VS 2008 Team
Office版本:Excel2007
數據庫: MSSQL Server 2008
2.1 創建一個例子數據表。
打開MS SQL Server 2008 ,假設已經建立數據庫XTJC,現創建一個表執行腳本
use XTJC
CREATE TABLE [dbo].[yyqint](
[id] [int] IDENTITY(1,1) NOT NULL,
[Customer] [nvarchar](50) NULL,
[CustomerContact] [nvarchar](50) NULL,
[CustomerTelephone] [nvarchar](50) NULL,
[AccountManager] [nvarchar](50) NULL,
[AMTelephone] [nvarchar](50) NULL,
[AccessType] [nvarchar](50) NULL,
[AccessAmount] [int] NULL,
[BusinessName] [nvarchar](50) NULL,
[Regional] [nvarchar](50) NULL,
[PlatformLoginAccountid] [int] NULL,
[AccessInforid] [int] NULL,
[Implementationid] [int] NULL,
[id] ASC
) ON [PRIMARY];
2.2 建立XML映射:俺有這樣一張表Book2.xlsx,想通過讀取Excel數據,最終寫入MSSQL
現打算通過VS2008讀取EXCEL2003表中『用戶名稱』,『客戶聯繫人』,『聯繫電話』,『客戶經理』,『客戶經理聯繫電話』,『業務類型』,『前端數量』,『業務類別』,『區域』字段值
新建一個解決方案,在解決方案上添加一個Excel 2007工作簿項目命名爲ExcelWorkbook1,選擇複製現有文檔Book2.xlsx。確認後VS2008打開Book2.xlsx文檔,另外,本文想建立EXCEL的XML映射文件,程序通過Xpath訪問相應單元格,所以首先要建立XML映射文件,T1schema.Xml映射文件如下:
<?xml version="1.0" standalone="yes"?>
<QQTintDataSet xmlns="http://tempuri.org/QQTintDataSet.xsd">
<yyexcel>
<id>1</id>
<Customer></Customer>
<CustomerContact></CustomerContact>
<CustomerTelephone></CustomerTelephone>
<AccountManager></AccountManager>
<AMTelephone></AMTelephone>
<AccessType></AccessType>
<AccessAmount></AccessAmount>
<BusinessName></BusinessName>
<Regional></Regional>
</yyexcel>
</QQTintDataSet>
在Excel2007“開發工具”選項卡上的“XML”組中,單擊“源”。在“XML 源”任務窗格中,單擊“XML 映射”。添加T1schema.Xml映射文件, 確認後如圖
拖動『ns1:Customer』到單元格『用戶名稱』,如此類推,建立XML映射
關於Excel2007如何顯示“XML源”按鈕
http://office.microsoft.com/zh-cn/excel/HP102064082052.aspx
2.3編程讀取相應數據,並寫入數據庫
創建一個Dataset,該數據集是數據庫表yyqint的映射,命名爲DataSet1。
打開文件Sheet1.cs,在Sheet1_Startup過程中添加讀取Excel數據代碼如下(非優化):
Excel.Range rag; //定義Excel單元格
DataSet1 ds1 = new DataSet1(); //映射MSSQL數據表DataSet
DataTable dt1=ds1.Tables[0];
DataColumn dc1;
DataRow dr1;
dr1 = dt1.NewRow();//增加新行。
string querystr;
for (int i = 1; i <= 9;i++)
{
querystr = "/ns1:QQTintDataSet/ns1:yyexcel/ns1:";
dc1 = dt1.Columns[i];
querystr = querystr + dc1;
rag = this.XmlDataQuery(querystr, System.Type.Missing, System.Type.Missing);
dr1[i] = rag.Value2;
}
dt1.Rows.Add(dr1);//新行寫入數據表
//ConsoleApplication1.DataSet1TableAdapters.yyqintTableAdapter在DataSet1.Designer.cs定義
DataSet1TableAdapters.yyqintTableAdapter ta1 = new ExcelWorkbook1.DataSet1TableAdapters.yyqintTableAdapter();
ta1.Update(ds1);
運行結果