大数据量,在线生成excel的解决方案,该怎么处理
大数据量,在线生成excel的解决方案
数据量10万级,需要在web上在线生成excel,从用户体验和后台技术方案这两个角度,探讨一下应该如何解决,讨论思路即可,具体的转换代码手头已有,不过多讨论了,谢谢!
------解决思路----------------------
对Excel的导出, 稍有研究。
如果数量不大(一万条以下), 随便怎么样都可以。
象你这样在十万条以上左右, 如果还要并发, 服务器绝对死掉 —— 一个用户导出就可能就占几个G的内存。
NPOI和CloseXML导出都很占内存的。
如果数据并不复杂, 你可以试着导出 .CSV 文件。
这样导出的文件并不大, 而且速度非常快, 下载时用户体验也很好。
------解决思路----------------------
多谢帮我更新知识点,我还停留在excel2003,嘿嘿
客户提这种要求其实是为了留个凭据(如果只是备份,我想客户不会关心你用什么方式的),万一数据库里的数据出现问题,用这个凭据去对照,如果是单表容量能达到160多万,那导出是没什么问题,不过接下来的问题是,用户可能会跟你提要求,要在excel里查找数据,对应上了,可能还要更新回数据库,这个情况我以前是碰到过,挺麻烦的
------解决思路----------------------
如上面所言,就是把10w级的数据导出到Excel文件(当然是.xlsx)而已。
因为web网页是对于所有公众开放的,随意访问的,那实时生成Excel就不是好办法了,每次访问页面都执行一次导出,这是严重的设计错误啊,除非附加了动态的筛选条件的,否则都应该后台导出,然后提供URL下载。
我只坐过剪切板copy方式导出Excel,是COM组件实现的。
Oracle+winform。
查询数据-创建COM示例-创建工作表-打开sheet-复制粘贴数据-保存xlsx-释放COM资源-返回。
12个字段,6w行,20秒左右。xlsx文件大小约5MB
------解决思路----------------------
对,大数据量操作excel不太可以去,需要查看,你让他在线查看不就得了,按时间段查询,按时间段导出
用NPOI操作,服务器不用安装office
------解决思路----------------------
十万级别的excel用POI轻松搞定的。很多时候,不是程序员说什么就什么的,客户有很多愚蠢的要求,你没办法的..................
数据量10万级,需要在web上在线生成excel,从用户体验和后台技术方案这两个角度,探讨一下应该如何解决,讨论思路即可,具体的转换代码手头已有,不过多讨论了,谢谢!
------解决思路----------------------
对Excel的导出, 稍有研究。
如果数量不大(一万条以下), 随便怎么样都可以。
象你这样在十万条以上左右, 如果还要并发, 服务器绝对死掉 —— 一个用户导出就可能就占几个G的内存。
NPOI和CloseXML导出都很占内存的。
如果数据并不复杂, 你可以试着导出 .CSV 文件。
这样导出的文件并不大, 而且速度非常快, 下载时用户体验也很好。
------解决思路----------------------
多谢帮我更新知识点,我还停留在excel2003,嘿嘿
客户提这种要求其实是为了留个凭据(如果只是备份,我想客户不会关心你用什么方式的),万一数据库里的数据出现问题,用这个凭据去对照,如果是单表容量能达到160多万,那导出是没什么问题,不过接下来的问题是,用户可能会跟你提要求,要在excel里查找数据,对应上了,可能还要更新回数据库,这个情况我以前是碰到过,挺麻烦的
------解决思路----------------------
如上面所言,就是把10w级的数据导出到Excel文件(当然是.xlsx)而已。
因为web网页是对于所有公众开放的,随意访问的,那实时生成Excel就不是好办法了,每次访问页面都执行一次导出,这是严重的设计错误啊,除非附加了动态的筛选条件的,否则都应该后台导出,然后提供URL下载。
我只坐过剪切板copy方式导出Excel,是COM组件实现的。
Oracle+winform。
查询数据-创建COM示例-创建工作表-打开sheet-复制粘贴数据-保存xlsx-释放COM资源-返回。
12个字段,6w行,20秒左右。xlsx文件大小约5MB
/// <summary>
/// 使用粘贴板进行写入
/// 此函数需要依赖office实例,运行的OS要安装office
/// </summary>
/// <param name="data"></param>
/// <param name="filename"></param>
/// <param name="exportHeader"></param>
public void Export2Xls(DataTable data, string filename, bool exportHeader = true)
{
if (System.IO.File.Exists(filename))
System.IO.File.Delete(filename);
Excel14._Application xlsApp = null;
Excel14._Workbook xlsBook = null;
Excel14._Worksheet xstSheet = null;
try
{
//xlsApp = new Excel14.ApplicationClass();
//xlsApp = new Excel14.Application();
xlsApp = new Excel14.Application();
xlsBook = xlsApp.Workbooks.Add();
xstSheet = (Excel14._Worksheet)xlsBook.Worksheets[1];
var buffer = new StringBuilder();
if (exportHeader)
{
// Excel中列与列之间按照Tab隔开
foreach (DataColumn col in data.Columns)
buffer.Append(col.ColumnName + "\t");
buffer.AppendLine();
}
foreach (DataRow row in data.Rows)
{
foreach (DataColumn col in data.Columns)
buffer.Append(row[col].ToString() + "\t");
buffer.AppendLine();
}
System.Windows.Forms.Clipboard.SetDataObject("");
// 放入剪切板
System.Windows.Forms.Clipboard.SetDataObject(buffer.ToString());
var range = (Excel14.Range)xstSheet.Cells[1, 1];
range.Select();
xstSheet.Paste();
// 清空剪切板
System.Windows.Forms.Clipboard.SetDataObject("");
xlsBook.SaveAs(filename);
}
catch (Exception e)
{
throw e;
}
finally
{
try
{
if (xlsBook != null)
xlsBook.Close();
if (xlsApp != null)
xlsApp.Quit();
// finally里清空Com对象
lock(this)
{
System.Runtime.InteropServices.Marshal.ReleaseComObject(xstSheet);
System.Runtime.InteropServices.Marshal.ReleaseComObject(xlsBook);
System.Runtime.InteropServices.Marshal.ReleaseComObject(xlsApp);
xstSheet = null;
xlsBook = null;
xlsApp = null;
GC.Collect();
}
}
catch (System.Exception ex)
{
throw ex;
}
}
}
------解决思路----------------------
对,大数据量操作excel不太可以去,需要查看,你让他在线查看不就得了,按时间段查询,按时间段导出
用NPOI操作,服务器不用安装office
------解决思路----------------------
十万级别的excel用POI轻松搞定的。很多时候,不是程序员说什么就什么的,客户有很多愚蠢的要求,你没办法的..................