.Net 使用HighCharts 導入圖片到Excel

来源:https://www.cnblogs.com/Richet/archive/2018/07/26/9371295.html
-Advertisement-
Play Games

優化HighCharts 利用svg導出圖片到Excel,圖片模糊問題 ...


需求:數據統計報表使用到HighCharts顯示各種圖形:柱狀圖,餅圖,點陣圖等等,需要將數據表以及對應的圖像導入到Excel中,方便列印。

解決方法: Excel導出採用NPOI,HighChart圖像利用svg將圖片寫入到Excel中。

遇到的問題:圖片模糊,圖片清晰度與web頁面相比差距很大。

導出Excel顯示圖片        web顯示圖片

  明顯可以看出,差別很大,無法達到要求, 實現此所採用的代碼:
 1 var doc = new SvgDocument();
 2             XmlDocument xml = new XmlDocument();
 3             xml.LoadXml(this.chart_Hidden.Value);
 4             doc = SvgDocument.Open(xml);
 5             Bitmap mapImage = doc.Draw();
 6             byte[] buffer = NPOIExportExcelHelp.BitmapToBytes(mapImage);
 7             int pictureIdx = workBook.AddPicture(buffer, PictureType.JPEG);
 8             HSSFPatriarch patriarch = (HSSFPatriarch)sheet.CreateDrawingPatriarch();
 9             HSSFClientAnchor anchor = new HSSFClientAnchor(0, 0, 0, 0, 7, 0, 7,  15);
10             HSSFPicture pict = (HSSFPicture)patriarch.CreatePicture(anchor, pictureIdx);
11             pict.Resize();
View Code

 優化方案:

1 下載開源的.net導出文件: https://github.com/imclem/Highcharts-export-module-asp.net

   利用此項目中的dll文件:itextsharp.dll,sharpPDF.dll,Svg.dll

2   借鑒文章:https://jucelin.com/highcharts_esport_net.html  中針對於CreateSvgDocument()方法的優化改造,優化圖片的格式,
 1 /// <summary>
 2         /// Creates an SvgDocument from the SVG text string.
 3         /// </summary>
 4         /// <returns>An SvgDocument object.</returns>
 5         private SvgDocument CreateSvgDocument()
 6         {
 7             SvgDocument svgDoc;
 8             XmlDocument xml = new XmlDocument();
 9             xml.LoadXml(this.Svg);
10             XmlNodeList nodeListAllg = xml.GetElementsByTagName("g");
11             Dictionary<int, XmlNode[,]> dic = new Dictionary<int, XmlNode[,]>();
12             int i = 0;
13             foreach (XmlNode xNod in nodeListAllg)
14             {
15                 i++;
16                 XmlNode xmlvisibility = xNod.Attributes.GetNamedItem("class");
17                 if (xmlvisibility != null && xmlvisibility.Value == "highcharts-series-group")
18                 {
19                     foreach (XmlNode xNod2 in xNod.ChildNodes)
20                     {
21                         i++;
22                         XmlNode xmlvisibility1 = xNod2.Attributes.GetNamedItem("visibility");
23                         if (xmlvisibility1 != null && xmlvisibility1.Value == "hidden")
24                         {
25                             XmlNode[,] xmln = new XmlNode[1, 2];
26                             xmln[0, 0] = xNod;
27                             xmln[0, 1] = xNod2;
28                             dic.Add(i, xmln);
29                         }
30                     }
31                 }
32                 else if (xmlvisibility != null && xmlvisibility.Value == "highcharts-tooltip")
33                 {
34                     XmlNode[,] xmln = new XmlNode[1, 2];
35                     xmln[0, 0] = xml.FirstChild;
36                     xmln[0, 1] = xNod;
37                     dic.Add(i, xmln);
38                 }
39             }
40             foreach (KeyValuePair<int, XmlNode[,]> a in dic)
41             {
42                 a.Value[0, 0].RemoveChild(a.Value[0, 1]);
43             }
44             this.Svg = xml.OuterXml;
45             // Create a MemoryStream from SVG string.
46             using (MemoryStream streamSvg = new MemoryStream(
47               Encoding.UTF8.GetBytes(this.Svg)))
48             {
49                 // Create and return SvgDocument from stream.
50                 svgDoc = SvgDocument.Open(streamSvg);
51             }
52             // Scale SVG document to requested width.
53             svgDoc.Transforms = new SvgTransformCollection();
54             float scalar = (float)this.Width / (float)svgDoc.Width;
55             svgDoc.Transforms.Add(new SvgScale(scalar, scalar));
56             svgDoc.Width = new SvgUnit(svgDoc.Width.Type, svgDoc.Width * scalar);
57             svgDoc.Height = new SvgUnit(svgDoc.Height.Type, svgDoc.Height * scalar);
58             return svgDoc;
59         }
View Code   3 利用第二步的方法,基本可以滿足要求,生成的Exce圖片效果如下 4 將以上方法整理封裝成類庫
  1 public class HightChartExport
  2     {
  3         /// <summary>
  4         /// 獲取svg圖片buffer,用於excel
  5         /// </summary>
  6         /// <param name="svgHtml"></param>
  7         /// <param name="width"></param>
  8         /// <param name="height"></param>
  9         /// <returns></returns>
 10         public static byte[] GetSvgDocumentByte(string svgHtml, int width, int height)
 11         {
 12             try
 13             {
 14                 if (string.IsNullOrEmpty(svgHtml))
 15                 {
 16                     return new byte[0];
 17                 }
 18                 if (width == 0 || height == 0)
 19                 {
 20                     return new byte[0];
 21                 }
 22                 SvgDocument svgDocument = CreateSvgDocument(svgHtml, width, height);
 23                 return BitmapToBytes(svgDocument.Draw());
 24             }
 25             catch
 26             {
 27                 throw new Exception();
 28             }
 29         }
 30         private static SvgDocument CreateSvgDocument(string svgHtml, int width, int height)
 31         {
 32             SvgDocument svgDoc;
 33             XmlDocument xml = new XmlDocument();
 34             xml.LoadXml(svgHtml);
 35             XmlNodeList nodeListAllg = xml.GetElementsByTagName("g");
 36             Dictionary<int, XmlNode[,]> dic = new Dictionary<int, XmlNode[,]>();
 37             int i = 0;
 38             foreach (XmlNode xNod in nodeListAllg)
 39             {
 40                 i++;
 41                 XmlNode xmlvisibility = xNod.Attributes.GetNamedItem("class");
 42                 if (xmlvisibility != null && xmlvisibility.Value == "highcharts-series-group")
 43                 {
 44                     foreach (XmlNode xNod2 in xNod.ChildNodes)
 45                     {
 46                         i++;
 47                         XmlNode xmlvisibility1 = xNod2.Attributes.GetNamedItem("visibility");
 48                         if (xmlvisibility1 != null && xmlvisibility1.Value == "hidden")
 49                         {
 50                             XmlNode[,] xmln = new XmlNode[1, 2];
 51                             xmln[0, 0] = xNod;
 52                             xmln[0, 1] = xNod2;
 53                             dic.Add(i, xmln);
 54                         }
 55                     }
 56                 }
 57                 else if (xmlvisibility != null && xmlvisibility.Value == "highcharts-tooltip")
 58                 {
 59                     XmlNode[,] xmln = new XmlNode[1, 2];
 60                     xmln[0, 0] = xml.FirstChild;
 61                     xmln[0, 1] = xNod;
 62                     dic.Add(i, xmln);
 63                 }
 64             }
 65             foreach (KeyValuePair<int, XmlNode[,]> a in dic)
 66             {
 67                 a.Value[0, 0].RemoveChild(a.Value[0, 1]);
 68             }
 69             svgHtml = xml.OuterXml;
 70             // Create a MemoryStream from SVG string.
 71             using (MemoryStream streamSvg = new MemoryStream(
 72               Encoding.UTF8.GetBytes(svgHtml)))
 73             {
 74                 // Create and return SvgDocument from stream.
 75                 svgDoc = SvgDocument.Open<SvgDocument>(streamSvg);
 76             }
 77             // Scale SVG document to requested width.
 78             svgDoc.Transforms = new SvgTransformCollection();
 79             float scalar = (float)width / (float)svgDoc.Width;
 80             svgDoc.Transforms.Add(new SvgScale(scalar, scalar));
 81             svgDoc.Width = new SvgUnit(svgDoc.Width.Type, svgDoc.Width * scalar);
 82             svgDoc.Height = new SvgUnit(svgDoc.Height.Type, svgDoc.Height * scalar);
 83             return svgDoc;
 84         }
 85         /// <summary>
 86         /// 讀取圖片
 87         /// </summary>
 88         /// <param name="Bitmap"></param>
 89         /// <returns></returns>
 90         private static byte[] BitmapToBytes(Bitmap Bitmap)
 91         {
 92             MemoryStream ms = null;
 93             try
 94             {
 95                 ms = new MemoryStream();
 96                 Bitmap.Save(ms, ImageFormat.Png);
 97                 byte[] byteImage = new Byte[ms.Length];
 98                 byteImage = ms.ToArray();
 99                 return byteImage;
100             }
101             catch (ArgumentNullException ex)
102             {
103                 throw ex;
104             }
105             finally
106             {
107                 ms.Close();
108             }
109         }
110     }
View Code

