当前位置: 代码迷 >> C# >> C#读取大数据量Excel,60W行数据,该怎么处理
  详细解决方案

C#读取大数据量Excel,60W行数据,该怎么处理

热度:64   发布时间:2016-05-05 04:17:03.0
C#读取大数据量Excel,60W行数据
用了两种方式读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);
}
------解决思路----------------------


你用Aspose.Cell读一下试试,应会快些吧。
------解决思路----------------------
用填充的方法读取很慢的,特别是你用他自带的组件的时候就感觉很明显了,用第三方控件,再用流来读取,效果快的飞起!
------解决思路----------------------
加内存
------解决思路----------------------
http://bbs.csdn.net/topics/390992261
------解决思路----------------------
使用Office组件肯定不现实的,太慢了,可以考虑使用NOPI开源库来对Excel读取,另外使用ds方式加载,可以在Excel中定义一个状态字段,初始为pending状态,读取到ds后为in processing 状态,处理完成之后为complete状态,每次都读取pending 数据2W 条,然后使用多线程去读取,不要等处理完成后才去处理。
------解决思路----------------------
使用 ADODB 将 xlsx 作为数据库操作
------解决思路----------------------
可以考虑转到数据库里边,直接读了
------解决思路----------------------
说实话,如果是这种数据量,那么首先通过程序或者手工把数据转换为csv文本文件再读取不是更快么?
------解决思路----------------------
如果你用的office 2007格式的.xlsx文件的话,可以试一试OpenXml。
------解决思路----------------------
如果要对数据进行查询的话,不如先把数据导入到数据库
------解决思路----------------------
你用com来读取,能不慢吗?

这个是上世纪在c/s程序常用的套路,被你给搬到asp.net里面了。

两个人一起点击,几乎就瘫痪了。
------解决思路----------------------
用ado+分页试试
------解决思路----------------------
range = Sheet.Range("A1:ZZ600000")
Object data(,) = range.Value
------解决思路----------------------
为什么要一口气读出来?如果可以不一口气读取,建议读取一条处理一条,60W,如果列太多,你有考虑电脑的内存么?
------解决思路----------------------
路过 飘过 证明已来过
------解决思路----------------------
我批量导入就是用OleDbDataAdapter读取excel到dataset的 60W+的数据也导入过 也没发现只能读取2W条 其他代码贴出来看看
------解决思路----------------------
学习!  不过感觉现有的模式肯定不合适。微软集成的这几个工具读取的话确实不合适,上边有人提到了NOPI 感觉你可以试试!
------解决思路----------------------
用NOPI 吧
------解决思路----------------------
把这个Excel当做一个数据库,用ado,odbc,之类链接,读取
------解决思路----------------------
http://goobbe.com/questions/7803131/read-a-big-excel-document
------解决思路----------------------
不能按单元格读取,必须使用数组,一次读几十万行也就是几秒钟
------解决思路----------------------
把多个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进程
        }

------解决思路----------------------

这样,先用导入MSSQL中。然后从数据库中读。
这种问题觉着没必要死脑筋,非要直接从Excel中读,想些贱办法感觉不错。
------解决思路----------------------
如果数据量很大的话,全部读入内存不现实啊,就像楼上说的,能否边读边处理呢,内存中只保留必要数据。
------解决思路----------------------
NOPI 强烈推荐   不会可以私信我
  相关解决方案