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进行说明的页面,可以了解比较详细的信息,如果想知道关于工作表的信息,可以这样做:
这样,工作表名称就放在sheetList里面了。需要注意的是,读出的工作表名称天然地带有$符号,比如工作表名称叫Sheet1,那么通过代码读出来的工作表名称就是Sheet1$。这样,后面从工作表读数据的时候,直接使用这里读出来的工作表名称就行了,不用再额外地加上$符号。
Table的属性,也就是xlsTable.Columns中的内容是什么呢?
可以看到,其中有一列是"TABLE_NAME"。
获得了Excel文件中每个工作表的名称我还觉得不够满足,我还希望知道每个工作表中有几列,列的名称是什么。
那么,还是用GetOleDbSchemaTable就可以:
跟踪进去的话,可以看到每页的列名,如果有明确写出来的,就是写出来的列名;如果没有写出来,则是以F开头,后面加上数字的列名:
它按照列名的字母顺序排序,而不是按照列先后顺序排序的。我想,也许有方法,只不过我现在没有找到而已。
上面的代码用到列的名称这个属性,还有以下一些属性可以参考:
比较完整地贴出读Excel的代码就是这样的了:
(关于写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文件后面再写)
相关文章推荐
- c#操作excel方式二:采用OleDB操作Excel文件
- C#以OleDb的方式操作Excel文件(三)
- c#操作excel方式二:采用OleDB操作Excel文件
- C#以OleDb的方式操作Excel文件
- c#中采用OLEDB方式来读取EXCEL文件和将数据写入EXCEL文件
- C#使用oledb操作excel文件的方法
- C#使用oledb操作excel文件的方法
- Asp.net/c#+OleDb操作excel文件
- c#中采用OLEDB方式来读取EXCEL文件和将数据写入EXCEL文件
- 【c#操作office】--OleDbDataAdapter 与OleDbDataReader方式读取excel,并转换为datatable
- c#中采用OLEDB方式来读取EXCEL文件和将数据写入EXCEL文件
- C#利用OleDb操作Excel文件
- C#中的Excel操作【1】——设置Excel单元格的内容,打开Excel文件的一种方式
- C#以操作数据库方式访问EXCEL文件的几个常见问题及解决方法
- C#操作Excel的OLEDB方式与COM方式比较
- c#操作excel方式三:使用Microsoft.Office.Interop.Excel.dll读取Excel文件
- c#操作excel方式三:使用Microsoft.Office.Interop.Excel.dll读取Excel文件
- c#操作excel方式三:使用Microsoft.Office.Interop.Excel.dll读取Excel文件
- c#中采用OLEDB方式来读取EXCEL文件和将数据写入EXCEL文件
- c#操作excel方式三:使用Microsoft.Office.Interop.Excel.dll读取Excel文件