如何快速将数据导出成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(); orareader.Dispose(); oracomm.Dispose(); //System.Runtime.InteropServices.Marshal.ReleaseComObject(xBk); //System.Runtime.InteropServices.Marshal.ReleaseComObject(excel); //System.Runtime.InteropServices.Marshal.ReleaseComObject(xSt); xBk = null; excel = null; xSt = null; GC.Collect(); }
[解决办法]
建议在数据处理时,尽量使用存数过程,这样可以提高一下数据库处理的效率。别的方法可能就是通过视图,这样也能提高效率。
[解决办法]
先 把 数据 全部给提取出来, 然后再写入到文件中,这个应该会很快的吧。。。
[解决办法]
用oledb去写 excel吧。
[解决办法]
导出出xml格式的,数据多的可以分工作表的
参见
http://dotnet.aspx.cc/file/Export-Gridview-To-Excel-With-Multi-Sheet.aspx
[解决办法]
写excel啊,如果没有格式改变,只是将二维矩阵形式的数据写进excel的话应该不难吧、
如果有格式改变的话,那肯定是要设计excel office vba的相关操作了
[解决办法]
- C# code
string fileName,filePath,strLine; FileStream objFileStream; StreamWriter objStreamWriter; fileName = "NewFile.xls"; filePath = "c:\\"+fileName; objFileStream = new FileStream(filePath,FileMode.Create,FileAccess.ReadWrite); objStreamWriter = new StreamWriter(objFileStream,System.Text.Encoding.Default); objStreamWriter.AutoFlush=true; strLine = "第一列\t第二列\t第三列"; objStreamWriter.WriteLine(strLine); strLine = ""; DataSet ds = new DataSet(); ds=....(查询出来的数据) for(int j=0;j<=ds.Tables[0].Rows.Count-1;j++) { strLine += "\r"; for (int i = 0; i < ds.Tables[0].Columns.Count-1; i++) { strLine = strLine + ds.Tables[0].Rows[j][i].ToString()+"\t"; } strLine += ds.Tables[0].Rows[j][ds.Tables[0].Columns.Count-1].ToString(); strLine = strLine.Trim(); objStreamWriter.WriteLine(strLine); strLine=""; } objStreamWriter.Flush(); objFileStream.Flush(); objStreamWriter.Close(); objFileStream.Close();
[解决办法]
对应楼主的方法不知道你是不是从那个网站上面找到的,这样一条条赋值肯定会慢哈,有个方法是读取值,
//创建缓存数据
object[,] ObjData = new object[RowCount + 1, ColCount];
然后将值全部写入这个2维数组
定义 Microsoft.Office.Interop.Excel.Range Range;
Range = XLsheek.get_Range(Xlapp.Cells[1, 1], Xlapp.Cells[RowCount + 1, ColCount]);
Range.Value2 = ObjData;
[解决办法]
[解决办法]
把一个table导出成CSV文件,然后把CSV转化成excel
spool csvfilepath;
select * from ..... ; --要导出的结果集
spool off;
直接复赋值数组到EXCEL
[解决办法]
===============================以下是.net导出Excel的通用方法==============================
可以适用的C#中的所有数据绑定控件,如repeater,gridView,DataList,还可以用于普通的table显示的数据,即使有分页也不用担心了,
该函数可以避免再重新创建另外一个数据绑定控件,函数本身就能解决分页问题。大家可以参考参考!
/// <summary>
/// 得到导出数据
/// </summary>
/// <returns></returns>
protected string GetContent()
{
string retVal = "";
string head = "编号,游戏,公会名,标题,描述,状态,更新时间,创建时间";
string contentFormat = "";
int recordCount = 0;
int pageCount = 0;
StringBuilder sbContent = new StringBuilder();
DataTable dt = ActivityMgr.GetByCondition(this.gameidx, 0, this.guildName, this.title, this.description,
int.Parse(this.Status), this.StartDate, this.EndDate,
int.MaxValue, 1,out recordCount, out pageCount);
sbContent.AppendLine(head);
if (dt != null && dt.Rows.Count>0)
{
foreach (DataRow dr in dt.Rows)
{
contentFormat = string.Format("{0},{1},{2},{3},{4},{5},{6},{7}",
dr["IDX"],dr["GameName"], dr["GuildName"], dr["Title"], dr["Description"].ToString().Replace(',', ','),
CommonHelper.Get3StatusString(dr["Status"].ToString()), dr["UpdateTime"], dr["RowTime"]);
sbContent.AppendLine(contentFormat);//有换行
}
}
retVal = sbContent.ToString();
return retVal;
}
/// <summary>
/// 导出Excel
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
protected void BtnExport_Click(object sender, EventArgs e)
{
SaveCSV saveFile = new SaveCSV(this.Response);
string FullPath = string.Format(@"ListActivity_{0}.csv", DateTime.Now.ToShortDateString());
string content = GetContent();
bool retVal = saveFile.OutFile(FullPath, content);
if (retVal)
{
this.Alert(@"数据导出成功!");
}
else
{
this.Alert(@"数据导出失败!");
}
}
本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/hongjiaoli/archive/2009/10/23/4716844.aspx