程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> .NET網頁編程 >> .NET實例教程 >> 在Asp.net用C#建立動態Excel(外文翻譯)

在Asp.net用C#建立動態Excel(外文翻譯)

編輯:.NET實例教程

     在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 ;
  }
  }
  
  
  
  
  
  
  
  
  
   下面是原文章
  
  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. 下一頁:
Copyright © 程式師世界 All Rights Reserved