在中国特有环境下,二维码、条形码的使用场景非常广泛,因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(); Dictionaryhints = 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
本站资料均由网友自行发布提供,仅用于学习交流。如有版权问题,请与我联系,QQ:4156828
© CopyRight 2020-2024 All Rights Reserved. Powered By 71396.com 闽ICP备11008920号-4
闽公网安备35020302034903号