CefSharp中實現Chrome中jS導出Excel


【前言】

 在博客園閑逛了一年多,平時都是借鑒別人的成功經驗,總覺得自己應該分享點什么,但是苦於自己技術有限,平時又不愛寫東西,所以一直沒有寫過任何東西。畢業一年多,在現實工作中遇到各種問題,深切體會到遇到問題時的焦急與糾結。今天決定寫自己的第一篇現實中遇到的問題。希望能夠為遇到類似問題的博友們提供一些幫助。文章可能寫的不好,請勿噴!! 

【背景】

       使用JS將<table>數據以Excel形式已經不是新鮮事情,在IE中常常使用ActiveXObject來創建Excel.application對象來處理。但是Chrome里面並不支持創建ActiveXObject對象方式來進行處理,所以有人在Chrome里面使用某種JS來進行處理導出頁面table數據,具體方式見山維空間博客

  【環境】

   先說一下自己參與項目的背景,項目架構是采B/S和C/S的混合架構。業務實現是Java實現,可以通過瀏覽器訪問,但是有一部分功能必須使用.Net實現。所以又采用.Net來做客戶端,在客戶端中使用內嵌瀏覽器的方式來實現整體功能。開始客戶端使用過webBrowser來作為內嵌瀏覽器,但是說實話,IE的東西性能太差,兼容性又不好。所以最后決定使用webKit內核的瀏覽器。最后選擇了cefSharp .

【遇到問題】

   如果讀者沒有看山維空間博客的空間,建議先看完該博客再繼續看下面。

      使用博客中提到的JS實現方式,在Chrome能夠實現將頁面<table>表格數據以Excel形式導出。但是在CefSharp里面卻沒有任何反應。跟蹤調試發現JS已經執行location.href = uri + base64(template(tables));執行完成后沒有任何操作。CefSharp中只能執行到RequestHandler控制類的 OnBeforeResourceLoad方法執行完成就結束。

具體原因未知。

【解決】

  查看OnBeforeResourceLoad方法的requestResponse參數能夠找到URL就是我們最后傳遞的數據。最后做了如下操作使得問題解決.

  實現OnBeforeBrowse方法,在該方法中做Excel導出:

  

 1  public bool OnBeforeBrowse(IWebBrowser browser, IRequest request, NavigationType naigationvType, bool isRedirect)
 2         {
 3               if (url.Contains("application/vnd.ms-excel;base64"))
 4             {
 5                 string tmpContent = url;//獲取傳遞上來的文件內容  
 6                 string contentHead = "data:application/vnd.ms-excel;base64,";
 7                 int startIndex = tmpContent.IndexOf(contentHead);
 8                 int name_StartIndex = tmpContent.IndexOf(contentHead) + contentHead.Length;
 9                 int name_EndIndex = tmpContent.IndexOf('#');
10                 string fileName = "Excel表格";
11                 if (name_EndIndex != -1)
12                 {
13                     fileName = Uri.UnescapeDataString(tmpContent.Substring(name_StartIndex, name_EndIndex - name_StartIndex));
14                     tmpContent = tmpContent.Substring(name_EndIndex + 1);
15                 }
16                 else
17                 {
18                     tmpContent = tmpContent.Substring(name_StartIndex);
19                 }
20                 byte[] output = Convert.FromBase64String(tmpContent);
21                 SaveFileDialog dialog = new SaveFileDialog();
22                 dialog.FileName = fileName+".xls";
23                 dialog.Filter = "(Excel文件)|*.xls";
24                 DialogResult result = dialog.ShowDialog();
25                 if (result == DialogResult.OK)
26                 {
27                     using (FileStream fs = new FileStream(dialog.FileName, FileMode.Create, FileAccess.Write))
28                     {
29                         fs.Write(output, 0, output.Length);
30                         fs.Flush();
31                     }
32                     return true;
33                 }
34             }
35             return false;
36         }

 

使得該功能能夠正常實現。如果你有更好的實現方式,歡迎一起交流!!

 

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM