APP下载

基于C#的Excel数据导入导出研究与实现

2014-04-29蔡小艳

智能计算机与应用 2014年5期

蔡小艳

摘 要:为了提高信息管理系统中数据导入导出操作的灵活性和通用性,本文详细介绍了在Visual Studio 2008使用C#语言、通过引用Office的COM组件技术,结合Microsoft SQL Server 2005实现了Excel数据导入到数据库以及数据库数据导出到Excel的设计思路和实现方法。实践证明该方法有较强的通用性和实用性。

关键词:C#;COM组件;Excel;导入导出

中图分类号:TP311 文献标识码:A 文章编号:2095-2163(2014)05-

Research and Implementation of Excel Data Import and Export Based on C#

CAI Xiaoyan, LI Longteng, GE Yu, ZHENG Yan

(Wuhan ordnance officer school,Wuhan 430075,China)

Abstract: In order to improve the flexibility and popularity of data import and export in information management system, this paper introduces the ideas and the ways of implementation of Excel data importing to database and database data exporting to Excel, which combined with Microsoft SQL Server 2005 in Visual Studio 2008, uses C# programme, and applies COM components technology of Office. The operation practices show that the method if widely useful and available.

Key words: C#; COM components; Excel; import and export

0 引 言

Excel是Office的重要组成,是保存统计数据的常用软件格式之一。在程序编制和数据汇总交换过程中,能否将系统中录入的数据以及查询的结果按标准的格式导出为Excel报表,以及能否将Excel表中的数据进行整理后批量导入数据库,以上过程均对系统设计提出了较高要求。基于此,本文即介绍了在.Net环境下,使用C#语言实现系统中Excel数据与SQL Server2005数据库中数据的导入导出。

1 设计思路

1.1数据导入设计思路

在此,将Excel表格中的数据导入到SQL Server数据库的设计思路进行如下表述:

(1)由c#程序控制Excel表格,首先打开Excel表格;

(2)运用SQL语句,执行SQL,并根据不同的规则,将表格中的数据读入到临时表temp_table中;

(3)通过对比temp_table和table,判断是否存在重复的数据,提示是否重复导入;

(4)如果重复导入,可将temp_table的数据直接添加到table中;否则即需将temp_table中除关键字冲突外的其它数据添加到table中。

1.2数据导出设计思路

相应地,SQL Server数据库中的数据导出到Excel表格的设计思路[1-3]可列述如下:

(1)选择需要导出的数据;

(2)利用Worksheet类创建Excel工作表对象,确定即将写入数据的单元格位置;

(3)从数据库中读取数据,根据数据类型的不同,选择不同的写入方式;

(4)保存Excel表格并退出内存。

数据批量导入和数据批量导出的设计流程可分别表示为如图1和图2所示。

图1 数据导入流程 图2 数据导出流程

Fig.1 Process of data import Fig.2 Process of data export

2关键技术实现

2.1数据导出

2.1.1添加COM组件的引用

只有添加Excel的COM组件才能在程序中调用Excel。添加COM组件的引用步骤可做如下实现[4]:

在“解决方案资源管理器”窗口中右击“引用”对象,并在弹出的快捷菜单中选择“添加引用”;再在弹出的“添加引用”对话框中选择“COM”选项卡,如果基于Excel 2003,则选择“Microsoft Excel 11.0 object library”;如果基于Excel 2007,则选择“Microsoft Excel 12.0 object library”;同时单击“确定”按钮,即将Excel对象引用到工程中。

需要指出的是,在编码中主要涉及以下两种处理功能的类:

(1) Microsoft.Office.Interop.Excel.Application:接口,表示一个Excel程序;

(2) Microsoft.Office.Interop.Excel.Workbook:接口,表示一个Excel的工作薄。

2.1.2 创建Excel表格

微软的Excel对象模型包括了数百个可供用户交互的对象,本系统主要使用Application、Workbook、Worksheet和Range四个类及其内含成员。其中,Application对象处于Excel对象模型的顶层,表示整个Excel应用程序;Workbook对象处于Application对象的下层,表示一个Excel工作薄文件;Worksheet对象包含于Workbook对象,表示一个Excel工作表;Range对象包含于worksheet对象之中,表示Excel工作表中的一个或多个单元格。

创建Excel表格的代码实现过程如下:

Excel.Application excelApp = new Excel.Application(); //创建Excel对象

Excel.Workbook wb = excelApp.Workbooks.Open(filename, Nothing, Nothing, Nothing, Nothing, Nothing, Nothing, Nothing, Nothing, Nothing, Nothing, Nothing, Nothing, Nothing, Nothing); //创建Excel工作薄

Excel.Worksheet ws = wb.Worksheets[1] as Excel.Worksheet; //引用工作表

此时创建的Excel表格ws是一个没有内容的空表格,接下来将数据导出到该表格中。

2.1.3 将数据库数据导出到Excel

(1)读取数据表信息

将指定的数据表中的数据读取到DataSet中,具体步骤如下[5]:

①设置连接数据库字符串;②设置查询语句;③打开数据库连接,创建SQL数据适配器;④定义DataSet对象DS,填充数据;⑤关闭数据库连接。

