使用 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);
运行结果