5 調用方法如下:

1 byte[] buffer = HightChartExport.GetSvgDocumentByte(this.chart_Pie.Value, Convert.ToInt32(chart_width.Value), Convert.ToInt32(chart_height.Value));
2  int pictureIdx = workBook.AddPicture(buffer, PictureType.PNG);
3  HSSFPatriarch patriarch = (HSSFPatriarch)sheet.CreateDrawingPatriarch();
4  HSSFClientAnchor anchor = new HSSFClientAnchor(0, 0, 0, 0, 0, rowIndex + 1, 0, 15);
5  HSSFPicture pict = (HSSFPicture)patriarch.CreatePicture(anchor, pictureIdx);
6   pict.Resize();
View Code

參考文章

https://github.com/imclem/Highcharts-export-module-asp.net

https://jucelin.com/highcharts_esport_net.html 

 
您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 之前的文章記述了 "從ASP.NET Core Module到KestrelServer" 的請求處理過程。現在該聊聊如何生成ASP.NET中我們所熟悉的HttpContext。 當KestrelServer啟動時,會綁定相應的IP地址,同時在綁定時將加入HttpConnectionMiddlewa ...
  • 1,2選取目標站點,然後3的高級設置,4啟用32位的應用程式的屬性變為true就可以了。當然,網路上還有其他的版本,你也可以嘗試下。 原文地址:http://weblogs.asp.net/kencox/archive/2010/05/20/asp-net-iis-fix-the-microsoft ...
  • 我想也許要寫些東西,記錄我做程式員的日子吧 要講到C#源碼的執行過程 首先要提下程式集,因為Clr並不是和托管摸塊打交道的,而是和程式集(dll,exe) 1、從哪裡來 程式集是由一個或者多個托管模塊以及 資源文件等共同組成的,C#編譯器(csc.exe)再把源碼編程成IL代碼和元數據的時候,會進一 ...
  • 大家好,今天又想到需要寫一下博客了,畢竟感覺應該在新人入公司的時候可能需要將你電腦上的開發環境進行修改。 下麵講的主要是將VS2012卸載後,重新安裝VS2010,。 我遇到了這種情況:在我將VS2012卸載完後。發現在網上下載VS2010的安裝包下載完成後,進行安裝,發現在安裝完成之後,自己沒有的 ...
  • 從入職到準備離開兩年多了,兩年的時間不長也不斷,各種原因,決定離開了。 挺捨不得這群小伙伴,帶了一個項目組兩年了,不得不走了,感情的牌就不打了。 記得從入職時,公司研發的源碼管理工具使用的SVN,其實SVN也是非常不錯的中心式源碼管理工具,不過一個項目的解決方案,達到了2G到30G,個人感覺比較混亂 ...
  • 控制器代碼: public string ValidateCarID(string carid) { string result; Car car = db.Car.Find(carid); if(car==null) { result = "false"; //沒有找到 } else { resu ...
  • 客戶機上基於Oracle 9i的ODBC數據源,無法連接oracle 11G資料庫,提示錯誤為:error ORA-01017, Invalid Username / Password。奇怪的是:sqlplus能連接成功;且基於Oracle 10G的ODBC數據源也能連接成功。 解決方法:以DBA進 ...
  • unity中播放視頻步驟如下: 1.將要播放的視頻拖入projec。(註意:unity一般支持的視頻格式有mov, .mpg, .mpeg, .mp4,.avi, .asf格式 ) 2.在場景中添加RawImage。(因為Image使用sprite渲染,rawImage是用texture渲染) 3. ...
一周排行
    -Advertisement-
    Play Games
  • 示例項目結構 在 Visual Studio 中創建一個 WinForms 應用程式後,項目結構如下所示: MyWinFormsApp/ │ ├───Properties/ │ └───Settings.settings │ ├───bin/ │ ├───Debug/ │ └───Release/ ...
  • [STAThread] 特性用於需要與 COM 組件交互的應用程式,尤其是依賴單線程模型(如 Windows Forms 應用程式)的組件。在 STA 模式下,線程擁有自己的消息迴圈,這對於處理用戶界面和某些 COM 組件是必要的。 [STAThread] static void Main(stri ...
  • 在WinForm中使用全局異常捕獲處理 在WinForm應用程式中,全局異常捕獲是確保程式穩定性的關鍵。通過在Program類的Main方法中設置全局異常處理,可以有效地捕獲並處理未預見的異常,從而避免程式崩潰。 註冊全局異常事件 [STAThread] static void Main() { / ...
  • 前言 給大家推薦一款開源的 Winform 控制項庫,可以幫助我們開發更加美觀、漂亮的 WinForm 界面。 項目介紹 SunnyUI.NET 是一個基於 .NET Framework 4.0+、.NET 6、.NET 7 和 .NET 8 的 WinForm 開源控制項庫,同時也提供了工具類庫、擴展 ...
  • 說明 該文章是屬於OverallAuth2.0系列文章,每周更新一篇該系列文章(從0到1完成系統開發)。 該系統文章,我會儘量說的非常詳細,做到不管新手、老手都能看懂。 說明:OverallAuth2.0 是一個簡單、易懂、功能強大的許可權+可視化流程管理系統。 有興趣的朋友,請關註我吧(*^▽^*) ...
  • 一、下載安裝 1.下載git 必須先下載並安裝git,再TortoiseGit下載安裝 git安裝參考教程:https://blog.csdn.net/mukes/article/details/115693833 2.TortoiseGit下載與安裝 TortoiseGit,Git客戶端,32/6 ...
  • 前言 在項目開發過程中,理解數據結構和演算法如同掌握蓋房子的秘訣。演算法不僅能幫助我們編寫高效、優質的代碼,還能解決項目中遇到的各種難題。 給大家推薦一個支持C#的開源免費、新手友好的數據結構與演算法入門教程:Hello演算法。 項目介紹 《Hello Algo》是一本開源免費、新手友好的數據結構與演算法入門 ...
  • 1.生成單個Proto.bat內容 @rem Copyright 2016, Google Inc. @rem All rights reserved. @rem @rem Redistribution and use in source and binary forms, with or with ...
  • 一:背景 1. 講故事 前段時間有位朋友找到我,說他的窗體程式在客戶這邊出現了卡死,讓我幫忙看下怎麼回事?dump也生成了,既然有dump了那就上 windbg 分析吧。 二:WinDbg 分析 1. 為什麼會卡死 窗體程式的卡死,入口門檻很低,後續往下分析就不一定了,不管怎麼說先用 !clrsta ...
  • 前言 人工智慧時代,人臉識別技術已成為安全驗證、身份識別和用戶交互的關鍵工具。 給大家推薦一款.NET 開源提供了強大的人臉識別 API,工具不僅易於集成,還具備高效處理能力。 本文將介紹一款如何利用這些API,為我們的項目添加智能識別的亮點。 項目介紹 GitHub 上擁有 1.2k 星標的 C# ...