读取Excel表格——Visual C#读取Excel和Access数据库

 

Visual C#读取ExcelAccess数据库

 

三峡大学土木水电学院  肖泽云

 

Content  

一、读取Excel表格... 1

二、保存Excel文件... 5

三、获取表的名称... 6

四、打开指定的Excel表格... 8

五、读取Access数据库... 10

六、获取Access表信息... 12

七、打开指定的Access... 13

 

一、读取Excel表格

读取Excel表格数据主要有两种方式:第一种就是采用OleDb;第二种就是采用Application对象。采用第一种方式可以在用户不安装Excel的情况下读写Excel文件,后一种方式则要求在用户安装Office的情况下才能使用。

1OleDb方式

OLEDBOLEDB)是微软的战略性的通向不同的数据源的低级应用程序接口。它不仅可以连接Excel,还可以连接AccessSQL Server数据库等。使用OLEDB的应用程序会用到如下的请求序列:初始化OLE、连接到数据源、发出命令、处理结果、释放数据源对象并停止初始化OLE

具体过程如下:

1)首先,定义OleDbConnection对象用于OleDb连接数据库文件(Excel文件、Access文件等)。在其定义时就指定其连接数据库信息,如数据类型、文件路径等,如下:

对于连接Access

string strConn = @"Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" + filename + ";";

对于连接Excel

string strConn = @"Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" + filename + ";Extended Properties=Excel 8.0";

定义OleDbConnection对象如下:

OleDbConnection odcConnection = new OleDbConnection(strConn);

2)打开连接。前面已经定义了OleDbConnection对象,下面需要打开这个连接,如下:

odcConnection.Open();

3)建立SQL查询,即告诉连接查询数据库(文件)中的哪个表或符合要求的数据,如下:

OleDbCommand odCommand = odcConnection.CreateCommand();

添加查询命令,如下:

odCommand.CommandText = @"SELECT * FROM [sz_fcd$]";

其中,对于Excel中要获取某个表,则需要将表名用中括号括起并在尾部添加符号“$”,如上Excel文件中表名称为sz_fcd,此处要使用[sz_fcd$]。但是对于读取Access数据库就没有这个要求,直接使用表的名称即可。

4)执行查询,显示数据。使用OleDbDataReader对象读取查询的数据,定义如下:

OleDbDataReader odrReader = odCommand.ExecuteReader();

在此需要注意的是,OleDbDataReader对象的GetName(int i)方法获取的是第i列的名称,每次使用OleDbDataReader对象的Read()方法即表示读取下一行数据,OleDbDataReader对象的FieldCount属性表示数据的列数,一般情况下,第一次读取的为字段名称(未使用Read()方法之前)。使用OleDbDataReader对象[int i]则表示获取该行中第i列的数据,如odrReader[1],也可以使用名称,如odrReader[“NO”]

整个过程的程序代码如下所示:

        private void 使用OleDb打开Excel_Click(object sender, EventArgs e)

        {

            OpenFileDialog openDG = new OpenFileDialog();

            openDG.Title = "打开Excel表格";

            openDG.Filter = "Excel表格(*.xls)|*.xls|CSV格式(*.csv)|*.csv|所有文件(*.*)|*.*";

            openDG.ShowDialog();

            string filename;

            filename = openDG.FileName;

 

            string strCon = " Provider = Microsoft.Jet.OLEDB.4.0 ; Data Source = " + filename + ";Extended Properties=Excel 8.0";

            OleDbConnection odcConnection = new OleDbConnection(strCon);

            odcConnection.Open();

 

            OleDbCommand odCommand = odcConnection.CreateCommand();

            odCommand.CommandText = "SELECT * FROM [sz_fcd$]";

 

            OleDbDataReader odrReader = odCommand.ExecuteReader();

 

            int size = odrReader.FieldCount;

            dataGridView1.Rows.Clear();

            //添加列的名称

            for (int i = 0; i < size; i++)

            {

                dataGridView1.Columns.Add("", odrReader.GetName(i));

            }

            int j = 0;

            while (odrReader.Read())

            {

                dataGridView1.Rows.Add();

                for (int i = 0; i < size; i++)

                {

                    dataGridView1.Rows[j].Cells[i].Value = odrReader[i].ToString();

                }

                j++;

            } 

        }

 

