前端網頁利用HighCharts.js畫圖表的強大,我就不再贅述。
反而今天要提到的是他的弱點:「圖表檔名匯出中文..會變亂碼」。
HighCharts的預設匯出功能在圖表右上角,如下圖↓

圖表的預設檔名都是chart,由於是英文所以匯出都ok。
但若將檔名自定義為中文的話,匯出會變成下圖中的亂碼,於是就多了一個任務要解了。
查了官網中這篇文章有提到,官方並無支援各國語言包或套件,而在匯出時是使用exporting.js裡將圖表以svg的方式POST到官方指定的接口。
想要支援各國語言,就得自行準備一個POST接口,裡面使用UTF-8編碼後response吐出圖表才可以實現匯出中文檔名。
exporting.js其中有一段是:
//url:"http://export.highcharts.com/" //改替換呼叫自己準備的接口url url:"/HighChartsExtend/HighCharts"
在這裡我是用ASP.NET MVC4開發環境,所以範例就新建一個Controller,準備來寫Exporting的接口。
public class HighChartsExtendController : Controller
{
//若要使用此自訂義HighCharts匯出圖檔,在exporting.js中要置換url:"http://export.highcharts.com/"/*"/HighChartsExtend/HighCharts"*/
[ValidateInput(false)]
public ActionResult Highcharts(string fileName, string type, int width, string svg, string scale)
{
if (Request.Unvalidated.Form["type"] != null && Request.Unvalidated.Form["svg"] != null && Request.Unvalidated.Form["filename"] != null)
{
string tType = Request.Unvalidated.Form["type"].ToString();
string tSvg = Request.Unvalidated.Form["svg"].ToString();
string tFileName = Request.Unvalidated.Form["filename"].ToString();
int tScale = int.Parse(Request.Unvalidated.Form["scale"].ToString());
if (tFileName == "")
{
tFileName = "chart";
}
MemoryStream tData = new MemoryStream(Encoding.UTF8.GetBytes(tSvg));
MemoryStream tStream = new MemoryStream();
string tTmp = new Random().Next().ToString();
string tExt = "";
string tTypeString = "";
switch (tType)
{
case "image/png":
tTypeString = "-m image/png";
tExt = "png";
break;
case "image/jpeg":
tTypeString = "-m image/jpeg";
tExt = "jpg";
break;
case "application/pdf":
tTypeString = "-m application/pdf";
tExt = "pdf";
break;
case "image/svg+xml":
tTypeString = "-m image/svg+xml";
tExt = "svg";
break;
}
if (tTypeString != "")
{
string tWidth = Request.Unvalidated.Form["width"].ToString();
Svg.SvgDocument tSvgObj = SvgDocument.Open(tData);
tSvgObj.Transforms.Add(new Svg.Transforms.SvgScale(tScale, tScale));
tSvgObj.Width *= tScale;
tSvgObj.Height *= tScale;
switch (tExt)
{
case "jpg":
tSvgObj.Draw().Save(tStream, ImageFormat.Jpeg);
break;
case "png":
tSvgObj.Draw().Save(tStream, ImageFormat.Png);
break;
case "pdf":
PdfWriter tWriter = null;
Document tDocumentPdf = null;
try
{
tSvgObj.Draw().Save(tStream, ImageFormat.Png);
tDocumentPdf = new Document(new Rectangle((float)tSvgObj.Width, (float)tSvgObj.Height));
tDocumentPdf.SetMargins(0.0f, 0.0f, 0.0f, 0.0f);
iTextSharp.text.Image tGraph = iTextSharp.text.Image.GetInstance(tStream.ToArray());
tGraph.ScaleToFit((float)tSvgObj.Width, (float)tSvgObj.Height);
tStream = new MemoryStream();
tWriter = PdfWriter.GetInstance(tDocumentPdf, tStream);
tDocumentPdf.Open();
tDocumentPdf.NewPage();
tDocumentPdf.Add(tGraph);
tDocumentPdf.CloseDocument();
}
catch (Exception ex)
{
throw ex;
}
finally
{
tDocumentPdf.Close();
tDocumentPdf.Dispose();
tWriter.Close();
tWriter.Dispose();
tData.Dispose();
tData.Close();
}
break;
case "svg":
tStream = tData;
break;
}
Response.ClearContent();
Response.ClearHeaders();
Response.ContentType = tType;
Response.AppendHeader("Content-Disposition", "attachment; filename=" + tFileName + "." + tExt + "");
Response.BinaryWrite(tStream.ToArray());
Response.End();
}
}
return null;
}
}最後在此Controller必需載入2個額外的dll檔,這在Nuget上都找的到。
以上,就大功告成了!
文章標籤
全站熱搜
留言列表