超高分邀请大家一起来讨论和推荐“在ASP.NET程序中以高效、轻量方式生成格式丰富的Excel文件”方案! 推荐了可用的好方案者都有分。
在ASP.NET程序中可以使用COM编程来生成Excel文件,但是使用COM组件需要在服务端安装Excel程序和配置COM组件,而且还要强制杀死Excel进程,这样对系统的部署和性能都不够理想。所以希望大家推荐一下自己使用过的好的控件或者方案,要求如下:
1. 生成的Excel文件可以设置格式:
a. 必须支持字体大小、颜色、合并单元格等设置;
b. 最好能支持页边距、的设置;
c. 最好能支持Excel文件横向、纵向设置;
d. 最好能支持Excel模板文件的加载;
e. 但是不必支持图表的显示和绘制,也就是说Excel文件中只需要显示文字。
2. 服务端不用安装Excel程序;
3. 生成的excel文件在客户端打开的时候至少能兼容Excel2003,Excel XP,最好还能兼容Excel2000。
4. 性能比较好;
5. 最好是可用的开源控件或者是完整可用的源代码;退而求其次是功能不受限制的免费控件;再次是功能受限制的免费控件;最后是破解控件也行(当然,你需要告诉我们破解的方法和工具,我的邮箱:myprojects@126.com)。
我把目前我使用过的或者找到的方案罗列和总结一下(但这些方案都或多或少没有满足上面提到的要求),有说得不对的地方大家指正:
1.Excel的COM编程
优点:
能编程实现Excel文件的各种格式功能,还支持图表、模板等。
缺点:
a. 重量级方案,部署不方便,需要在服务端安装Excel程序和配置COM;
b. 需要强制杀死Excel进程;
c. 性能低下。
我的感觉:
在C/S中可以考虑使用此方案,在B/S中根本就不用考虑这个方案。
2. HTML导出
优点:
a. 轻量级方案,服务端不用安装Excel程序。
b. 实现简单、方便。
缺点:
a. 不支持Excel文件格式的设置。
我的感觉:
这个方案在网上有相当多的例子,比如gridview导出到excel就用此方法。
如果导出的是纯数据而不需要设置Excel文件的任何格式,那么此方案是可行的。但是,如果需要设置一定的格式,则此方案显然不行。
3. 生成XML然后转换成Excel方式
参考资源:http://www.codeproject.com/office/Excel_Export.asp?df=100&forumid=329437&fr=51
优点:
a. 服务端不用安装Excel程序。
b. 支持一定的Excel文件格式设置,比如字体大小、颜色、合并单元格等。
缺点:
a. 与Excel 2000不兼容:由于Excel 2000不支持XML,所以以这种方法生成的Excel文件可能在Excel2000中不兼容(毕竟目前还有不少用户的电脑装的是Excel 2000)。
b. 可能不支持Excel文件页边距的设置;不支持Excel文件横向、纵向的设置;不支持Excel模板;
c. 编程工作量比较大;
d. 生成的文件本质上是XML文件,需要“另存为xls”才能变成真正的Excel文件。
e. 性能是好是坏还不清楚,目前还没真正在项目中用过。希望有用过此方案的朋友能介绍一下这个方案的性能。
我的感觉:
如果生成的Excel文件不需要设置复杂的格式(也就是说只需要设置一些简单的格式),这个方案是可行的。
4. 以二进制的形式编程写Excel文件
这种方案涉及底层的东西,我们不用考虑。
5.付费控件
5.1 GemBox控件
http://www.gemboxsoftware.com/Index.asp
优点:
几乎满足前面提到的所有要求,除了有一个缺点以外。
缺点:
GemBox是付费控件,而且价格不便宜。
它同时提供免费版本的控件(http://www.gemboxsoftware.com/GBSpreadsheetFree.htm),但是功能受到严重限制:一个Excel文件最多只能生成5个WorkSheet,每个WorkSheet最多生成150行数据。
如果你有破解版本或者知道如何破解,希望你能共享(我的邮箱是myprojects@126.com)
我的感觉:
我已经在一个项目中使用这个免费版本的控件,感觉非常不错。如果生成的数据少于150条,那么使用这个控件非常合适,但是如果数据数量超过150条,那就只能放弃。
5.2 Aspose.Excel
和GemBox差不多,几乎满足前面提到的所有要求。就是付费软件。
我的感觉:
以前曾经有个朋友推荐我使用这个控件的破解版本。但是奇怪的是:用注册机在一台服务器上生成的注册码能用,但是在另一台服务器上用同样的方式破解就不行,后来就放弃使用这个控件,因为我担心的是这个破解控件在开发用服务器上能运行,不能确保部署到客户生产服务器上也会正常运行。可能是我破解不当,如果你有这方面的使用经验请慷慨介绍。
6. 开源控件或者功能不受限制的控件
目前还没找到合适的,希望大家尽情推荐。
[解决办法]
既然LZ把主流的解决方案都分析的这么到位了,那么按需选择就可以了.
个人感觉再不做投资的情况下,COM和XML还是比较好的方案,当然没有完美方案了~
[解决办法]
不错,加精~
[解决办法]
我还是用aspose.cell,这个控件算基本满足lz的需要了
[解决办法]
另外提供一个开源控件,poi.net
poi.net是一个开源的控件,主要是一个office操作类,由java项目转换过来。不过这个控件我一直没敢用,一是这个控件版本很低是个04年的项目,而是他直接使用j#翻译的,所以感觉不太可靠!而且,新版的office不一点支持
[解决办法]
NickLee.Common.ExcelLite
免费,服务器不需要装excel,支持多种格式,字体,和图片读写
最主要是比MS OWC快100倍左右
可以参考blog
www.cnblogs.com/mail-ricklee
[解决办法]
引用DotExcel.dll,
在生成事件中代码如下:
ExcelLib excelLib = new ExcelLib( myDataTable);
if( excelLib.Save(fileName))
{
HttpResponse Response = HttpContext.Current.Response;
//以下代码将文件写入客户端浏览器。
Response.Clear();
Response.ContentType = "application/vnd.ms-excel";
Response.AddHeader("Content-Disposition", "attachment; filename=" + fileName );
Response.WriteFile( excelLib.ExcelFileName );
Response.Flush();
Response.Close();
}
[解决办法]
以前一个项目(b/s)也用过Excel输出,最大的一个报表文件输出有20多M,把人折磨的不轻,当然也学到不少东西,
凭着那个项目的经验,稍微就lz说的缺点部分讨论一下
1.Excel的COM编程
缺点:
a. 重量级方案,部署不方便,需要在服务端安装Excel程序和配置COM; <<--- 用其他控件的时候不也需要安装控件么,稍微多麻烦一点而已
b. 需要强制杀死Excel进程; <<--- 在程序中保证使用的资源都完全释放,各种异常都正确处理的话是可以正常退出的
c. 性能低下。 <<--- 瓶颈主要集中在设置单元格上,如果使用object[,]批量设的话,效率还是可以的
2. HTML导出
缺点:
a. 不支持Excel文件格式的设置。 <<--- 把Excel文件另存为html格式,再用UE打开,会发现很多有趣的东西^_^
[解决办法]
听说国内一个开源的Office支持微软的office,好你是永中office,看能不能找点代码
找错了别扁我
[解决办法]
曾经碰到过这样的问题,试过很多种方法,后来选择预先设置好excel格式之后添加数据。
不是很方便。
如果有开源的组件是最好的了
作个记号
[解决办法]
< <--- 把Excel文件另存为html格式,再用UE打开,会发现很多有趣的东西
是看到了不少有趣的东西,这个对于使用XML方式写excel文件是非常有帮助的,谢谢。也就是说,我们可以先在excel程序中把最终想要生成的excel文件做好,然后保存为htm文件,接着用UltraEdit打开就可以看到xml文件的样子,这样你在写xml样式文件的时候就比较容易了。感觉这有点逆向工程的味道,呵呵。
其实我也觉得这个方法是非常可取的,问题主要集中在直接输出的话需要大量调整格式的代码会比较乱,如果可以再进行一层包装的话应该会是很好的方案
< <--- 瓶颈主要集中在设置单元格上,如果使用object[,]批量设的话,效率还是可以的
我想,你说得应该是对的。
我要问的是,你那个20M的excel文件大概需要话费多少时间生成?谢谢
基于模板(3M左右)
优化前(逐单元格设置值和格式):45分钟左右
优化后(尽可能的批量设置值和格式):2分钟左右
使用COM的话,还有一个比较大的问题是内存的占用量,每个Excel App大概在10~30M。但其实一个Excel App应该可以同时供多个用户(或者说多个请求)使用,由此设想过增加一个AppPool。由于我是在项目后期才意识到这个问题,所以没能拿出具体的实现,lz倒是可以考虑一下。
[解决办法]
大家考虑的这么深,能帮我解决个小问题么?我在服务器端用了excel,为什么在本机调试就可以,而在别的机子上调试的时候,看上去好像com里的类和对象在程序里没有执行,也就没有生成对应的excel文件。
关注LZ所谓的方案能否出现。不过也从帖子里学到了不少东西。我比较没有追求,能用就行,不会把这么多需求同时考虑进来来,如果可能,我建议还是购买付费控件。不过,你的需求这么具体,其实自己开发一个为尝不可。
[解决办法]
B/S owc11
前一段时间就是在做这个,但是会受到excel版本影响!
2003和2000没法通用!
[解决办法]
OWC11.SpreadsheetClass xlsheet = new OWC11.SpreadsheetClass();
xlsheet.get_Range(xlsheet.Cells[1, 1], xlsheet.Cells[1, 9]).set_MergeCells(true);
xlsheet.ActiveSheet.Cells[1, 1] = "**";
xlsheet.get_Range(xlsheet.Cells[1, 1], xlsheet.Cells[1, 14]).Font.set_Bold(true);
xlsheet.get_Range(xlsheet.Cells[1, 1], xlsheet.Cells[1, 14]).set_HorizontalAlignment(OWC11.XlHAlign.xlHAlignCenter);
xlsheet.get_Range(xlsheet.Cells[2, 1], xlsheet.Cells[2, 14]).Font.set_Bold(true);
xlsheet.get_Range(xlsheet.Cells[2, 1], xlsheet.Cells[2, 14]).set_HorizontalAlignment(OWC11.XlHAlign.xlHAlignCenter);
xlsheet.get_Range(xlsheet.Cells[1, 1], xlsheet.Cells[1, 14]).Font.set_Size(14);
xlsheet.get_Range(xlsheet.Cells[1, 1], xlsheet.Cells[1, 9]).set_ColumnWidth(15);
xlsheet.ActiveSheet.Cells[2, 1] = "**";
int Rows = UltraWebGrid1.Rows.Count + 3;
xlsheet.get_Range(xlsheet.Cells[1, 1], xlsheet.Cells[Rows, 9]).Borders.set_LineStyle(XlLineStyle.xlContinuous);
for (int i = 0; i < UltraWebGrid1.Rows.Count; i++)
{
xlsheet.ActiveSheet.Cells[i + 3, 1] = UltraWebGrid1.Rows[i].Cells.FromKey("UserId").Text;
}
[解决办法]
使用 ado.net 的 oledbadapter,是可以的,而且不受版本限制。
注意:
如果有格式要求,需要预先提供模板文件,然后通过 COM 方式用模板创建新文件,然后保存这个空白新文件。
之后就不需要使用 COM 了。
------解决方案--------------------
用VB6->VS2003(ASP.NET)->VS2005(ASP.NET)
7年了,我一直使用根据Excel模板创建EXCEL应用的方法.
感觉很好,样式很漂亮,维护也方便,比较灵活.