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;}}
相关文章:
C#实现批量生成二维码
相信大家都使用过草料二维码生成器,单独生成二维码可以,但是批量生成二维码就需要收费了。既然要收费,那就自己写一个。 接口采用导入Excel文件生成二维码,首先需要读取Excel的数据,方法如下所示: /// <…...

3种在ArcGIS Pro中制作山体阴影的方法
山体阴影可以更直观的展现地貌特点,表达真实的地形,这里为大家介绍一下在ArcGIS Pro中制作山体阴影的方法,希望能对你有所帮助。 数据来源 本教程所使用的数据是从水经微图中下载的DEM数据,除了DEM数据,常见的GIS数据…...

【ChatGLM2-6B】Docker下部署及微调
【ChatGLM2-6B】小白入门及Docker下部署 一、简介1、ChatGLM2是什么2、组成部分3、相关地址 二、基于Docker安装部署1、前提2、CentOS7安装NVIDIA显卡驱动1)查看服务器版本及显卡信息2)相关依赖安装3)显卡驱动安装 2、 CentOS7安装NVIDIA-Doc…...
输入两个整数,输出它们的乘积。 ← Python 及 C++ 代码比较
【题目描述】 输入两个整数,输出它们的乘积。【Python代码】 x,ymap(int,input().split()) print(x*y) 【C代码】 #include<bits/stdc.h> using namespace std;int x,y; int main() {cin>>x>>y;cout<<x*y<<endl;return 0; }/* in:…...

C语言——从键盘输人一个表示年份的整数,判断该年份是否为闰年,并显示判断结果。
#define _CRT_SECURE_NO_WARNINGS 1#include<stdio.h> int main() {int year 0;printf("请输入年份:");scanf("%d",&year);if((year%4 0) && (year%100!0) || (year%400 0)){printf("%d是闰年\n",year);}else{p…...

出于隐私和安全的考虑,有时需要从谷歌删除你的个人数据,有两种方法
如果你是公众人物、企业或拥有个人品牌的人,那么拥有在线形象很重要。然而,你可能会发现,通过谷歌搜索,陌生人可以获得你的个人信息,如联系方式、地址和财务信息,这会让你感到不安。 幸运的是,…...

【同一局域网下】两台电脑之间互ping
两台电脑互ping 首先需要连接同一网咯关闭需要ping的电脑的防火墙 关闭防火墙步骤(以win11系统为例): 设置 --> 隐私和安全性 --> Windows 安全中心 打开Windows安全中心 防火墙和网络保护 --> 选择正在使用的网络 关闭 ping其他…...

【精选】Ajax技术知识点合集
Ajax技术详解 Ajax简介 Ajax 即“Asynchronous Javascript And XML”(异步 JavaScript 和 XML),是指一种创建 交互式、快速动态应用的网页开发技术,无需重新加载整个网页的情况下,能够更新页面局 部数据的技术。通过在…...

