做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;
}
}
相关阅读




文章评论