首页软件新闻工具软件操作系统办公软件聊天工具多媒体网页制作网页设计网站运营平面设计作品欣赏数据库程序组网
Ghost | Kugoo | 遨游 | Xp | Dw | Fw | Flash | Ps | 迅雷 | CD | ill | CAD | 五笔 | Word | Excel | Wps | Msn | QQ | 学电脑 | Asp | Php | Jsp | 3Dmax | 海报 | 包装 | 标志 | 地产 | 插画

在Asp.net用C#建立动态Excel

来源:佚名(读取中...) 2006-7-4 【字体: 】 切换为

下面是原文章

Create Dynamic ASP.NET Excel Workbooks In C#

By Peter A. Bromberg, Ph.D.

Printer - Friendly Version

There is also, in the downloadable solution, a utility class "SPGen" that handles running stored

Generating native Excel spreadsheets from your web server is not that difficult with ASP.NET. What can be difficult is making instances of Excel.exe go away so you don't open up TaskMgr and see 123 instances of EXCEL.EXE still sitting in memory. I provide here a solution that has two methods, "CreateExcelWorkbook", which runs a stored proceduire that returns a DataReader and assembles a native Excel Workbook from it, saves it to the filesystem, and creates a "Download" link so the user can either load the report into Excel in their browser, or download the XLS file. The second method, GenerateCSVReport, does essentially the same thing but creates a CSV file that will, of course, also load into Excel. The CSV code correctly handles a common developer problem in that if you have a column that has leading zeroes, they are preserved.

procedures and returning DataReaders, and a RemoveFiles utility method that cleans up any XLS or CSV file older than the specified number of minutes. The key method presented below is the CreateExcelWorkbook method.

NOTE: You should be aware that you will probably need to run this page under an account that has administrative privileges as it needs write permissions to store the generated Excel or CSV files on the webserver's file system. Probably the easiest way to handle this is to have the page in its own folder with its own web.config, and insert an <identity impersonate ="true" ... elment. You may also need to enable ACL permissions on the physical folder as well so that the identity the page runs under has write permissions. Finally, you'll need to set a COM reference to the Excel 9.0 or Excel 10 Typelibrary and let VS.NET generate the Interop assemblies for you. I believe MS also has a link on their Office site where you can download the Office primary Interop Assemblies.

<identity impersonate="true" userName="adminuser" password="adminpass" />

Note especially the code block that does the "cleanup" of the Excel objects:

// Need all following code to clean up and extingush all references!!!

oWB.Close(null,null,null);

oXL.Workbooks.Close();

oXL.Quit();

System.Runtime.InteropServices.Marshal.ReleaseComObject (oRng);

System.Runtime.InteropServices.Marshal.ReleaseComObject (oXL);

System.Runtime.InteropServices.Marshal.ReleaseComObject (oSheet);

System.Runtime.InteropServices.Marshal.ReleaseComObject (oWB);

oSheet=null;

oWB=null;

oXL = null;

GC.Collect(); // force final cleanup!

This is necessary because all those littlle objects "oSheet", "oWb" , 'oRng", etc. are all COM instances and we need to use the InteropServices ReleaseComObject method of the Marshal class to get rid of them in .NET.

private void CreateExcelWorkbook(string spName, SqlParameter[] parms)

{

string strCurrentDir = Server.MapPath(".") + "\\";

RemoveFiles(strCurrentDir); // utility method to clean up old files

Excel.Application oXL;

Excel._Workbook oWB;

Excel._Worksheet oSheet;

Excel.Range oRng;

try

{

GC.Collect();// clean up any other excel guys hangin' around...

oXL = new Excel.Application();

oXL.Visible = false;

//Get a new workbook.

oWB = (Excel._Workbook)(oXL.Workbooks.Add( Missing.Value ));

oSheet = (Excel._Worksheet)oWB.ActiveSheet;

//get our Data

string strConnect = System.Configuration.ConfigurationSettings.AppSettings["connectString"];

SPGen sg = new SPGen(strConnect,spName,parms);

SqlDataReader myReader = sg.RunReader();

// Create Header and sheet...

int iRow =2;

for(int j=0;j<myReader.FieldCount;j++)

{

oSheet.Cells[1, j+1] = myReader.GetName(j).ToString();

}

// build the sheet contents

while (myReader.Read())

{

for(int k=0;k < myReader.FieldCount;k++)

{

oSheet.Cells[iRow,k+1]= myReader.GetValue(k).ToString();

}

iRow++;

}// end while

myReader.Close();

myReader=null;

//Format A1:Z1 as bold, vertical alignment = center.

oSheet.get_Range("A1", "Z1").Font.Bold = true;

oSheet.get_Range("A1", "Z1").VerticalAlignment =Excel.XlVAlign.xlVAlignCenter;

//AutoFit columns A:Z.

oRng = oSheet.get_Range("A1", "Z1");

oRng.EntireColumn.AutoFit();

oXL.Visible = false;

oXL.UserControl = false;

string strFile ="report" + System.DateTime.Now.Ticks.ToString() +".xls";

oWB.SaveAs( strCurrentDir + strFile,Excel.XlFileFormat.xlWorkbookNormal,

null,null,false,false,Excel.XlSaveAsAccessMode.xlShared,false,false,null,null,null);

// Need all following code to clean up and extingush all references!!!

oWB.Close(null,null,null);

oXL.Workbooks.Close();

oXL.Quit();

System.Runtime.InteropServices.Marshal.ReleaseComObject (oRng);

System.Runtime.InteropServices.Marshal.ReleaseComObject (oXL);

System.Runtime.InteropServices.Marshal.ReleaseComObject (oSheet);

System.Runtime.InteropServices.Marshal.ReleaseComObject (oWB);

oSheet=null;

oWB=null;

oXL = null;

GC.Collect(); // force final cleanup!

string strMachineName = Request.ServerVariables["SERVER_NAME"];

errLabel.Text="<A href=http://" + strMachineName +"/ExcelGen/" +strFile + ">Download Report</a>";

}

catch( Exception theException )

{

String errorMessage;

errorMessage = "Error: ";

errorMessage = String.Concat( errorMessage, theException.Message );

errorMessage = String.Concat( errorMessage, " Line: " );

errorMessage = String.Concat( errorMessage, theException.Source );

errLabel.Text= errorMessage ;

}

}

-翻译匆忙 ,有误请谅解 ,欢迎指点,探讨 ---小徐

上一页  [1] [2] 

    相关新闻
    用户评论
数据载入中,请稍后……
评论内容:不能超过100字,不需审核,请自觉遵守互联网相关政策法规。
发表评论: 匿名发表 用户名: loading 位网友发表了评论 查看评论
(0/100)
    推广服务
IT部落推荐阅读
·生活服务
·精彩图文
·赞助商链接