产品文档 / Excel催化剂
第27波-Excel离线生成词云图
在数据分析领域,词云图已经成为在文本分析中装逼的首选图表,大家热烈地讨论如何在Python上做数据分析、做词云图。 数据分析从来都是Excel的主战场,能够让普通用户使用上的技术才是最有价值的技术,一个人闷骚地写Py代码自嗨个词云图,不是笔者想要的最终效果。 所以把词云图的制作能力下放到Excel普
在数据分析领域,词云图已经成为在文本分析中装逼的首选图表,大家热烈地讨论如何在Python上做数据分析、做词云图。
数据分析从来都是Excel的主战场,能够让普通用户使用上的技术才是最有价值的技术,一个人闷骚地写Py代码自嗨个词云图,不是笔者想要的最终效果。
所以把词云图的制作能力下放到Excel普通用户手里,就是Excel催化剂想做的事情,幸好辛苦找寻,仍然能找到一个不错的轮子,在此向大家分享一下。
具体代码
一样地可从Nuget中获取到这个轮子CloudConvert

同样地,在Excel环境中,一个最大的优势是可以和用户进行交互,用简单窗体,让用户确认数据来源和生成过程中的一些配置信息。

核心代码如下:
private Image GetImageFromSrcWords()
{
int.TryParse(this.txtPicWidth.Text, out var width);
int.TryParse(this.txtPicHeight.Text, out var height);
if (Width == 0 || height == 0)
{
throw new Exception("图片的高度或宽度设置有误,请填写正确的正整数的高度和宽度值");
}
Image maskImage = null;
string[] imgExts = { ".jpg", ".png", ".jpeg" };
string maskPath = txtMaskPath.Text;
if (File.Exists(maskPath) && imgExts.Contains(Path.GetExtension(maskPath).ToLower()))
{
maskImage = Image.FromFile(maskPath);
if (Path.GetExtension(maskPath).ToLower() == ".png")
{
var bitmap = new Bitmap(maskImage.Width, maskImage.Height);
bitmap.SetResolution(maskImage.HorizontalResolution, maskImage.VerticalResolution);
var g = Graphics.FromImage(bitmap);
g.Clear(Color.White);
g.DrawImageUnscaled(maskImage, 0, 0);
maskImage = bitmap;
}
}
//maskImage.Save(@"F:\mask.jpg");
var wc = new WordCloud(width: width, height: height, mask: maskImage, allowVerical: true, fontname: this.cmbFonts.SelectedItem.ToString());
Dictionary<string, int> wordInfos = GetWordInfos();
return wc.Draw(wordInfos.Keys.ToList(), wordInfos.Values.ToList());
}
这个轮子可以有背景图功能maskImage,但这个图片貌似只能是一些纯黑的图标文件,其他文件识别不出来,但不是十分装逼找个乔布斯人像时,也够用,在图标库网站上下载一些纯黑的图标文件即可使用
同样地, 这个轮子貌似对于词的数量太少时,会出错,生成失真,明明频次高的字也不见得显示大,所以要告诉用户,词云图真的要在真实环境,处理大量文字的词频识别时才有效,几个词也没必要用词频图,直接条形图即可。
结语
在.Net的世界,资源也不比Python、Java这些少多少,对于普通开发者来说,没必要非要追那些看不起来多么热门的东西,在微软系里面,也有享受不尽的资源,如OFFICE,这个可以其他语言羡慕得很的一个大轮子。用好OFFICE现有功能+补充部分外界的热门资源,普通开发者也可以玩出新花样。