asp.net 建立execel表格

來源:互聯網
上載者:User

Asp.net中建立本地的Excel表,並由伺服器向外傳播是容易實現的,而刪除掉嵌入的Excel.exe進程是困難的。所以 你不要開啟工作管理員 ,看Excel.exe進程相關的東西是否還在記憶體裡面。我在這裡提供一個解決方案 ,裡面提供了兩個方法 :

"CreateExcelWorkbook"(說明 建立Excel活頁簿) 這個方法 運行一個預存程序 ,返回一個DataReader 並根據DataReader 來產生一個Excel活頁簿 ,並儲存到檔案系統中,建立一個“download”串連,這樣 使用者就可以將Excel表匯入到瀏覽器中也可以直接下載到機器上。

第二個方法:GenerateCSVReport 本質上是做同樣的一件事情,僅僅是儲存的檔案的CSV格式 。仍然 匯入到Excel中,CSV代碼能解決一個開發中的普片的問題:你有一列 裡面倒入了多個零,CSV代碼能保證零不變空 。(說明: 就是在Excel表中多個零的值 不能儲存的問題)


在可以下載的解決方案中,包含一個有效類 ” SPGen” 能運行預存程序並返回DataReader ,一個移除檔案的方法 能刪除早先於一個特定的時間值。下面出現的主要的方法就是CreateExcelWorkbook


注意:你必須知道 在運行這個頁面的時候,你可能需要能在WebSever 伺服器的檔案系統中寫 Excel,Csv檔案的管理員的許可權。處理這個問題的最簡單的方法就是運行這個頁面在自己的檔案夾裡面並包括自己的設定檔。並在設定檔中添加下面的元素<identity impersonate ="true" ... 。你仍然需要物理檔案夾的存取控制清單(ACL)的寫的許可權,只有這樣啟動並執行頁面的身份有寫的許可權,最後,你需要設定一個Com串連到Excel 9.0 or Excel 10 類型庫 ,VS.NET 將為你產生一個裝配件。我相信 微軟在他們Office網站上有一個串連,可以下載到微軟的初始的裝配件。(可能不準,我的理解是面向.net的裝配件)


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


特別注意 下面的代碼塊的作用是清除Excel的對象。


// 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!



這是必須的 ,因為oSheet", "oWb" , 'oRng", 等等 對象也是COM的執行個體,我們需要

Marshal類的ReleaseComObject的方法把它們從.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 ;

}

}

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.