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

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

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

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

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

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

展开阅读全文

页面更新:2024-03-11

标签:条形码   催化剂   离线   白底   结语   二维码   大神   开路   轮子   初始化   报表   代码   简单   格式   环境   数码   图片

1 2 3 4 5

上滑加载更多 ↓
推荐阅读:
友情链接:
更多:

本站资料均由网友自行发布提供,仅用于学习交流。如有版权问题,请与我联系,QQ:4156828  

© CopyRight 2020-2024 All Rights Reserved. Powered By 71396.com 闽ICP备11008920号-4
闽公网安备35020302034903号

Top