C#读取大数据量Excel,60W行数据

caorenlong 2015-03-28 02:33:38
用了两种方式读excel,其中存到ds中,只能读到2W行; 另一种效率极低,还在继续测试着。
有没有大神遇到过这种情况,能快速的读到60W行数据。

用下面这种方式读到DataSet中,最后发现ds中,只有2W多行数据。
OleDbDataAdapter adapter = new OleDbDataAdapter(string.Format("select * from [{0}]", sheetName), objConn);
adapter.Fill(ds, "XLSData");

后来又用了其他的一种方式。定义一个实体类,存到list中。 但效率有些低,大约1秒读12行数据,照这种速度,即使读完了,也需要16个小时, 现在读了1个多小时了,list才4W行数据,还在继续,想看一下能读到多少行。
Microsoft.Office.Interop.Excel.Application excel = new Microsoft.Office.Interop.Excel.Application();//引用Excel对象
Microsoft.Office.Interop.Excel.Workbook importWorkBook = excel.Workbooks.Open(path);//引用Excel工作簿
Microsoft.Office.Interop.Excel.Worksheet importSheet = (Microsoft.Office.Interop.Excel.Worksheet)importWorkBook.Worksheets[1];
int count = importSheet .UsedRange.Rows.Count;
for (int i = 2; i <= count ; i++)
{
string a = (Microsoft.Office.Interop.Excel.Range)CurrentSheet.Cells[i, 1];
...
list.add(a);
}
...全文
3229 30 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
30 条回复
切换为时间正序
请发表友善的回复…
发表回复
wt33401716 2016-03-01
  • 打赏
  • 举报
回复
楼主是怎么解决的。学习下
caorenlong 2015-04-07
  • 打赏
  • 举报
回复
Aspose.Cell 从网上下载了几个版本,添加到引用后, using的时候,出不来. 也许和系统有关, 用的Win10 试用版 64位系统.也注册不了 NOPI 也试过了, 中间出了点问题,从网上搜了些资料,也没搜到. 目前用的二维数组的方式实现的, 6列,38W行数据, 大约1分钟吧. 感谢各位大神,结贴了.
fly_lalala 2015-04-04
  • 打赏
  • 举报
回复
NOPI 强烈推荐 不会可以私信我
NGC3623 2015-04-03
  • 打赏
  • 举报
回复

这样,先用导入MSSQL中。然后从数据库中读。
这种问题觉着没必要死脑筋,非要直接从Excel中读,想些贱办法感觉不错。
qq1746178060 2015-04-03
  • 打赏
  • 举报
回复
把多个Excel文件汇总到一个Excel文件 private void btn_Gather_Click(object sender, EventArgs e) { object missing = System.Reflection.Missing.Value;//定义object缺省值 string[] P_str_Names = txt_MultiExcel.Text.Split(',');//存储所有选择的Excel文件名 string P_str_Name = "";//存储遍历到的Excel文件名 List<string> P_list_SheetNames = new List<string>();//实例化泛型集合对象,用来存储工作表名称 Microsoft.Office.Interop.Excel.Application excel = new Microsoft.Office.Interop.Excel.Application();//实例化Excel对象 //打开指定的Excel文件 Microsoft.Office.Interop.Excel.Workbook workbook = excel.Application.Workbooks.Open(txt_Excel.Text, missing, missing, missing, missing, missing, missing, missing, missing, missing, missing, missing, missing, missing, missing); Microsoft.Office.Interop.Excel.Worksheet newWorksheet = (Microsoft.Office.Interop.Excel.Worksheet)workbook.Worksheets.Add(missing, missing, missing, missing);//创建新工作表 for (int i = 0; i < P_str_Names.Length - 1; i++)//遍历所有选择的Excel文件名 { P_str_Name = P_str_Names[i];//记录遍历到的Excel文件名 //指定要复制的工作簿 Microsoft.Office.Interop.Excel.Workbook Tempworkbook = excel.Application.Workbooks.Open(P_str_Name, missing, missing, missing, missing, missing, missing, missing, missing, missing, missing, missing, missing, missing, missing); P_list_SheetNames = GetSheetName(P_str_Name);//获取Excel文件中的所有工作表名 for (int j = 0; j < P_list_SheetNames.Count; j++)//遍历所有工作表 { //指定要复制的工作表 Microsoft.Office.Interop.Excel.Worksheet TempWorksheet = (Microsoft.Office.Interop.Excel.Worksheet)Tempworkbook.Sheets[P_list_SheetNames[j]];//创建新工作表 TempWorksheet.Copy(missing, newWorksheet);//将工作表内容复制到目标工作表中 }//codego.net/ Tempworkbook.Close(false, missing, missing);//关闭临时工作簿 } workbook.Save();//保存目标工作簿 workbook.Close(false, missing, missing);//关闭目标工作簿 MessageBox.Show("已经将所有选择的Excel工作表汇总到了一个Excel工作表中!", "提示", MessageBoxButtons.OK, MessageBoxIcon.Information); CloseProcess("EXCEL");//关闭所有Excel进程 }
老李家的小二 2015-04-03
  • 打赏
  • 举报
回复
如果数据量很大的话,全部读入内存不现实啊,就像楼上说的,能否边读边处理呢,内存中只保留必要数据。
泡泡龙 2015-04-02
  • 打赏
  • 举报
回复
不能按单元格读取,必须使用数组,一次读几十万行也就是几秒钟
S314324153 2015-03-31
  • 打赏
  • 举报
回复
把这个Excel当做一个数据库,用ado,odbc,之类链接,读取
带你一起飞吧 2015-03-31
  • 打赏
  • 举报
回复
用NOPI 吧
sdsxc 2015-03-31
  • 打赏
  • 举报
回复
学习! 不过感觉现有的模式肯定不合适。微软集成的这几个工具读取的话确实不合适,上边有人提到了NOPI 感觉你可以试试!
caorenlong 2015-03-31
  • 打赏
  • 举报
回复
感谢各位大神,学习了, 这几天工作有点忙,没来得及测试效果. 迟一点结贴. 有其他好的方法也一并贴上来,分不是问题,追加也没问题,不过得先有大神告诉我怎么追加...
饮水需思源 2015-03-30
  • 打赏
  • 举报
回复
用ado+分页试试
IT路漫漫 2015-03-30
  • 打赏
  • 举报
回复
我批量导入就是用OleDbDataAdapter读取excel到dataset的 60W+的数据也导入过 也没发现只能读取2W条 其他代码贴出来看看
黑子大哥 2015-03-30
  • 打赏
  • 举报
回复
为什么要一口气读出来?如果可以不一口气读取,建议读取一条处理一条,60W,如果列太多,你有考虑电脑的内存么?
hansin 2015-03-30
  • 打赏
  • 举报
回复
range = Sheet.Range("A1:ZZ600000") Object data(,) = range.Value
winner2050 2015-03-29
  • 打赏
  • 举报
回复
你用com来读取,能不慢吗? 这个是上世纪在c/s程序常用的套路,被你给搬到asp.net里面了。 两个人一起点击,几乎就瘫痪了。
software_artisan 2015-03-29
  • 打赏
  • 举报
回复
如果要对数据进行查询的话,不如先把数据导入到数据库
siecj 2015-03-29
  • 打赏
  • 举报
回复
如果你用的office 2007格式的.xlsx文件的话,可以试一试OpenXml。
wjq 2015-03-29
  • 打赏
  • 举报
回复
说实话,如果是这种数据量,那么首先通过程序或者手工把数据转换为csv文本文件再读取不是更快么?
加载更多回复(7)

111,093

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • AIGC Browser
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