在中国特有环境下,二维码、条形码的使用场景非常广泛,因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开发过程中,会找轮子才是真道理,一个二维码、条形码功能,简单几句代码就可实现,并且这简单几句的代码,在网络上都可以随处查阅到,无需自己动手。