關於asp.net導出Excel時關聯迅雷下載

在利用開源MyXls導出Excel時,對於安裝着迅雷的客戶端,導出時會關聯迅雷,如果用迅雷下載,下載的是這個頁面即aspx文件,而非想要的的報表

 

爲了解決這個問題費盡心思,bd,Google,沒找到答案,後來自己看看源碼,細細研究了一下解決了

 

迅雷下載時重定位了資源,所以下載得到的是網頁的。這樣我們可以每次點擊導出時轉到另一個新的頁面,在新頁面的page_load中處理

導出,導出時用迅雷就會得到需要的報表而不是aspx文件。但是還有問題,就是用迅雷下載的報表可能打不開或出問題,這樣又費了些力氣,在

代碼中加入了兩行代碼,才得以解決。即:先把要導出的報表在服務器保存一份,再send(),如下處理

string path = Server.MapPath("./"); xls.Save(path, true); xls.Send(); System.IO.File.Delete(path + xls.FileName);

 

在轉交新頁面時,對於redirect直接轉過去的,不會有問題,挺好,而對於window.open()打開的,如果在url參數中有中文,問題就又出

來了。迅雷下載會出毛病。經過一番實驗,查找,得以解決。對於新頁面用window.open()打開的,如果url參數中帶有中文,則要傳遞時用escape(),

在新頁面中接受時,要用Microsoft.JScript.GlobalObject.unescape(),這樣,問題就都解決了。

 

下面是一導出代碼示例:

