前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Excel催化剂开源第26波-Excel离线生成二维码条形码

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

作者头像
Excel催化剂
发布2021-08-19 15:04:48
4580
发布2021-08-19 15:04:48
举报
文章被收录于专栏:Excel催化剂

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

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

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

Nuget上的ZXing

代码实现

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

条形码方面
代码语言:javascript
复制
        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图表两种方式。

代码语言:javascript
复制
 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开发过程中,会找轮子才是真道理,一个二维码、条形码功能,简单几句代码就可实现,并且这简单几句的代码,在网络上都可以随处查阅到,无需自己动手。

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2019-01-13,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 Excel催化剂 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 代码实现
    • 条形码方面
      • 二维码方面
      • 结语
      相关产品与服务
      腾讯云 BI
      腾讯云 BI(Business Intelligence,BI)提供从数据源接入、数据建模到数据可视化分析全流程的BI能力,帮助经营者快速获取决策数据依据。系统采用敏捷自助式设计,使用者仅需通过简单拖拽即可完成原本复杂的报表开发过程,并支持报表的分享、推送等企业协作场景。
      领券
      问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档