日期:2014-05-18  浏览次数:20832 次

如何快速将数据导出成excel文件格式
我在服务器上运行一个程序,用C#写的,定期将oracle数据库中的数据导出成excel文件,但是发现数据导出很慢。大约7秒钟才100条数据。而经常需要导出的数据总量达到50000条,如此算来,导出文件需要约1个小时。

而在同一台服务器上运行PL/SQL工具,查询同样的数据,并另存成excel文件,整个操作一般5分钟左右,不超过10分钟。
请问有什么办法加快数据导出的速度。

附上C#程序中导出数据为excel文件部分的代码

C# code

        private void ReportOut(string filename,string strsql)
        {
            //第一步:导出数据表
            oracomm.CommandText = strsql;
            orareader = oracomm.ExecuteReader();

            //第二步:创建excel文件
            GC.Collect();

            Microsoft.Office.Interop.Excel.Application excel;
            
            Workbook xBk;
            Worksheet xSt = null;
            excel = new ApplicationClass();
            xBk = excel.Workbooks.Add(true);

            //第三步:填充excel文件

            //定义循环中要使用的变量
            int sheetIndex = 1;
            int rowIndex = 1;
            int colIndex = 1;

            while (orareader.Read())
            {
                //首行时,添加新的工作表,添加标题栏
                if (rowIndex == 1)
                {
                    //创建一个Sheet 
                    if (null == xSt)
                    {
                        //第一个工作表创建位置
                        xSt = (Worksheet)xBk.Worksheets[1];
                    }
                    else
                    {
                        //新的工作表的创建位置
                        xSt = (Worksheet)xBk.Worksheets.Add(Type.Missing, xSt, 1, Type.Missing);
                    }

                    //设置工作表名
                    xSt.Name = "数据明细" + sheetIndex.ToString();

                    //填充标题栏
                    xSt.get_Range(xSt.Cells[1, 1], xSt.Cells[1, orareader.FieldCount + 1]).HorizontalAlignment = XlVAlign.xlVAlignCenter; //设置标题居中对齐 
                    xSt.get_Range(xSt.Cells[1, 1], xSt.Cells[1, orareader.FieldCount + 1]).Font.Bold = true;//设置标题为粗体 

                    for (colIndex = 1; colIndex <= orareader.FieldCount; colIndex++)
                    {
                        xSt.Cells[1, colIndex + 1] = orareader.GetName(colIndex - 1);
                    }
                    rowIndex++;
                }

                //填充数据

                xSt.Cells[rowIndex, 1] = rowIndex - 1;

                for (colIndex = 1; colIndex <= orareader.FieldCount; colIndex++)
                {
                    if (orareader.GetFieldType(colIndex - 1) == System.Type.GetType("System.String"))
                    {
                        xSt.Cells[rowIndex, colIndex + 1] = "'" + orareader[colIndex - 1];
                    }
                    else
                    {
                        xSt.Cells[rowIndex, colIndex + 1] = orareader[colIndex - 1];
                    }
                }

                if ((rowIndex - 1) % 100 == 0)
                {
                    txtInfo.AppendText(DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss.fff ") + "已导入数据" + (rowIndex - 1).ToString() + "条!\r\n");
                    xBk.Save();
                }

                //如果超过限定行数,添加新表
                if (rowIndex >= 60000)
                {
                    //使用最佳宽度 
                    Range allDataWithTitleRange = xSt.get_Range(excel.Cells[1, 1], excel.Cells[rowIndex, colIndex + 1]);
                    allDataWithTitleRange.Select();
                    allDataWithTitleRange.Columns.AutoFit();
                    allDataWithTitleRange.Borders.LineStyle = 1;//将导出Excel加上边框 
                    sheetIndex++;
                    rowIndex = 1;
                }
                else
                {
                    rowIndex++;
                }

                
            }

           

            //第四步:保存excel文件
            xBk.SaveCopyAs("D:\\" + filename + ".xls");
            xBk.Close(false, null, null);
            excel.Quit();

            orarea