C#读取excl(兼容office多种版本)

本文介绍了一种从Excel文件中读取数据并将其转换为DataSet的方法。该方法使用了OleDb连接,并通过捕获异常的方式确保不同版本的Office文件都能被正确处理。此外,还提供了两种连接字符串以应对不同版本的Excel文件。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

 

要求:导入excl引用了using System.Data.OleDb,需要安装一个office

兼容原理:office导入字符串会因为版本改变,捕获异常的方式进行切换

#region 读取Excel数据到DataSet iqsir 2015-11-21

/// <summary>
/// 读取Excel数据到DataSet
/// </summary>
/// <param name="filepath">excel带路径</param>
/// <param name="tabindex">取第几个表</param>
/// <param name="hdr">第一行是列名而不是数据</param>
/// <returns>dataset</returns>
protected DataSet ReadExcel(string filepath, int tabindex, string hdr)
{
string meg = "";
DataSet ds;
string strConnection = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source='{0}';Extended Properties='Excel 12.0;HDR=" + hdr + ";IMEX=1'";
string strConnection1 = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source='{0}';Extended Properties='Excel 8.0;HDR=" + hdr + ";IMEX=1'";
//备注: "HDR=yes;"是说Excel文件的第一行是列名而不是数据,"HDR=No;"正好与前面的相反。
// "IMEX=1 "如果列中的数据类型不一致,使用"IMEX=1"可必免数据类型冲突。

// 当 IMEX = 0 时为“汇出模式”,这个模式开启的 Excel 档案只能用来做“写入”用途。

//当 IMEX = 1 时为“汇入模式”,这个模式开启的 Excel 档案只能用来做“读取”用途。
//当 IMEX = 2 时为“连結模式”,这个模式开启的 Excel 档案可同时支援“读取”与“写入”用途。


strConnection = string.Format(strConnection, filepath);

string msgConst = "打开excel连接字符串错误,解决方法:1安装offic2010+,2更改c/windows/temp文件夹权限为everyone完全控制";

try
{
OleDbConnection con = new OleDbConnection(strConnection);
try
{
con.Open();
DataTable schema = con.GetOleDbSchemaTable(OleDbSchemaGuid.Tables, new object[] { null, null, null, "TABLE" });
//下面取得表名

string strTableName = schema.Rows[tabindex]["TABLE_NAME"].ToString();
strTableName = strTableName.Substring(0, strTableName.IndexOf('$') + 1);
OleDbDataAdapter da = new OleDbDataAdapter("SELECT * FROM [" + strTableName + "]", con);
ds = new DataSet();
da.Fill(ds);
da.Dispose();
return ds;
}
catch (Exception exmsg1)
{
string strMsg = msgConst + exmsg1;
throw new Exception(strMsg);

}
finally
{
con.Close();
}


}
catch (Exception ex)
{

try
{

OleDbConnection con = new OleDbConnection(string.Format(strConnection1, filepath));
try
{
con.Open();
DataTable schema = con.GetOleDbSchemaTable(OleDbSchemaGuid.Tables, new object[] { null, null, null, "TABLE" });
//下面取得表名

string strTableName2 = schema.Rows[tabindex]["TABLE_NAME"].ToString();

strTableName2 = strTableName2.Substring(0, strTableName2.IndexOf('$') + 1);
OleDbDataAdapter da = new OleDbDataAdapter("SELECT * FROM [" + strTableName2 + "]", con);
ds = new DataSet();
da.Fill(ds);
da.Dispose();
return ds;
}
catch (Exception exmsg2)
{
string strMsg2 = msgConst + exmsg2;
throw new Exception(strMsg2);
}
finally
{
con.Close();
}

}
catch (Exception ex1)
{

throw new Exception("连接方案2错误1:" + ex1.Message + " 错误2:可能文件名错误");
}


}


}
#endregion

转载于:https://www.cnblogs.com/isking/p/6178398.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值