2Application对象方式

在使用这种方式前,需要添加引用Microsoft Excel Object Library,如下图所示:

读取Excel表格——Visual C#读取Excel和Access数据库_第1张图片

使用Application对象方式操纵Excel主要是获取ExcelApplication对象,然后通过Workbook对象打开Excel文件,通过Worksheet对象获取Excel文件中的表。具体步骤如下:

1)首先定义Excel对象,如下:

            Microsoft.Office.Interop.Excel.Application excelApp = new Microsoft.Office.Interop.Excel.ApplicationClass();

2)定义Workbook对象并打开文件,如下:

            Microsoft.Office.Interop.Excel.Workbook myWorkBook;

            excelApp.Workbooks.Open(filename, missingValue, missingValue, missingValue, missingValue, missingValue

                    , missingValue, missingValue, missingValue, missingValue, missingValue, missingValue,missingValue, missingValue, missingValue);

            myWorkBook = excelApp.Workbooks.get_Item(1);

其中有很多参数为missingValue,这些参数默认都可以不需要,定义其值为:

object missingValue = System.Reflection.Missing.Value;

3)获取工作表对象,如下:

Microsoft.Office.Interop.Excel.Worksheet newSheet;

newSheet=(Microsoft.Office.Interop.Excel.Worksheet)myWorkBook.Sheets[1];

其中,WorkBook对象的Sheets[Object index]方法为获取Excel文件中的第几个工作表。工作表Worksheet对象的name属性可以返回工作表的名称。

4)获取工作表中的数据,由于一个Excel工作表中的行数和列数有很多(共有65536行,256列),所以不可能获取所有的单元格,只能根据选择范围来获取,如指定获取个数等。另外,要获取某个单元格的值,不能直接使用Cells[i, j]来获取,要使用Range对象,如下:

 Microsoft.Office.Interop.Excel.Range rng2 = (Microsoft.Office.Interop.Excel.Range)newSheet.Cells[i + 1, j + 1];

整个过程程序代码如下:

        private void 使用App打开Excel_Click(object sender, EventArgs e)

        {

            OpenFileDialog openDG = new OpenFileDialog();

            openDG.Title = "打开Excel表格";

            openDG.Filter = "Excel表格(*.xls)|*.xls|CSV格式(*.csv)|*.csv|所有文件(*.*)|*.*";

            openDG.ShowDialog();

            string filename;

            filename = openDG.FileName;

 

            object missingValue = System.Reflection.Missing.Value;

 

            Microsoft.Office.Interop.Excel.Application excelApp

                    = new Microsoft.Office.Interop.Excel.ApplicationClass();

            Microsoft.Office.Interop.Excel.Workbook myWorkBook;

            excelApp.Workbooks.Open(filename, missingValue, missingValue, missingValue, missingValue, missingValue

                    , missingValue, missingValue, missingValue, missingValue, missingValue, missingValue, missingValue, missingValue, missingValue);

            myWorkBook = excelApp.Workbooks.get_Item(1);

            Microsoft.Office.Interop.Excel.Worksheet newSheet;

            newSheet = (Microsoft.Office.Interop.Excel.Worksheet)myWorkBook.Sheets[1];

 

            dataGridView1.Columns.Clear();

            int m = 1, n = 1;

            Microsoft.Office.Interop.Excel.Range rng1;

            while ((rng1 = (Microsoft.Office.Interop.Excel.Range)newSheet.Cells[1, m]).Value2 != null)

            {

                dataGridView1.Columns.Add("", m.ToString());

                m++;

            }

            m--;

 

            while ((rng1 = (Microsoft.Office.Interop.Excel.Range)newSheet.Cells[n, 1]).Value2 != null)

            {

                dataGridView1.Rows.Add();

                n++;

            }

            n--;

 

            for (int i = 0; i < n; i++)

            {

                for (int j = 0; j < m; j++)

                {

                    rng1 = (Microsoft.Office.Interop.Excel.Range)newSheet.Cells[i + 1, j + 1];

                    dataGridView1.Rows[i].Cells[j].Value = rng1.Value2;

                }

            }

            excelApp.Quit();

        }

其中,通过While语句判断Excel工作表中的行数和列数。

你可能感兴趣的:(程序设计)