Excel催化剂开源系列

Excel催化剂开源第26波-Excel离线生成二维码条形码

2019-01-12  本文已影响48人  1d0e4a6e400e

在中国特有环境下,二维码、条形码的使用场景非常广泛,因Excel本身就是一个非常不错的报表生成环境,若Excel上能够直接生成二维码、条形码,且是批量化操作的,直接一条龙从数据到报表都由Excel完成,是一个非常不错的解决方案。

既然是热到沸腾的应用,当然少不了有大神们开路开发现成轮子供普通开发者使用。二维码、条形码在.Net环境下,有好一些轮子,此篇简单介绍下Excel催化剂所使用的轮子。

轮子使用的是Zxing.Net,可从Nuget上轻松获得


Nuget上的ZXing

代码实现

排除其他用户交互的代码,核心的代码仅几句即可完成。

条形码方面

        private static Image GetImageBarCodeFromRangeValue(string srcRangeValue)
        {
            //设置条形码规格  
            EncodingOptions encodeOption = new EncodingOptions();
            //设置宽和高  
            encodeOption.Height = int.Parse(Properties.Settings.Default.BarCodeHeight);
            encodeOption.Width = int.Parse(Properties.Settings.Default.BarCodeWidth);
            encodeOption.PureBarcode = !Properties.Settings.Default.BarCodeIsnotPureCode;
            BarcodeWriter wr = new BarcodeWriter();
            wr.Options = encodeOption;
            //条形码:根据自己的需要选择条形码格式  
            wr.Format = (BarcodeFormat)Enum.Parse(typeof(BarcodeFormat), Properties.Settings.Default.BarcodeFormat);
            //生成条形码  
            return wr.Write(srcRangeValue.Trim());

        }

二维码方面

分是否要中间插入Logo图表两种方式。

 private static Image GetImageQrCodeFromRangeValueWithoutLogo(string srcRangeValue)
        {
            //初始化  
            BarcodeWriter writer = new BarcodeWriter();
            writer.Format = BarcodeFormat.QR_CODE;
            QrCodeEncodingOptions options = new QrCodeEncodingOptions();
            //禁用ECI  
            options.DisableECI = true;
            //内容编码格式  
            options.CharacterSet = "UTF-8";
            //二维码的宽高  
            int qrSize = int.Parse(Properties.Settings.Default.QrCodeSize);
            options.Width = qrSize;
            options.Height = qrSize;
            //二维码边距  
            options.Margin = int.Parse(Properties.Settings.Default.QrCodeMargin);
            writer.Options = options;
            //导出图片  
            return writer.Write(srcRangeValue);

        }


        private static Image GetImageQrCodeFromRangeValueWithLogo(string srcRangeValue)
        {
            string logoPath = Properties.Settings.Default.QrCodeLogoPath;
            Image logo = Image.FromFile(logoPath);
            //初始化  
            MultiFormatWriter writer = new MultiFormatWriter();

            Dictionary<EncodeHintType, object> hints = new Dictionary<EncodeHintType, object>();
            hints.Add(EncodeHintType.CHARACTER_SET, "UTF-8");
            hints.Add(EncodeHintType.ERROR_CORRECTION, GetErrorCorrectionLevel(Properties.Settings.Default.QrErrorCorrectionLevel));//(ErrorCorrectionLevel)Enum.Parse(typeof(ErrorCorrectionLevel), 
            hints.Add(EncodeHintType.MARGIN, int.Parse(Properties.Settings.Default.QrCodeMargin));
            //生成二维码   
            int qrSize = int.Parse(Properties.Settings.Default.QrCodeSize);
            BitMatrix bm = writer.encode(srcRangeValue, BarcodeFormat.QR_CODE, qrSize, qrSize, hints);
            BarcodeWriter barcodeWriter = new BarcodeWriter();
            Bitmap map = barcodeWriter.Write(bm);
            //计算尺寸  
            int[] rectangle = bm.getEnclosingRectangle();

            //计算插入Logo的大小位置  
            int middleW = Math.Min((int)(rectangle[2] / 3.5), logo.Width);
            int middleH = Math.Min((int)(rectangle[3] / 3.5), logo.Height);
            int middleL = (map.Width - middleW) / 2;
            int middleT = (map.Height - middleH) / 2;

            //将img转换成bmp格式,否则后面无法创建Graphics对象  
            Bitmap bmpimg = new Bitmap(map.Width, map.Height, PixelFormat.Format32bppArgb);
            using (Graphics g = Graphics.FromImage(bmpimg))
            {
                g.InterpolationMode = System.Drawing.Drawing2D.InterpolationMode.HighQualityBicubic;
                g.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.HighQuality;
                g.CompositingQuality = System.Drawing.Drawing2D.CompositingQuality.HighQuality;
                g.DrawImage(map, 0, 0);
            }
            //将二维码插入图片  
            Graphics myGraphic = Graphics.FromImage(bmpimg);
            //白底  
            myGraphic.FillRectangle(Brushes.White, middleL, middleT, middleW, middleH);
            myGraphic.DrawImage(logo, middleL, middleT, middleW, middleH);

            //保存成图片  
            return bmpimg;
        }

