做winform项目开发的,DevExpress控件应该都很熟悉,它其中的Grid控件最为常用,展示网格数据很不错。既可以分组、还能过滤、合计等。那么如何把Grid展示的数据,转成图片呢?比如下面这张图
查了下Grid提供的方法,能导出很多种格式,包括txt、csv、html、mht、word文档s、excel文档等,确实没包含image文档。这篇博客就告诉你如何实现?
方法1:gdi画
这个方法最原始也最万能,但也最复杂,要求也最高。没有图形学方面的基础,想要搞定是有些难度的。不推荐使用
方法2:转成office文档
office文档有很多方法可以转成图片,比如ffmpeg
方法3:转成html文档
其实转成网页文件是最简单的,转成html文件后,直接用浏览器打开。比较主流的像QQ浏览器、360浏览器,都提供了将网页转为图片的功能。用上面这个方法,能解决大部分的转图片功能,但也有些复杂的,效果就不好。比如我上面发的第1张图,单元格的背景色不一样。
所以这时候就要用代码实现了。先转成html文件,直接修改它的样式源代码,达到自己满意为止,最后再用浏览器打开,转成图片即可。
html文件转图片,也是可以用代码实现的,代码如下所示。用代码实现,好处就是可以在程序里一步到位的实现这个功能
总结下,就是先转成html文件,样式不满意就修改,最后再将html文件转为图片即可。附html文件转图片的源码
/// <summary> /// 网页地址转为图片服务类 /// </summary> class WebPageToImageService { //调用示例 //string urlPath = "http://www.cnblogs.com/xiyang1011/"; //string filePath = @"C:\Test.jpeg"; //WebPageToImageUtil imageUtil = new WebPageToImageUtil(urlPath, filePath); //Bitmap imageWebPage = imageUtil.Generate(); private Bitmap m_Bitmap; private string m_Url; private string m_FileName = string.Empty; public WebPageToImageService(string url) { // Without file m_Url = url; } public WebPageToImageService(string url, string fileName) { // With file m_Url = url; m_FileName = fileName; } private void _Generate() { var browser = new WebBrowser { ScrollBarsEnabled = false }; browser.Navigate(m_Url); browser.DocumentCompleted += WebBrowser_DocumentCompleted; while (browser.ReadyState != WebBrowserReadyState.Complete) { Application.DoEvents(); } browser.Dispose(); } private void WebBrowser_DocumentCompleted(object sender, WebBrowserDocumentCompletedEventArgs e) { // Capture var browser = (WebBrowser)sender; browser.ClientSize = new Size(browser.Document.Body.ScrollRectangle.Width, browser.Document.Body.ScrollRectangle.Bottom); browser.ScrollBarsEnabled = false; m_Bitmap = new Bitmap(browser.Document.Body.ScrollRectangle.Width, browser.Document.Body.ScrollRectangle.Bottom); browser.BringToFront(); browser.DrawToBitmap(m_Bitmap, browser.Bounds); // Save as file? if (m_FileName.Length > 0) { // Save m_Bitmap.SaveJPG100(m_FileName); } } public Bitmap Generate() { // Thread var m_thread = new Thread(_Generate); m_thread.SetApartmentState(ApartmentState.STA); m_thread.Start(); m_thread.Join(); return m_Bitmap; } }
相关阅读
文章评论