C#实现批量生成二维码

相信大家都使用过草料二维码生成器,单独生成二维码可以,但是批量生成二维码就需要收费了。既然要收费,那就自己写一个。

接口采用导入Excel文件生成二维码,首先需要读取Excel的数据,方法如下所示:

/// <summary>
/// 读取数据
/// </summary>
/// <returns>Workbook</returns>
public static DataTable GetExcel(string Path, ref string exceptionMsg)
{//定义datatableDataTable dtExcel = new DataTable();//思路://1、获取读取的文件;2、把文件转换为二进制数组;3、二进制数组转成内存流;4、利用NPOI把内存流中的数据读取成ExcelFileStream fs = new FileStream(Path, FileMode.Open, FileAccess.Read);//声明二进制数组存放文件byte[] fileBytes = new byte[fs.Length];//将传入的文件转化为二进制的数组存入fileBytesfs.Read(fileBytes, 0, (int)fs.Length);//将二进制的数组转化为内存流MemoryStream excelFileStream = new MemoryStream(fileBytes);//将内存流转化为工作簿NPOI.SS.UserModel.IWorkbook workbook = new NPOI.HSSF.UserModel.HSSFWorkbook(excelFileStream);//判断工作簿中是否有工作表if (!(workbook.NumberOfSheets > 0)){exceptionMsg = "工作簿中没有数据表";return dtExcel;}//获取第一个工作表NPOI.SS.UserModel.ISheet sheet = workbook.GetSheetAt(0);//PhysicalNumberOfRows 获取的是物理行数,也就是不包括那些空行(隔行)的情况。//判断工作表中是否有数据if (!(sheet.PhysicalNumberOfRows > 0)){exceptionMsg = "数据表为空";return dtExcel;}//将数据装到DataTable中//获取标题行NPOI.SS.UserModel.IRow rowHeader = sheet.GetRow(0);/*FirstCellNum:获取某行第一个单元格下标LastCellNum:获取某行的列数FirstRowNum:获取第一个实际行的下标LastRowNum:获取最后一个实际行的下标*///获取表格列数int cellCount = rowHeader.LastCellNum;//获取表格行数(最后一行下标+1)int rowCount = sheet.LastRowNum + 1;//创建dataTable中的列,循环添加标题行中各个单元格的数据for (int i = rowHeader.FirstCellNum; i < cellCount; i++){//遍历表头行中每一个单元格,获取标题行各个单元格的数据DataColumn dtColumn = new DataColumn(rowHeader.GetCell(i).StringCellValue);//将获取到的标题行的数据放到dataTable中dtExcel.Columns.Add(dtColumn);}int hang = sheet.FirstRowNum;try{//读取Excel中的数据//(sheet.FirstRowNum) 第一行是标题for (int i = sheet.FirstRowNum + 1; i < rowCount; i++){hang = i;//获取'i'行数据NPOI.SS.UserModel.IRow row = sheet.GetRow(i);//创建DataTable行DataRow dtRow = dtExcel.NewRow();if (row != null){//遍历excel中一行所有的单元格for (int j = row.FirstCellNum; j < cellCount; j++){if (row.GetCell(j) != null){switch (row.GetCell(j).CellType){case CellType.Formula://此处是处理公式数据,获取公式执行后的值HSSFFormulaEvaluator eva = new HSSFFormulaEvaluator(workbook);if (eva.Evaluate(row.GetCell(j)).CellType == CellType.Numeric)dtRow[j] = eva.Evaluate(row.GetCell(j)).NumberValue;elsedtRow[j] = eva.Evaluate(row.GetCell(j)).StringValue;break;default:dtRow[j] = row.GetCell(j).ToString();break;}}}}//新行添加到dataTable中dtExcel.Rows.Add(dtRow);}}catch (Exception){exceptionMsg = "第" + hang + "行数据存在异常";return dtExcel;}return dtExcel;
}

读取到数据后,生成二维码。