结语

在VSTO开发过程中,会找轮子才是真道理,一个二维码、条形码功能,简单几句代码就可实现,并且这简单几句的代码,在网络上都可以随处查阅到,无需自己动手。

技术交流QQ群

QQ群名:Excel催化剂开源讨论群, QQ群号:788145319


Excel催化剂开源讨论群二维码

关于Excel催化剂

Excel催化剂先是一微信公众号的名称,后来顺其名称,正式推出了Excel插件,插件将持续性地更新,更新的周期视本人的时间而定争取一周能够上线一个大功能模块。Excel催化剂插件承诺个人用户永久性免费使用!

Excel催化剂插件使用最新的布署技术,实现一次安装,日后所有更新自动更新完成,无需重复关注更新动态,手动下载安装包重新安装,只需一次安装即可随时保持最新版本!

Excel催化剂插件下载链接:https://pan.baidu.com/s/1Iz2_NZJ8v7C9eqhNjdnP3Q

联系作者 公众号

取名催化剂,因Excel本身的强大,并非所有人能够立马享受到,大部分人还是在被Excel软件所虐的阶段,就是头脑里很清晰想达到的效果,而且高手们也已经实现出来,就是自己怎么弄都弄不出来,或者更糟的是还不知道Excel能够做什么而停留在不断地重复、机械、手工地在做着数据,耗费着无数的青春年华岁月。所以催生了是否可以作为一种媒介,让广大的Excel用户们可以瞬间点燃Excel的爆点,无需苦苦地挣扎地没日没夜的技巧学习、高级复杂函数的烧脑,最终走向了从入门到放弃的道路。

最后Excel功能强大,其实还需树立一个观点,不是所有事情都要交给Excel去完成,也不是所有事情Excel都是十分胜任的,外面的世界仍然是一个广阔的世界,Excel只是其中一枚耀眼的明星,还有其他更多同样精彩强大的技术、工具等。*Excel催化剂也将借力这些其他技术,让Excel能够发挥更强大的爆发!

关于Excel催化剂作者

姓名:李伟坚,从事数据分析工作多年(BI方向),一名同样在路上的学习者。
服务过行业:零售特别是鞋服类的零售行业,电商(淘宝、天猫、京东、唯品会)

技术路线从一名普通用户,通过Excel软件的学习,从此走向数据世界,非科班IT专业人士。
历经重重难关,终于在数据的道路上达到技术平原期,学习众多的知识不再太吃力,同时也形成了自己的一套数据解决方案(数据采集、数据加工清洗、数据多维建模、数据报表展示等)。

擅长技术领域:Excel等Office家族软件、VBA&VSTO的二次开发、Sqlserver数据库技术、Sqlserver的商业智能BI技术、Powerbi技术、云服务器布署技术等等。

