苏飞论坛
标题: C#导入Excel|读取Excel方法总结 [打印本页]
作者: 站长苏飞 时间: 2012-7-1 09:17
标题: C#导入Excel|读取Excel方法总结
1. StreamReader 方法
这种方法一般不用,因为他读出来的是流,一般是转成字符串
代码如下:
[C#] 纯文本查看 复制代码
StreamReader sr = new StreamReader("文件名以及完整路径",System.Text.Encoding.Default);
string data = sr.ReadToEnd();
sr.Close();
2.OleDbConnection读取
最常 用的看下代码吧
[C#] 纯文本查看 复制代码
/**/
/// <summary>
/// 返回Excel数据源
/// </summary>
/// <param name="filename">文件路径</param>
/// <param name="TSql">TSql</param>
/// <returns>DataSet</returns>
public static DataSet ExcelToDataSet(string filename, string TSql)
{
DataSet ds;
string strCon = "Provider=Microsoft.Jet.OLEDB.4.0;Extended Properties=Excel 8.0;data source=" + filename;
OleDbConnection myConn = new OleDbConnection(strCon);
string strCom = TSql;
myConn.Open();
OleDbDataAdapter myCommand = new OleDbDataAdapter(strCom, myConn);
ds = new DataSet();
myCommand.Fill(ds);
myConn.Close();
return ds;
}
使用方法如下,只要写Sql语句就行了
[C#] 纯文本查看 复制代码
//设置T_Sql
string TSql = "SELECT * FROM [sheel1$]";
//读取数据
DataTable table = ExcelToDataSet(fullPath, TSql).Tables[0];
在这种情况下大家一般都会碰到这样的问题
如果是动态导入很多Excel表格的时候,他们的表名可能不一样,总不能每次都输入一次表名吧,其它不需要的
只要用下面的方法就可以得到表名
请看代码
[C#] 纯文本查看 复制代码
/// <summary>
/// 动态取Excel表名
/// </summary>
/// <param name="fullPath">文件路径</param>
/// <returns></returns>
public static string GetExcelFirstTableName(string fullPath)
{
string tableName = null;
if (File.Exists(fullPath))
{
using (OleDbConnection conn = new OleDbConnection("Provider=Microsoft.Jet." +
"OLEDB.4.0;Extended Properties=Excel 8.0;Data Source=" + fullPath))
{
conn.Open();
tableName = conn.GetOleDbSchemaTable(OleDbSchemaGuid.Tables, null).Rows[0][2].ToString().Trim();
}
}
return tableName;
}
修改上面的代码如下所示
[C#] 纯文本查看 复制代码
string tableName = GetExcelFirstTableName("文件 路径");
//设置T_Sql
string TSql = "SELECT * FROM [" + tableName + "]";
//读取数据
DataTable table = ExcelToDataSet(fullPath, TSql).Tables[0];
问题解决了
作者: 天天教程网 时间: 2014-3-29 11:33
还推荐几个读写excel的开源组件,自己在工作中用过的:
1.Excel Data Reader
http://exceldatareader.codeplex.com/
2.npoi
http://npoi.codeplex.com/
作者: ching126 时间: 2014-9-5 23:38
强烈支持楼主ing……
作者: changchengt 时间: 2017-7-13 15:34
老大,遇到个问题,当一个单元格内有换行时会出错,比如某个单元格内是数字7,在7之前有个换行(alt+enter)这时,7不会导入到datatable中。
作者: changchengt 时间: 2017-7-13 16:25
@站长苏飞
作者: 站长苏飞 时间: 2017-7-13 17:36
你用的什么方法导的。
我这个代码测试过并不存在你说的问题
作者: changchengt 时间: 2017-7-14 08:24
用的是您的那个excelhelper~
作者: 站长苏飞 时间: 2017-7-14 08:35
用这个文章里面的方法
作者: changchengt 时间: 2017-7-14 09:35
@站长苏飞 确实还是不行,结果如图片,数字7上面有个换行,站长大大帮忙看看
作者: 站长苏飞 时间: 2017-7-14 09:37
这个应该不是取不了,是看不到吧,有换行看不到的吧,你提取到string中查看一下。我昨天测试过是正常的。
作者: changchengt 时间: 2017-7-14 09:52
取到是string确实也看不到
作者: changchengt 时间: 2017-7-14 10:18
本帖最后由 changchengt 于 2017-7-14 10:19 编辑
解决了,原因是数据格式不一致的原因,在连接字符串中增加一个IMEX=1,代表将所有数据均按文本处理,就能取出来了
string strCon = "Provider=Microsoft.Ace.OleDb.12.0;Data Source=" + ExcelFilePath + ";Extended Properties=\'Excel 12.0;IMEX=1\'";
作者: 站长苏飞 时间: 2017-7-14 12:34
强烈支持楼主ing……
欢迎光临 苏飞论坛 (http://www.sufeinet.com/) |
Powered by Discuz! X3.4 |