public string FileUploadQRCode(){DataTable dt = ExcelFile.GetExcel(Path, ref msg);//Excel文件路径Pathif (msg != ""){//返回失败信息return "{code: 0, msg: \"" + msg + "\"}");}for (int i = 0; i < dt.Rows.Count; i++){if (string.IsNullOrEmpty(dt.Rows[i]["名称"].ToString()) && string.IsNullOrEmpty(dt.Rows[i]["内容"].ToString()))//名称、内容代表表格列名continue;var text= dt.Rows[i]["名称"].ToString();var data = dt.Rows[i]["内容"].ToString();var str = "https://xx.shuangruixin.cn/api/xcx/tool.aspx?opt=MakeTextQRCode&data=" + data + "&text=" + text;//生成二维码服务地址SaveImageFromWeb(str, "C:\\Users\\Administrator\\Desktop\\二维码\\", text);}
}

其中生成二维码服务代码如下:

public void MakeTextQRCode()
{if (!string.IsNullOrEmpty(Request.QueryString["data"]) && !string.IsNullOrEmpty(Request.QueryString["text"])){string str = Request.QueryString["data"];BarcodeWriter writer = new BarcodeWriter();writer.Format = BarcodeFormat.QR_CODE;QrCodeEncodingOptions options = new QrCodeEncodingOptions(){DisableECI = true,//设置内容编码CharacterSet = "UTF-8",Width = 500,//设置二维码的宽度和高度Height = 600,Margin = 1//设置二维码的边距,单位不是固定像素};writer.Options = options;Bitmap image = writer.Write(str);#region 添加文本Bitmap backgroudImg = new Bitmap(image.Width, image.Height);backgroudImg.MakeTransparent();Graphics g2 = Graphics.FromImage(backgroudImg);g2.Clear(Color.Transparent);//画二维码到新的面板上g2.DrawImage(image, 0, 0);string content = Request.QueryString["text"];if (!string.IsNullOrEmpty(content)){FontFamily fontFamily = new FontFamily("楷体");System.Drawing.Font font1 = new System.Drawing.Font(fontFamily, 30f, FontStyle.Bold, GraphicsUnit.Pixel);//文字长度 int strWidth = (int)g2.MeasureString(content, font1).Width;//总长度减去文字长度的一半(居中显示)int wordStartX = (image.Width - strWidth) / 2;int wordStartY = image.Height - 55;g2.DrawString(content, font1, Brushes.Black, wordStartX, wordStartY);}g2.Dispose();#endregion//保存为PNG到内存流MemoryStream ms = new MemoryStream();backgroudImg.Save(ms, ImageFormat.Png);Response.ContentType = "image/png";//输出二维码图片Response.BinaryWrite(ms.GetBuffer());Response.End();}
}

最后将生成的二维码保存到指定的路径。

 public static int SaveImageFromWeb(string imgUrl, string path, string fileName){if (path.Equals(""))throw new Exception("未指定保存文件的路径");string imgName = imgUrl.ToString().Substring(imgUrl.ToString().LastIndexOf("/") + 1);string defaultType = ".png";string[] imgTypes = new string[] { ".jpg", ".jpeg", ".png", ".gif", ".bmp" };string imgType = imgUrl.ToString().Substring(imgUrl.ToString().LastIndexOf("."));foreach (string it in imgTypes){if (imgType.ToLower().Equals(it))break;if (it.Equals(".bmp"))imgType = defaultType;}HttpWebRequest request = (HttpWebRequest)WebRequest.Create(imgUrl);request.UserAgent = "Mozilla/6.0 (MSIE 6.0; Windows NT 5.1; Natas.Robot)";request.Timeout = 3000;WebResponse response = request.GetResponse();Stream stream = response.GetResponseStream();if (response.ContentType.ToLower().StartsWith("image/")){byte[] arrayByte = new byte[1024];int imgLong = (int)response.ContentLength;int l = 0;if (fileName == "")fileName = imgName;if (!Directory.Exists(path)){//创建文件夹Directory.CreateDirectory(path);}string URL = path + fileName + imgType;FileStream fso = new FileStream(URL, FileMode.Create);while (l < imgLong){int i = stream.Read(arrayByte, 0, 1024);fso.Write(arrayByte, 0, i);l += i;}fso.Close();stream.Close();response.Close();return 1;}else{return 0;}}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/159335.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

python练习题(markdown中的60道题)

1.Demo01 摄氏温度转化为华氏温度 celsius float(input(输入摄氏温度&#xff1a;)) fahrenheit (9/5)*celsius 32 print(%0.1f 摄氏温度转为华氏温度为 %0.1f % (celsius, fahrenheit))结果&#xff1a; 2.Demo02 计算圆柱体的体积 h, r map(float, input().split())# …

python tkinter 使用(三)

python tkinter 使用(三) 本篇文章主要讲下tkinter下的filedialog的使用. 1: askopenfilename 首先使用tkinter中fiedialog来实现一个简单的文件选择器. 这里使用askopenfilename()来启动文件选择器,选择成功后打印下所选文件的名称. #!/usr/bin/python3 # -*- coding: UT…

echarts实现如下图功能代码

这里写自定义目录标题 const option {tooltip: {trigger: axis},legend: {left: "-1px",top:15px,type: "scroll",icon:rect,data: [{name:1, textStyle:{color: theme?"#E5EAF3":#303133,fontSize:14}}, {name: 2, textStyle:{color: theme…

小程序泄露腾讯地图apikey

今天挖小程序时测了很久&#xff0c;一直没有头绪&#xff0c;后来想要测试一下支付漏洞&#xff0c;但是这里却出问题了 添加地址时我发现&#xff0c;当我添加一个地址时&#xff0c;他会显示腾讯地图的logo和一部分小图&#xff0c;那时候我就在想&#xff0c;既然这里可以调…

函数隐式声明的危害及处理(C语言)

1.为什么要将函数隐式声明提升为编译错误 请看这个编译警告&#xff1a; [ 71%] Building C object main/CMakeFiles/shake.dir/pjt_helper.c.o /home/fengxh/shake_src/data_dispatch/main/pjt_helper.c: In function ‘SysMqtt_GetStateJsonPayload’: /home/fengxh/shake_s…

Vmware 扩展硬盘空间后的操作-Ubuntu

在VMware中扩展了Ubuntu虚拟机的硬盘容量后&#xff0c;你需要在Ubuntu内部进行操作才能使用新增的空间。过程包括为增加的空间建立分区、格式化以及挂载该分区供使用。下面是具体的步骤&#xff1a; 首先登录到你的Ubuntu系统&#xff0c;用lsblk命令查看分区情况。这样你可以…

多普勒流速仪的功能作用是什么?

我国地域广大&#xff0c;各地降雨分布不均&#xff0c;某些城市经常会出现连续的降雨进而导致城市排水压力过大&#xff0c;为了提高城市应对排水过量的极端情况的出现&#xff0c;亟需一种方案能够对城市排水进行有效及时的监测&#xff0c;从而能够及时的采取应对方案。 在污…

IO口电压下降那么多是怎么回事??

前几天一个工程师向我反馈他测得如下电路MCU IO口的电压不是3.3V&#xff0c;只有2V多。 IO配置的是输入功能&#xff0c;无上下拉。最初我不太相信这个结果&#xff0c;后来自己用万用表实际测量了下&#xff0c;还真是这个结果 这是咋回事呢&#xff1f;不应该电压就是3.3V吗…

前缀和的动态维护——树状数组[C/C++]

文章目录 前言lowbitlowbit的定义lowbit的计算 树状数组的思想树状数组的操作单点修改 update前缀查询 query树状数组的建立 build 前言 树状数组巧妙了利用位运算和树形结构实现了允许单点修改的情况下&#xff0c;动态维护前缀和&#xff0c;并且实现单点修改和前缀和查询的效…

【JavaEE】操作系统与进程

作者主页&#xff1a;paper jie_博客 本文作者&#xff1a;大家好&#xff0c;我是paper jie&#xff0c;感谢你阅读本文&#xff0c;欢迎一建三连哦。 本文录入于《JavaEE》专栏&#xff0c;本专栏是针对于大学生&#xff0c;编程小白精心打造的。笔者用重金(时间和精力)打造&…

python 水质日历热力图

利用日历热力图可以方便的查看站点水质全年的变化情况。 接口获取站点数据 这一步根据自己实际情况&#xff0c;也可以读取excel、MySQL读取数据。这里把API地址已隐去。 import numpy as np import calendar import requests import json import pandas as pd import time f…

给定两个字符串 s 和 t ,找不同

题意&#xff1a; 给定两个字符串 s 和 t &#xff0c;它们只包含小写字母。 字符串 t 由字符串 s 随机重排&#xff0c;然后在随机位置添加一个字母。 请找出在 t 中被添加的字母。 示例 1&#xff1a; 输入&#xff1a;s “abcd”, t “abcde” 输出&#xff1a;“e”…

【python学习】基础篇-常用第三方库-psutil:用于获取CPU、磁盘与网络等系统信息和进程管理

psutil是一个跨平台的Python库&#xff0c;用于获取系统信息和进程管理。以下是一些基本的用法&#xff1a; 获取CPU使用率 cpu_percent psutil.cpu_percent(interval1) print(cpu_percent)获取内存使用情况 memory_info psutil.virtual_memory() print(memory_info.perce…

Linux:进度条(小程序)以及git三板斧

Linux小程序&#xff1a;进度条 在实现小程序前我们要弄清楚&#xff1a; 1.缓冲区&#xff1b; 2.回车与换行。 缓冲区&#xff1a; 分别用gcc来编译下面两个程序&#xff1a; 程序一&#xff1a; #include <stdio.h> int main() { printf("hello Makefil…

前后端分离SpringBoot+vue的买菜农副产品多功能商城

1&#xff0c;项目介绍 本系统主要针对买菜而设计&#xff0c;其功能有菜品基本信息管理、商品类别管理、系统订单管理、评论管理、系统用户管理等功能模块。并且本系统采用了现在流行的SpringBootVue进行的设计与实现&#xff0c;其中Tomcat为服务器&#xff0c;MySQL为数据库…

QT中的lambda表达式

面是对Qt中在QObject::connect()中的lambda表达式常用用法 QString str("I am a string!"); devicestr; connect(ui- connect(m_imgshowUI, &ImgShow::GetImgPath, m_visionplatform, [](const std::string filename){m_visionplatform->ReadImg(filename);}…

moviepy 视频剪切,拼接,音频处理

官网 使用matplotlib — moviepy-cn 文档 案例 from moviepy.editor import * from moviepy.video.fx import resize from PIL import Imagefile1r"D:\xy_fs_try\video_to_deal\spider_video\file\vedeo3.mp4" file2r"D:\xy_fs_try\video_to_deal\spider_video\…

Maven聚合项目发布至私服指定模块

无论是从事框架开发工作还是公共服务模块开发&#xff0c;为了解决通用性问题&#xff0c;常常需要发布一些依赖组件至maven私服。然而通常我们得maven工程都是由多个模块组成得聚合工程&#xff08;一个父工程下有多个模块&#xff09;。 这个时候可能会面临两个窘境&#xf…

小红书干货类笔记怎么写?建议收藏

小红书干货类笔记是指在小红书这个社交平台上&#xff0c;用户分享的各种实用、有价值的生活技巧、经验、心得等内容的笔记。这类笔记通常具有以下特点&#xff1a;内容详实、实用性强、独特见解、图文并茂。 比如&#xff1a;某个妆要怎么化、某种技能该怎么学、某个城市该怎…