2018年开始职业生涯作了重大调整,从原来的正职工作,转为自由职业者,暂无固定收入,暂对前面道路不太明朗,苦重新回到正职工作,对Excel催化剂的运营和开发必定受到很大的影响(正职工作时间内不可能维护也不可能随便把工作时间内的成果公布于外,工作外的时间也十分有限,因已而立之年,家庭责任重大)。

和广大拥护者一同期盼:Excel催化剂一直能运行下去,我所惠及的群体们能够给予支持(多留言鼓励下、转发下朋友圈推荐、小额打赏下和最重点的可以和所在公司及同行推荐推荐,让我的技术可以在贵司发挥价值,实现双赢(初步设想可以数据顾问的方式或一些小型项目开发的方式合作)。

技术交流QQ群

QQ群名:Excel催化剂开源讨论群, QQ群号:788145319


Excel催化剂开源讨论群二维码

关于Excel催化剂

Excel催化剂先是一微信公众号的名称,后来顺其名称,正式推出了Excel插件,插件将持续性地更新,更新的周期视本人的时间而定争取一周能够上线一个大功能模块。Excel催化剂插件承诺个人用户永久性免费使用!

Excel催化剂插件使用最新的布署技术,实现一次安装,日后所有更新自动更新完成,无需重复关注更新动态,手动下载安装包重新安装,只需一次安装即可随时保持最新版本!

Excel催化剂插件下载链接:https://pan.baidu.com/s/1Iz2_NZJ8v7C9eqhNjdnP3Q

联系作者 公众号

取名催化剂,因Excel本身的强大,并非所有人能够立马享受到,大部分人还是在被Excel软件所虐的阶段,就是头脑里很清晰想达到的效果,而且高手们也已经实现出来,就是自己怎么弄都弄不出来,或者更糟的是还不知道Excel能够做什么而停留在不断地重复、机械、手工地在做着数据,耗费着无数的青春年华岁月。所以催生了是否可以作为一种媒介,让广大的Excel用户们可以瞬间点燃Excel的爆点,无需苦苦地挣扎地没日没夜的技巧学习、高级复杂函数的烧脑,最终走向了从入门到放弃的道路。

最后Excel功能强大,其实还需树立一个观点,不是所有事情都要交给Excel去完成,也不是所有事情Excel都是十分胜任的,外面的世界仍然是一个广阔的世界,Excel只是其中一枚耀眼的明星,还有其他更多同样精彩强大的技术、工具等。*Excel催化剂也将借力这些其他技术,让Excel能够发挥更强大的爆发!

关于Excel催化剂作者

姓名:李伟坚,从事数据分析工作多年(BI方向),一名同样在路上的学习者。
服务过行业:零售特别是鞋服类的零售行业,电商(淘宝、天猫、京东、唯品会)

技术路线从一名普通用户,通过Excel软件的学习,从此走向数据世界,非科班IT专业人士。
历经重重难关,终于在数据的道路上达到技术平原期,学习众多的知识不再太吃力,同时也形成了自己的一套数据解决方案(数据采集、数据加工清洗、数据多维建模、数据报表展示等)。

擅长技术领域:Excel等Office家族软件、VBA&VSTO的二次开发、Sqlserver数据库技术、Sqlserver的商业智能BI技术、Powerbi技术、云服务器布署技术等等。

2018年开始职业生涯作了重大调整,从原来的正职工作,转为自由职业者,暂无固定收入,暂对前面道路不太明朗,苦重新回到正职工作,对Excel催化剂的运营和开发必定受到很大的影响(正职工作时间内不可能维护也不可能随便把工作时间内的成果公布于外,工作外的时间也十分有限,因已而立之年,家庭责任重大)。

和广大拥护者一同期盼:Excel催化剂一直能运行下去,我所惠及的群体们能够给予支持(多留言鼓励下、转发下朋友圈推荐、小额打赏下和最重点的可以和所在公司及同行推荐推荐,让我的技术可以在贵司发挥价值,实现双赢(初步设想可以数据顾问的方式或一些小型项目开发的方式合作)。

上一篇下一篇

猜你喜欢

热点阅读