在ASPNET中进行EXCEL开发.docx
《在ASPNET中进行EXCEL开发.docx》由会员分享,可在线阅读,更多相关《在ASPNET中进行EXCEL开发.docx(7页珍藏版)》请在冰豆网上搜索。
在ASPNET中进行EXCEL开发
在ASP.NET中进行EXCEL开发
在ASP.NET中进行EXCEL开发在显示大量数据的时候,使用EXCEL无疑是一个很好的选择,以网格为基本的数据单元,配合上众多的计算公式和颜色、线条可以组成功能强大而美观的数据报表。
在现代企业中,这种应用也是最为广泛的。
因此在Web项目中,生成并输出EXCEL报表也成了非常常见的功能。
但是,在ASP.NET中使用EXCEL却一直存在着以EXCEL进程无法释放为代表的几个比较讨厌而且难于解决的问题,在这篇文章中将给出完整的解决方案。
其中包含以下几个方面:
开发环境配置DCOM在ASP.NET中进行EXCEL编程优化EXCEL的执行效率在Web项目中使用EXCEL的其他方案
本文使用了下列技术:
.NET、C#或VisualBasic.NET、VisualStudio.NET、EXCEL
本页内容
开发环境
本文讨论的是在ASP.NET中使用MicrosoftExcelObjectLibrary进行开发的过程,开发环境的配置如下:
Windows2000+SP4
OfficeXP+SP1
VisualStudio.NET2003
注意:
在这里,请确认一下你的操作系统和Office的版本,包括补丁的版本。
虽然在绝大多数情况下Windows2000/WindowsXP、Office2000/OfficeXP的任意组合都能正常工作,但也确实存在同样的代码在仅仅是SP版本不同的两台机器上一个执行正常,而另一个却出现异常的情况。
所以,强烈建议使用与服务器环境完全一致的开发环境。
配置DCOM
对Excel进行编程,实际上就是通过.NetFramework去调用Excel的COM组件,所有要在Web环境下调用COM组件的时候,都需要对其进行相应的配置。
很多朋友都反映在Windows环境下调试正常的程序,一拿到Web环境中就出错,实际上就是因为缺少了这一步。
下面就详细介绍DCOM的配置过程。
1、运行“dcomcnfg”,打开DCOM配置程序。
2、在应用程序列表中找到“MicrosoftExcel应用程序”,点击“属性”。
3、将“常规”选项卡中的“身份验证级别”设为“无”。
4、选中“安全性”选项卡中的“使用自定义配置权限”,点击“编辑”。
5、在打开的对话框中添加“Internet来宾用户”(通常是IUSR_机器名),访问类型设为“完全控制”。
6、将“身份标识”选项卡中的用户设为“交互式用户”。
7、点击“应用”之后,关闭属性页和DCOM配置程序。
配置完成。
这里只给出了DCOM的配置方法,关于为什么要这么配置,以及更多的关于DCOM的知识就不属于这篇文章的讨论范围了,有兴趣的朋友可以自己去查阅相关资料。
在ASP.NET中进行EXCEL编程
相信99%的阅读本文的朋友,对关于如何引用Excel对象已经是非常熟悉了的。
但是为了保证这篇文章的完整性,就让我再对剩下的1%的朋友再多罗嗦几句。
打开VS.NET,创建一个Web应用程序,点击“项目”菜单中的“添加引用”,在打开的对话框的“COM”选项卡中找到“MicrosoftExcel10.0ObjectLibrary”,将其添加到项目中。
10.0的版本号表示这是OfficeXP,同样的9.0是Office2000,11.0是Office2003,这取决于你所安装的Office。
在我们正式开始编程之前,还有2件事要做。
第一件,在web.config文件的节中,加入以下这条:
<identityimpersonate="true"/>
第二件,确认一下“ASPNET”用户是否对你将要操作的Excel文件的所在目录拥有读写权限。
比如,我的Web项目是在默认的“C:
/Inetpub/wwwroot”目录中,但我要读写的Excel文件却放在“D:
/TEMP”中,那么你就要在“D:
/TEMP”的安全属性中加入“ASPNET”用户,并赋予相应的权限。
至此,执行Excel所需要的所有配置都已完成。
在即将开始的ASP.NET编程中,我将使用VB.NET语言,这可能会让C#的拥护者们感到失望,但我相信在省去了大量的Missing和类型转换之后,你可以更清晰的看到在程序中是如何控制Excel的。
其实,我也只有在对Excel进行编程的时候才用VB.NET的:
)。
本文的示例在最后完成的时候,将输出下面这样的结果:
为了更清楚的理解Excel编程的结构,我们先简单的输出一下标题部分,代码如下:
DimfilePathAsStringfilePath=Server.MapPath("testFile.xls")DimxlAppAsExcel.Application
DimxlBookAsExcel.Workbook
DimxlSheetAsExcel.Worksheet
DimxlRangeAsExcel.RangeTryxlApp=NewExcel.Application''不显示Excel窗口,自动释放,不显示提示信息
xlApp.Visible=False
xlApp.UserControl=False
xlApp.DisplayAlerts=False''打开一个作为输出模板的文件
'xlBook=xlApp.Workbooks.Open(filePath)
''或是新建一个文件
xlBook=xlApp.Workbooks.Add()''选择当前的Sheet
''【注意】索引的下标是从1开始的,而不是0
xlSheet=xlBook.Sheets
(1)DimstrTitleAsString
DimstrPosAsStringstrTitle="大航海时代4补给港口列表"''选择单元格
strPos="A1:
F1"
xlRange=xlSheet.Range(strPos)''设置单元格内容
xlRange.Formula=strTitle''字体:
18号,粗体
xlRange.Font.Size=18
xlRange.Font.Bold=True''合并单元格
xlRange.MergeCells=True''设置背景色
''使用内置的颜色
''xlRange.Interior.ColorIndex=40
''或者直接设置RGB颜色
xlRange.Interior.Color=RGB(255,204,153)''设置居中
xlRange.HorizontalAlignment=Excel.XlHAlign.xlHAlignCenter''设置行高
xlRange.RowHeight=25''保存打开的文件
'xlBook.Save()
''保存新建的文件
xlBook.SaveAs(filePath)CatchexAsException
Throwex
Finally''释放对象资源
ReleaseComObject(xlRange)
ReleaseComObject(xlSheet)IfNotxlBookIsNothingThen
xlBook.Close()
ReleaseComObject(xlBook)
EndIfIfNotxlAppIsNothingThen
xlApp.Quit()
ReleaseComObject(xlApp)
EndIf''强制回收内存
GC.Collect()
EndTry
其中的ReleaseComObject方法:
SubReleaseComObject()SubReleaseComObject(ByValobjAsObject)
IfNotobjIsNothingThen
System.Runtime.InteropServices.Marshal.ReleaseComObject(obj)
obj=Nothing
EndIf
EndSub
将这段代码放到你的项目中,执行之后,你就会在Web项目的目录中找到输出的“testFile.xls”文件。
现在,我们将整个过程的关键部分提出来,就简化为下面这样的结构:
[定义Excel对象]Try[使用Excel对象]CatchexAsException
Throwex
Finally[释放Excel对象][强制回收内存]EndTry
这种结构是保证Excel进程可以被正确释放的关键,也就是说,你必须保证所有使用过的Excel对象都被释放了。
为了让你对这种结构有更清楚的认识,我们将上面的代码按照不同的级别重新整理一下。
这样我们就可以更清楚的看到,释放对象的原则就是:
在本函数中定义并使用的Excel对象,一定要在本函数中释放。
整理过的代码如下所示:
SubExportExcel()SubExportExcel(ByValfilePathAsString)DimxlAppAsExcel.Application
DimxlBookAsExcel.WorkbookTry
xlApp=NewExcel.Application''不显示Excel窗口,自动释放,不显示提示信息
xlApp.Visible=False
xlApp.UserControl=False
xlApp.DisplayAlerts=False''打开一个作为输出模板的文件
'xlBook=xlApp.Workbooks.Open(filePath)
''或是新建一个文件
xlBook=xlApp.Workbooks.Add()FillSheet(xlBook,1)''保存打开的文件
'xlBook.Save()
''保存新建的文件
xlBook.SaveAs(filePath)
CatchexAsException
Throwex
Finally''释放对象资源
IfNotxlBookIsNothingThen
xlBook.Close()
ReleaseComObject(xlBook)
EndIfIfNotxlAppIsNothingThen
xlApp.Quit()
ReleaseComObject(xlApp)
EndIf''强制回收内存
GC.Collect()
EndTry
EndSubSubFillSheet()SubFillSheet(ByValxlBookAsExcel.Workbook,ByValindexAsInteger)DimxlSheetAsExcel.WorksheetTryxlSheet=xlBook.Sheets(index)SetTitle(xlSheet)CatchexAsException
Throwex
Finally
ReleaseComObject(xlSheet)
EndTry
EndSubSubS