智能优化算法应用:基于水循环算法无线传感器网络(WSN)覆盖优化 - 附代码
智能优化算法应用:基于水循环算法无线传感器网络(WSN)覆盖优化 - 附代码 文章目录 智能优化算法应用:基于水循环算法无线传感器网络(WSN)覆盖优化 - 附代码1.无线传感网络节点模型2.覆盖数学模型及分析3.水循环算法4.实验参数设定5.算法结果6.参考文献7.…...
java-netty知识点笔记和注意事项
如何获取ctx的id 使用ctx.ctx.toString()就可以了 public void channelRead(ChannelHandlerContext ctx, Object msg) {//传来的消息包装成字节缓冲区String byteBuf (String) msg; // ByteBuf byteBuf (ByteBuf) msg;//Netty提供了字节缓冲区的toString方法ÿ…...
英伟达不同系列GPU介绍
英伟达有以下几个系列的产品线,并介绍它们的特点和主要应用领域: 1. GeForce系列(G系列): - 特点:GeForce系列是英伟达主打的消费级GPU产品线,注重提供高性能的图形处理能力和游戏特性。它们…...

C语言——I /深入理解指针(二)
一、数组名的理解 int arr[10] {1,2,3,4,5,6,7,8,9,10}; int *p &arr[0];这⾥我们使⽤ &arr[0] 的⽅式拿到了数组第⼀个元素的地址,但是其实数组名本来就是地址,⽽且 是数组⾸元素的地址,我们来做个测试。 #include <stdio.…...

MySQL使用函数和存储过程实现:向数据表快速插入大量测试数据
实现过程 1.创建表 CREATE TABLE user_info (id INT(11) NOT NULL AUTO_INCREMENT,name VARCHAR(20) DEFAULT NULL,age INT(3) DEFAULT NULL,pwd VARCHAR(20) DEFAULT NULL,phone_number VARCHAR(11) DEFAULT NULL,email VARCHAR(255) DEFAULT NULL,address VARCHAR(255) DEF…...
力扣labuladong——一刷day59
提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 前言一、力扣549. 二叉树中最长的连续序列二、力扣1325. 删除给定值的叶子节点 前言 像求和、求高度这种基本的二叉树函数很容易写,有时候只要在它们的后…...

接口性能测试 —— Jmeter并发与持续性压测
接口压测的方式: 1、同时并发:设置线程组、执行时间、循环次数,这种方式可以控制接口请求的次数 2、持续压测:设置线程组、循环次数,勾选“永远”,调度器(持续时间),这种…...

redis报错3
INFO: Initializing SpringDispatcherServletdispatcherServlet...

Proteus的网络标号与总线
Proteus为了减少过多、复杂的连线,可以使用网络标号与总线配合使用。 Proteus的导线上添加了网络标号,意味着在Proteus上相同的网络标号是连在一起的,所说在图纸上看不出来。 如下图是比较好的Proteus中使用总线的绘制的图纸。可以效仿着画…...

4、stable diffusion
github 安装anaconda环境 conda env create -f environment.yaml conda activate ldm安装依赖 conda install pytorch1.12.1 torchvision0.13.1 torchaudio0.12.1 cudatoolkit11.3 -c pytorch pip install transformers4.19.2 diffusers invisible-watermark pip install -e…...
LeetCode51. N-Queens
文章目录 一、题目二、题解 一、题目 The n-queens puzzle is the problem of placing n queens on an n x n chessboard such that no two queens attack each other. Given an integer n, return all distinct solutions to the n-queens puzzle. You may return the answe…...

前端vue3——html2canvas给网站截图生成宣传海报
文章目录 ⭐前言⭐选择html2canvas实现网页截图💖 截图 ⭐图片url截图显示不出来问题💖 解决 ⭐最终效果💖 定义海报 ⭐总结⭐结束 ⭐前言 大家好,我是yma16,本文分享关于 前端vue3——html2canvas给网站截图生成宣传…...

基于ASP.NET+ SQL Server实现(Web)医院信息管理系统
医院信息管理系统 1. 课程设计内容 在 visual studio 2017 平台上,开发一个“医院信息管理系统”Web 程序。 2. 课程设计目的 综合运用 c#.net 知识,在 vs 2017 平台上,进行 ASP.NET 应用程序和简易网站的开发;初步熟悉开发一…...

[10-3]软件I2C读写MPU6050 江协科技学习笔记(16个知识点)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16...

认识CMake并使用CMake构建自己的第一个项目
1.CMake的作用和优势 跨平台支持:CMake支持多种操作系统和编译器,使用同一份构建配置可以在不同的环境中使用 简化配置:通过CMakeLists.txt文件,用户可以定义项目结构、依赖项、编译选项等,无需手动编写复杂的构建脚本…...

stm32wle5 lpuart DMA数据不接收
配置波特率9600时,需要使用外部低速晶振...
Python竞赛环境搭建全攻略
Python环境搭建竞赛技术文章大纲 竞赛背景与意义 竞赛的目的与价值Python在竞赛中的应用场景环境搭建对竞赛效率的影响 竞赛环境需求分析 常见竞赛类型(算法、数据分析、机器学习等)不同竞赛对Python版本及库的要求硬件与操作系统的兼容性问题 Pyth…...

嵌入式学习之系统编程(九)OSI模型、TCP/IP模型、UDP协议网络相关编程(6.3)
目录 一、网络编程--OSI模型 二、网络编程--TCP/IP模型 三、网络接口 四、UDP网络相关编程及主要函数 编辑编辑 UDP的特征 socke函数 bind函数 recvfrom函数(接收函数) sendto函数(发送函数) 五、网络编程之 UDP 用…...

热门Chrome扩展程序存在明文传输风险,用户隐私安全受威胁
赛门铁克威胁猎手团队最新报告披露,数款拥有数百万活跃用户的Chrome扩展程序正在通过未加密的HTTP连接静默泄露用户敏感数据,严重威胁用户隐私安全。 知名扩展程序存在明文传输风险 尽管宣称提供安全浏览、数据分析或便捷界面等功能,但SEMR…...
Django RBAC项目后端实战 - 03 DRF权限控制实现
项目背景 在上一篇文章中,我们完成了JWT认证系统的集成。本篇文章将实现基于Redis的RBAC权限控制系统,为系统提供细粒度的权限控制。 开发目标 实现基于Redis的权限缓存机制开发DRF权限控制类实现权限管理API配置权限白名单 前置配置 在开始开发权限…...
Java多线程实现之Runnable接口深度解析
Java多线程实现之Runnable接口深度解析 一、Runnable接口概述1.1 接口定义1.2 与Thread类的关系1.3 使用Runnable接口的优势 二、Runnable接口的基本实现方式2.1 传统方式实现Runnable接口2.2 使用匿名内部类实现Runnable接口2.3 使用Lambda表达式实现Runnable接口 三、Runnabl…...

【Vue】scoped+组件通信+props校验
【scoped作用及原理】 【作用】 默认写在组件中style的样式会全局生效, 因此很容易造成多个组件之间的样式冲突问题 故而可以给组件加上scoped 属性, 令样式只作用于当前组件的标签 作用:防止不同vue组件样式污染 【原理】 给组件加上scoped 属性后…...