(2)向工作表的每个单元格写入数据

工作表变量ws包含有一个“Cell”属性,这个属性代表Excel表格中的每一个单元格,通过对“Cell”属性赋值,从而实现了向Excel表格写入相应数据的设计需要。向Excel工作表写入数据的核心代码如下:

for (int i = 0; i < DS.Tables[0].Rows.Count; i++)

{

object rng = Type.Missing;

start = 0;

end = 0;

this.InsertRows(ws, i + 5);//生成Excel文件时动态添加行

for (int j = 0; j < DS.Tables[0].Columns.Count; j++)

{

ws.Cells[i + 5, j + 1] = DS.Tables[0].Rows[i][j].ToString();

}

}

private void InsertRows(Excel.Worksheet sheet, int rowIndex)

{

object missing = System.Reflection.Missing.Value;

Excel.Range r = (Excel.Range)sheet.Rows[rowIndex,missing];

r.Insert(Excel.XlInsertShiftDirection.xlShiftDown, missing);

}

2.1.4 保存Excel表格并退出内存

wb.Save(); //保存Excel文件

excelApp.Quit(); //关闭Excel对象,回收资源

2.2数据导入

2.2.1 打开Excel表格文件

在读取Excel表中数据时,先是通过文件路径得到Excel文件,并根据Workbook类获取workbook(工作簿),即可访问sheet(工作表)。对应的实现代码如下:

Excel.Application excelApp = new Excel.Application();

Excel.Workbook wb = excelApp.Workbooks.Open(textBox1.Text, Nothing, Nothing, Nothing, Nothing, Nothing, Nothing, Nothing, Nothing, Nothing, Nothing, Nothing, Nothing, Nothing, Nothing);

Excel.Worksheet ws = wb.Worksheets[1] as Excel.Worksheet;

2.2.2 将Excel文件数据导入到数据库临时表

通过SQL的Insert语句将Excel对象中的数据插入到指定的数据库表中。该过程的详细代码实现为:

for (int i = iStartRow; i <= iEndRow; i++)

{

sqlstr = "insert into temp_table (列1,列2…列n) values(";

for (int j = 1; j <= iEndCol; j++)

{

if (((Excel.Range)ws.Cells[i, j]).Value2 == null)// 判断导入的列值是否为空

sqlstr += ",null";

else

{

if (j == 1) //导入第一列值

{

sqlstr += "'" + ((Excel.Range)ws.Cells[i, j]).Value2.ToString() + "'";

}

else

sqlstr += ",'" + ((Excel.Range)ws.Cells[i, j]).Value2.ToString() + "'";

}

}

sqlstr = sqlstr + ")";

执行sql语句

}

2.2.3 将临时表中的数据导入数据库

在进行插入数据库操作前,将需要判断插入的数据是否有重复,如果重复,则覆盖原数据库中数据。判断的标准,可视数据库表中主键列数据与导入到临时表中对应的数据是否相同而定。一旦相同,即删除临时表中对应行数据,再将临时表中剩余的数据插入到指定表;反之,一旦如果不同,即直接进行数据导入。其程序实现过程可表述为:

DataSet ds = mydataclass1.getDataSet("select * from temp_table where 主关键字 in (select 主关键字 from table) ");

if (ds.Tables[0].Rows.Count > 0) //存在重复的数据

{

string querystr = "导入数据中有" + ds.Tables[0].Rows.Count + "条数据与数据库中已有数据重复,是否覆盖导入?";

if (MessageBox.Show(querystr, "提示信息", MessageBoxButtons.YesNo, MessageBoxIcon.Information).ToString() == "Yes")

{

string delsql = "delete from temp_table from temp_table join table on

temp_table.主关键字=table.主关键字 ";

执行delsql语句;

}

else

{

dataGridView1.DataSource = ds.Tables[0];//显示重复数据

dataGridView1.Visible = true;

dataGridView1.BringToFront();

btnBrowse.Enabled = false;

return ;

}

}

string inssql = @"insert into table select * from temp_table";

执行inssql语句;

3 结束语

本文提出了如下的研究创新,具体可表述为:本文采用Visual Studio开发平台,运用基于Office的COM组件技术,结合Microsoft SQL Server 2005实现了Excel数据导入到数据库表以及数据库表数据导出到Excel。在导入Excel数据文件时,能实现覆盖导入;而在导出Excel数据文件时,则能动态添加行,这种批量的导入导出数据能够提高用户的工作效率。从应用情况看,该种Excel数据导入导出方法通用性强,效果理想,值得推广。

参考文献:

[1]李明明. VS.net中用后台线程向Excel中导入数据的研究[J]. 测控技术,2011,30(8):83-86.

[2]苏庆,李忠良,吴伟民.在C#.NET下实现数据导入Excel的方法研究[J]. 计算机与现代化,2011(4):29-31.

[3]王森. 基于C#的Excel文档导入技术的研究与实现[J]. 办公自动化,2011(16):54-55.

[4]樊宇. 利用COM组件将SQL Server中的数据导入到Excel[J]. 电脑编程技巧与维护,2009(20):65-66.

[5]王晟. Visual C#.NET数据库开发经典案例解析[M]. 北京:清华大学出版社,2010.