private void ExcelExport(IList< LineLossInfo > lossListExcel)

   {

   XlsDocument xls = new XlsDocument();

   xls.FileName = "LineLossMonthDetail.xls";//指定文件名

   Worksheet sheet = xls.Workbook.Worksheets.Add("LineLossMonthDetail");

   #region 設置各數據列的大小

   ColumnInfo colInfo1 = new ColumnInfo(xls, sheet);

   colInfo1.ColumnIndexStart = 0;

   colInfo1.ColumnIndexEnd = 1;

   colInfo1.Width = 15 * 256;

   sheet.AddColumnInfo(colInfo1);

   ColumnInfo colInfo2 = new ColumnInfo(xls, sheet);

   colInfo2.ColumnIndexStart = 2;

   colInfo2.ColumnIndexEnd = 2;

   colInfo2.Width = 15 * 256;

   sheet.AddColumnInfo(colInfo2);

   ColumnInfo colInfo3 = new ColumnInfo(xls, sheet);

   colInfo3.ColumnIndexStart = 3;

   colInfo3.ColumnIndexEnd = 3;

   colInfo3.Width = 15 * 256;

   sheet.AddColumnInfo(colInfo3);

   ColumnInfo colInfo4 = new ColumnInfo(xls, sheet);

   colInfo4.ColumnIndexStart = 4;

   colInfo4.ColumnIndexEnd = 4;

   colInfo4.Width = 15 * 256;

   sheet.AddColumnInfo(colInfo4);

   ColumnInfo colInfo5 = new ColumnInfo(xls, sheet);

   colInfo5.ColumnIndexStart = 5;

   colInfo5.ColumnIndexEnd = 5;

   colInfo5.Width = 32 * 256;

   sheet.AddColumnInfo(colInfo5);

   #endregion

   Cells cells = sheet.Cells;

   #region 合併單元格,得到報表標題

   MergeArea maTitle = new MergeArea(1, 2, 1, 6);

   sheet.AddMergeArea(maTitle);

   XF xfTitle = xls.NewXF();

   xfTitle.HorizontalAlignment = HorizontalAlignments.Centered;

   xfTitle.VerticalAlignment = VerticalAlignments.Centered;

   xfTitle.Font.FontName = "宋體";

   xfTitle.Font.Height = 16 * 20;

   xfTitle.Font.Bold = true;

   cells.Add(1, 1, divDataHeader.InnerText, xfTitle);

   #endregion

   MergeArea maTime1 = new MergeArea(3, 3, 1, 6);

   sheet.AddMergeArea(maTime1);

   XF xfTopBar = xls.NewXF();

   xfTopBar.Font.FontName = "宋體";

   cells.Add(3, 1, divDataCondition.InnerText, xfTopBar);

   #region 設置Excel數據列標題的格式

   XF xfDataHead = xls.NewXF();

   xfDataHead.HorizontalAlignment = HorizontalAlignments.Centered;

   xfDataHead.VerticalAlignment = VerticalAlignments.Centered;

   xfDataHead.Font.FontName = "宋體";

   xfDataHead.Font.Bold = true;

   xfDataHead.UseBorder = true;

   xfDataHead.BottomLineStyle = 1;

   xfDataHead.BottomLineColor = Colors.Black;

   xfDataHead.TopLineStyle = 1;

   xfDataHead.TopLineColor = Colors.Black;

   xfDataHead.LeftLineStyle = 1;

   xfDataHead.LeftLineColor = Colors.Black;

   xfDataHead.RightLineStyle = 1;

   xfDataHead.RightLineColor = Colors.Black;

   #endregion

   #region 添加列標題

   cells.Add(4, 1, "日期", xfDataHead);

   cells.Add(4, 2, "供電量", xfDataHead);

   cells.Add(4, 3, "用電量", xfDataHead);

   cells.Add(4, 4, "損失量", xfDataHead);

   cells.Add(4, 5, "損失率", xfDataHead);

   cells.Add(4, 6, "說明", xfDataHead);

   #endregion

   #region 設置各數據列的格式

   XF xfData = xls.NewXF();

   xfData.Font.FontName = "宋體";

   xfData.UseBorder = true;

   xfData.BottomLineStyle = 1;

   xfData.BottomLineColor = Colors.Black;

   xfData.TopLineStyle = 1;

   xfData.TopLineColor = Colors.Black;

   xfData.LeftLineStyle = 1;

   xfData.LeftLineColor = Colors.Black;

   xfData.RightLineStyle = 1;

   xfData.RightLineColor = Colors.Black;

   #endregion

   #region 填充數據

   int i = 5;//從第五行開始爲數據行

   double provideTotal = 0;

   double useTotal = 0;

   double lossTotal = 0;

   foreach(LineLossInfo lossItem in lossListExcel)

   {

   cells.Add(i,1,lossItem.Date,xfData);

   if (Double.IsNaN(lossItem.ProvideValue))

   cells.Add(i, 2, "-", xfData);

   else

   {

   cells.Add(i, 2, lossItem.ProvideValue, xfData);

   provideTotal += lossItem.ProvideValue;

   }

   if (Double.IsNaN(lossItem.UseValue))

   cells.Add(i, 3, "-", xfData);

   else

   {

   cells.Add(i, 3, lossItem.UseValue, xfData);

   useTotal += lossItem.UseValue;

   }

   if (Double.IsNaN(lossItem.LossValue))

   cells.Add(i, 4, "-", xfData);

   else

   {

   cells.Add(i, 4, lossItem.LossValue, xfData);

   lossTotal += lossItem.LossValue;

   }

   if(Double.IsNaN(lossItem.LossRate))

   cells.Add(i,5,"-",xfData);

   else

   cells.Add(i,5,lossItem.LossRate,xfData);

   if(String.IsNullOrEmpty(lossItem.Info))

   cells.Add(i,6,"-",xfData);

   else

   cells.Add(i,6,lossItem.Info,xfData);

   i++;

   }

   //添加總計

   cells.Add(i, 2, "總計:", xfData);

   cells.Add(i, 3, provideTotal, xfData);

   cells.Add(i, 4, useTotal, xfData);

   cells.Add(i, 5, lossTotal, xfData);

   #endregion

 

string path=

   //發送到客戶端

   xls.Send();

   }

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章