返回Excel催化剂目录

产品文档 / 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现有功能+补充部分外界的热门资源,普通开发者也可以玩出新花样。