当前方法代码为:void GetDataset(string strxlsFileName) {
OledbCommon oledb = new OledbCommon(strxlsFileName, true);
List<string> sheets = oledb.GetSheetNames(); //add sheet.
string pageKey = null;
string sql = null;
DataTable t = null;
foreach (string sheet in sheets) {
pageKey = sheet.Substring(0, sheet.Length - 1);
tab_ctrl.TabPages.Add(pageKey);
DataGridView d = new DataGridView();
d.Dock = DockStyle.Fill;
sql = "select * from [" + sheet + "]";
t = oledb.GetDataTable(sql, oledb.GetConnection());
d.DataSource = t;
tab_ctrl.TabPages[pageKey].Controls.Add(d);
}
}辅助类OledbCommon我定义为:using System;
using System.Collections.Generic;
using System.Data.OleDb;
using System.Data;namespace Oledb
{
/// <summary>
/// 连接 excel(支持.xlsx).
/// </summary>
class OledbCommon
{
public enum Version { XLS, XLSX } //保留:不同版本差异. public string FileName { get; private set; } //连接字符串.
private string connectString = null;
public string ConnectString { get { return connectString; } } /// <summary>
/// if contains header.
/// </summary>
readonly bool hasHeader = false;
public bool HasHeader { get { return hasHeader; } } /// <summary>
/// Initialize connection string.
/// </summary>
/// <param name="fileName">full file name.</param>
/// <param name="hasHeader">ture if the .xls file contains header;otherwise false.</param>
public OledbCommon(string fileName, bool hasHeader)
{
if (string.IsNullOrEmpty(fileName)) throw new ArgumentNullException("fileName");
FileName = fileName;
this.hasHeader = hasHeader;
connectString = string.Format("Provider=Microsoft.ACE.OLEDB.12.0;Data Source='{0}';", FileName); //specify it contains header.
if (HasHeader)
connectString += "Extended Properties='Excel 12.0 Xml;HDR=YES'";
else
connectString += "Extended Properties='Excel 12.0 Xml;'";
} /// <summary>
/// 获得"连接对象'.
/// </summary>
/// <returns></returns>
public OleDbConnection GetConnection()
{
return new System.Data.OleDb.OleDbConnection(connectString);
} /// <summary>
/// 获得数据集-根据'sql'语句和连接对象..
/// </summary>
/// <param name="sql">值得注意的是,表名后面要有'$'符号.如,select * from [t$]</param>
/// <param name="connection"></param>
/// <returns></returns>
public DataSet GetDataSet(string sql, OleDbConnection connection)
{ OleDbDataAdapter adapter = new OleDbDataAdapter(sql, connection);
DataSet set = new DataSet();
adapter.Fill(set);
return set;
} public DataTable GetDataTable(string sql, OleDbConnection connection) {
OleDbDataAdapter adapter = new OleDbDataAdapter(sql, connection);
DataTable t = new DataTable();
adapter.Fill(t);
return t;
} /// <summary>
/// Get DataRows by specified column-name.
/// </summary>
/// <param name="set">The input set.</param>
/// <param name="columnName">The specified column-name</param>
/// <returns></returns>
public List<DataRow> GetDataRow(DataSet set, string columnName)
{
DataTable t = set.Tables[0]; //get the first table as default.
List<DataRow> rows = new List<DataRow>();
foreach (DataRow r in t.Rows)
{
rows.Add((DataRow)r[columnName]);
};
return rows;
} /// <summary>
/// 执行Reader方法:注意,执行这个方法需要重写本类的'ExecuteWithinReader'方法,该方法默认为空实现.
/// </summary>
/// <param name="sql"></param>
public void ExecuteReader(string sql)
{
using (OleDbConnection conn = GetConnection())
{
conn.Open();
using (OleDbCommand cmd = conn.CreateCommand())
{
cmd.CommandText = sql;
using (OleDbDataReader r = cmd.ExecuteReader())
{
while (r.Read())
{
ExecuteWithinReader(); //需要在子类中重写这个方法.
} //while.
} //cmd.
}
} //connection.
} /// <summary>
/// 在Reader中待实现的代码.例如,计数器的增加,或取得某字段的值等.
/// </summary>
protected virtual void ExecuteWithinReader()
{
//todo:例如,计数器的增加,或取得某字段的值.
} /// <summary>
/// 获取全部Sheet名.
/// </summary>
/// <returns></returns>
public List<string> GetSheetNames()
{
List<string> namesResult = new List<string>(); //存储结果.
using (OleDbConnection conn = GetConnection())
{
conn.Open();
DataTable sheetNames = conn.GetOleDbSchemaTable
(System.Data.OleDb.OleDbSchemaGuid.Tables, new object[] { null, null, null, "TABLE" });
foreach (DataRow dr in sheetNames.Rows)
{
namesResult.Add(dr[2].ToString());
}
} return namesResult;
}
}
}
OledbCommon oledb = new OledbCommon(strxlsFileName, true);
List<string> sheets = oledb.GetSheetNames(); //add sheet.
string pageKey = null;
string sql = null;
DataTable t = null;
foreach (string sheet in sheets) {
pageKey = sheet.Substring(0, sheet.Length - 1);
tab_ctrl.TabPages.Add(pageKey);
DataGridView d = new DataGridView();
d.Dock = DockStyle.Fill;
sql = "select * from [" + sheet + "]";
t = oledb.GetDataTable(sql, oledb.GetConnection());
d.DataSource = t;
tab_ctrl.TabPages[pageKey].Controls.Add(d);
}
}辅助类OledbCommon我定义为:using System;
using System.Collections.Generic;
using System.Data.OleDb;
using System.Data;namespace Oledb
{
/// <summary>
/// 连接 excel(支持.xlsx).
/// </summary>
class OledbCommon
{
public enum Version { XLS, XLSX } //保留:不同版本差异. public string FileName { get; private set; } //连接字符串.
private string connectString = null;
public string ConnectString { get { return connectString; } } /// <summary>
/// if contains header.
/// </summary>
readonly bool hasHeader = false;
public bool HasHeader { get { return hasHeader; } } /// <summary>
/// Initialize connection string.
/// </summary>
/// <param name="fileName">full file name.</param>
/// <param name="hasHeader">ture if the .xls file contains header;otherwise false.</param>
public OledbCommon(string fileName, bool hasHeader)
{
if (string.IsNullOrEmpty(fileName)) throw new ArgumentNullException("fileName");
FileName = fileName;
this.hasHeader = hasHeader;
connectString = string.Format("Provider=Microsoft.ACE.OLEDB.12.0;Data Source='{0}';", FileName); //specify it contains header.
if (HasHeader)
connectString += "Extended Properties='Excel 12.0 Xml;HDR=YES'";
else
connectString += "Extended Properties='Excel 12.0 Xml;'";
} /// <summary>
/// 获得"连接对象'.
/// </summary>
/// <returns></returns>
public OleDbConnection GetConnection()
{
return new System.Data.OleDb.OleDbConnection(connectString);
} /// <summary>
/// 获得数据集-根据'sql'语句和连接对象..
/// </summary>
/// <param name="sql">值得注意的是,表名后面要有'$'符号.如,select * from [t$]</param>
/// <param name="connection"></param>
/// <returns></returns>
public DataSet GetDataSet(string sql, OleDbConnection connection)
{ OleDbDataAdapter adapter = new OleDbDataAdapter(sql, connection);
DataSet set = new DataSet();
adapter.Fill(set);
return set;
} public DataTable GetDataTable(string sql, OleDbConnection connection) {
OleDbDataAdapter adapter = new OleDbDataAdapter(sql, connection);
DataTable t = new DataTable();
adapter.Fill(t);
return t;
} /// <summary>
/// Get DataRows by specified column-name.
/// </summary>
/// <param name="set">The input set.</param>
/// <param name="columnName">The specified column-name</param>
/// <returns></returns>
public List<DataRow> GetDataRow(DataSet set, string columnName)
{
DataTable t = set.Tables[0]; //get the first table as default.
List<DataRow> rows = new List<DataRow>();
foreach (DataRow r in t.Rows)
{
rows.Add((DataRow)r[columnName]);
};
return rows;
} /// <summary>
/// 执行Reader方法:注意,执行这个方法需要重写本类的'ExecuteWithinReader'方法,该方法默认为空实现.
/// </summary>
/// <param name="sql"></param>
public void ExecuteReader(string sql)
{
using (OleDbConnection conn = GetConnection())
{
conn.Open();
using (OleDbCommand cmd = conn.CreateCommand())
{
cmd.CommandText = sql;
using (OleDbDataReader r = cmd.ExecuteReader())
{
while (r.Read())
{
ExecuteWithinReader(); //需要在子类中重写这个方法.
} //while.
} //cmd.
}
} //connection.
} /// <summary>
/// 在Reader中待实现的代码.例如,计数器的增加,或取得某字段的值等.
/// </summary>
protected virtual void ExecuteWithinReader()
{
//todo:例如,计数器的增加,或取得某字段的值.
} /// <summary>
/// 获取全部Sheet名.
/// </summary>
/// <returns></returns>
public List<string> GetSheetNames()
{
List<string> namesResult = new List<string>(); //存储结果.
using (OleDbConnection conn = GetConnection())
{
conn.Open();
DataTable sheetNames = conn.GetOleDbSchemaTable
(System.Data.OleDb.OleDbSchemaGuid.Tables, new object[] { null, null, null, "TABLE" });
foreach (DataRow dr in sheetNames.Rows)
{
namesResult.Add(dr[2].ToString());
}
} return namesResult;
}
}
}
修改
tab_ctrl.TabPages.Add(pageKey);
改为TabPage tpage = new TabPage(sheet);
tpage.Name = sheet;
tab_ctrl.TabPages.Add(tpage);