首页 新闻 会员 周边 捐助

C#分段读取excel百万数据问题

0
[已解决问题] 解决于 2017-03-19 17:58

各位大神,小弟目前遇到一个问题不知如何处理,希望大神能指导,谢谢!问题是这样,现在我要做一个EXCEL文件上传功能并将EXCEL数据存库,Excel文件分块上传已经解决,EXCEL分段获取数据并存库如何实现,网上查找了好多资料还是没能解决,一次性读取EXCEL的话容易溢出而且很慢,如果能在上传的流中提取数据更好,但是不知道如何实现,所以只能退而求其次,想分段获取EXCEL中的数据并保存,因为上传过程中可能会断网,所以存库的数据要能续传,因为EXCEL数据没有ID,开发工具是VS2015,数据库是SQL2012,能贴出代码更好,小弟水平有限,有思路也不一定会实现,很着急,希望各位大神不吝赐教,谢谢!没有园豆很抱歉

不必太在乎的主页 不必太在乎 | 菜鸟二级 | 园豆:202
提问于:2017-03-18 11:37
< >
分享
最佳答案
0

odbc连excel,然后拿datareader去读

奖励园豆:5
Daniel Cai | 专家六级 |园豆:10424 | 2017-03-19 09:00

你好,有实际代码可以参考么?我的读取代码

public static DataSet ExcelToDataSet(string sheetname, string TSql)
{
DataSet excelDs;
try
{
string strCon = string.Format("Provider=Microsoft.ACE.OLEDB.12.0;Extended Properties='Excel 8.0; HDR=YES; IMEX=1';Data Source={0}", sheetname);

using (OleDbConnection OleConn = new OleDbConnection(strCon))
{
OleConn.Open();

OleDbDataAdapter OleDaExcel = new OleDbDataAdapter(TSql, OleConn);
excelDs = new DataSet();
OleDaExcel.Fill(excelDs, sheetname);
OleConn.Close();
}
}
catch (Exception exc)
{
throw exc;
}

return excelDs;

},怎么循环去设置string TSql = "SELECT * FROM [" + tableName + "] ",谢谢!

不必太在乎 | 园豆:202 (菜鸟二级) | 2017-03-19 12:11

感谢大神,虽然我没能弄出想要的效果,但是我找到了一个方法替换,可以获取到所有数据,50多万行耗时几秒钟,谢谢!,http://www.cnblogs.com/hello20xx/diary/2017/03/19/6581220.html

不必太在乎 | 园豆:202 (菜鸟二级) | 2017-03-19 18:00

@不必太在乎: 什么方法,我很好奇,可以分享下不?

云衢 | 园豆:182 (初学一级) | 2019-02-22 18:03

@不必太在乎: 您好,可以分享一下您的方法吗,我最近也遇到了这个难题,希望寻求帮助

Qinglang007 | 园豆:200 (初学一级) | 2019-08-28 10:13

@Qinglang007:
1.VS的程序包管理器控制台运行:
PM>install-Package ExcelDataReader

2.找到Excel.dll并在项目中引用,读取测试代码:
using Excel;
DateTime beforDT = System.DateTime.Now;
string filePath = @"C:\Users\Administrator\Desktop\工作\XXXXX.xlsx";
FileStream stream = File.Open(filePath, FileMode.Open, FileAccess.Read);
IExcelDataReader excelReader = ExcelReaderFactory.CreateOpenXmlReader(stream);
excelReader.IsFirstRowAsColumnNames = true;
//放到Dataset耗时比较久
//DataSet result = excelReader.AsDataSet();
while (excelReader.Read())
{
//解析数据
}
DateTime afterDT = System.DateTime.Now;
TimeSpan ts = afterDT.Subtract(beforDT);
//int len = result.Tables[0].Rows.Count;
excelReader.Close();

不必太在乎 | 园豆:202 (菜鸟二级) | 2019-08-28 11:19

@不必太在乎: 好的,已经在使用中了,没报错,也很快读取到数据了,谢谢博主哦,赞,但是有个小疑问,excelReader.IsFirstRowAsColumnNames = true; 这句好像不对哦

Qinglang007 | 园豆:200 (初学一级) | 2019-08-28 11:32

@Qinglang007: 不客气,这些方法可以根据需要调整的,只要能读出数据就行

不必太在乎 | 园豆:202 (菜鸟二级) | 2019-08-28 14:01
其他回答(1)
1

可以采用NPOI去读取excel 

https://github.com/tonyqus/npoi 

五月℃夏到了 | 园豆:17 (初学一级) | 2017-03-18 18:42

你好,谢谢,我试过了,但是只能一次性读取一个sheet,数据量大所以很慢,而且经常报异常

支持(0) 反对(0) 不必太在乎 | 园豆:202 (菜鸟二级) | 2017-03-18 19:11
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册