Visual C#读取Excel和Access数据库
三峡大学土木水电学院 肖泽云
Content
一、读取Excel表格... 1
二、保存Excel文件... 5
三、获取表的名称... 6
四、打开指定的Excel表格... 8
五、读取Access数据库... 10
六、获取Access表信息... 12
七、打开指定的Access表... 13
一、读取Excel表格
读取Excel表格数据主要有两种方式:第一种就是采用OleDb;第二种就是采用Application对象。采用第一种方式可以在用户不安装Excel的情况下读写Excel文件,后一种方式则要求在用户安装Office的情况下才能使用。
1、OleDb方式
OLEDB(OLEDB)是微软的战略性的通向不同的数据源的低级应用程序接口。它不仅可以连接Excel,还可以连接Access、SQL 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++;
}
}
2、Application对象方式
在使用这种方式前,需要添加引用Microsoft Excel Object Library,如下图所示:
使用Application对象方式操纵Excel主要是获取Excel的Application对象,然后通过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工作表中的行数和列数。