您的位置:首页 > 编程语言 > C#

C#以OleDb的方式操作Excel文件(二)

2014-09-03 10:30 344 查看
上次说到,用OleDb方式操作Excel文件,可不可以知道这个文件中到底有几个工作表,每个工作表叫什么名字呢?

答案自然是:有的。

http://msdn.microsoft.com/zh-cn/library/system.data.oledb.oledbconnection.getoledbschematable(v=vs.110).aspx

上面的链接是MSDN中对OleDbConnection.GetOleDbSchemaTable进行说明的页面,可以了解比较详细的信息,如果想知道关于工作表的信息,可以这样做:

using System.Data;
using System.Data.OleDb;
...
// strConn是已经写好的连接字符串
OleDbConnection conn = new OleDbConnection(strConn);

// 调用下面的语句前(GetOleDbSchemaTable),要求先打开这个文件
conn.Open();

// 获得excel文件的各个表单(sheet)的名字,提高兼容性

// 先获取TABLE信息
// 按照我的理解,TABLE对应于Excel文件来说,就是工作表
DataTable xlsTable = conn.GetOleDbSchemaTable(OleDbSchemaGuid.Tables,
new object[] { null, null, null, "TABLE" });

// 读取工作表的名称
List<string> sheetList = new List<string>();
foreach (DataRow sheetRow in xlsTable.Rows)
{
sheetList.Add(sheetRow["TABLE_NAME"].ToString());
}
...
conn.Close();

这样,工作表名称就放在sheetList里面了。需要注意的是,读出的工作表名称天然地带有$符号,比如工作表名称叫Sheet1,那么通过代码读出来的工作表名称就是Sheet1$。这样,后面从工作表读数据的时候,直接使用这里读出来的工作表名称就行了,不用再额外地加上$符号。

Table的属性,也就是xlsTable.Columns中的内容是什么呢?



可以看到,其中有一列是"TABLE_NAME"。

获得了Excel文件中每个工作表的名称我还觉得不够满足,我还希望知道每个工作表中有几列,列的名称是什么。

那么,还是用GetOleDbSchemaTable就可以:

// 前面的代码就是获得工作表名称的代码
foreach (string sheetName in sheetList)
{
// 获得列的信息
DataTable xlsColumn = conn.GetOleDbSchemaTable(OleDbSchemaGuid.Columns,
new object[] { null, null, sheetName, null });

// 这段代码只是自己测试,看能读到什么列名
int columnCount = xlsColumn.Rows.Count;
List<string> columnList = new List<string>();
foreach (DataRow columnRow in xlsColumn.Rows)
{
string columnName = columnRow["COLUMN_NAME"].ToString();
columnList.Add(columnName);
}
}

跟踪进去的话,可以看到每页的列名,如果有明确写出来的,就是写出来的列名;如果没有写出来,则是以F开头,后面加上数字的列名:



它按照列名的字母顺序排序,而不是按照列先后顺序排序的。我想,也许有方法,只不过我现在没有找到而已。

上面的代码用到列的名称这个属性,还有以下一些属性可以参考:



比较完整地贴出读Excel的代码就是这样的了:

using System;
using System.IO;
using System.Collections.Generic;
using System.Data;
using System.Data.OleDb;
using System.Windows.Forms;

namespace TestXLS
{
public class Class1
{
#region 变量
/// <summary>
/// 从Excel文件中读出的人员信息
/// </summary>
List<PersonData> xlsPersonList = new List<PersonData>();
#endregion

public Class1()
{
}

private bool importExcel(string fileName)
{
if (string.IsNullOrWhiteSpace(fileName))
{
MessageBox.Show("请先输入xls文件名", "提示信息",
MessageBoxButtons.OK, MessageBoxIcon.Information);
return false;
}

DataSet excelDataSet = new DataSet();

try
{

string strConn;

// 注意连接串的写法
strConn = @"Provider=Microsoft.ACE.OLEDB.12.0;
Data Source="
+ fileName
+ @";Extended Properties=""Excel 12.0; HDR=YES; IMEX=1;""";

OleDbConnection conn = new OleDbConnection(strConn);

// 调用下面的语句前(GetOleDbSchemaTable),要求先打开这个文件
conn.Open();

// 获得excel文件的各个表单(sheet)的名字,提高兼容性
DataTable xlsTable = conn.GetOleDbSchemaTable(OleDbSchemaGuid.Tables,
new object[] { null, null, null, "TABLE" });

// 工作表名称列表
List<string> sheetList = new List<string>();
foreach (DataRow sheetRow in xlsTable.Rows)
{
sheetList.Add(sheetRow["TABLE_NAME"].ToString());
}

foreach (string sheetName in sheetList)
{
OleDbDataAdapter excelCommand = new OleDbDataAdapter
(@"SELECT * FROM [" + sheetName + "]", strConn);
excelCommand.Fill(excelDataSet);
}

// 清除之前的数据
xlsPersonList.Clear();

// 遍历表中的数据
foreach (DataTable dataTable in excelDataSet.Tables)
{
foreach (DataRow row in dataTable.Rows)
{
PersonData person = new PersonData();

person.name = row["员工姓名"].ToString().Trim();

person.sn   = row["员工编号"].ToString().Trim();

xlsPersonList.Add(person);

}
}

conn.Close();
}
catch (Exception ex)
{
MessageBox.Show("该Excel文件格式不正确:" + ex.Message, "提示信息",
MessageBoxButtons.OK, MessageBoxIcon.Information);
return false;
}

return true;
}

}
}

 

(关于写Excel文件后面再写)
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: