近期需要做一批二维码,网上的基本上是一个来生码,或者需要网络支持或者需要单个复制;
从网上找了个插件,编写了一组小代码,目前已经应用起来了;
主要功能:读取excel中的内容,生成png格式(RGB格式)二维码,然后再根据ps动作,生成需要印刷格式的tiff格式图片(CMYK格式)
使用的插件为ThoughtWorks.QRCode;可以自己从网上找dll,或者从nuGet中搜索均可;
1.把excel,表格建好,里面分别设置两列必须的内容例如内容,二维码图片文件名;注意只读取Sheet1中的内容,如果想改名,可以在读取的方法中进行修改;
2.拖放excel到程序中,读取里面的两列内容;
3.根据两列内容生成对应的二维码内容;
上代码:
1.建立对应的Excel表格,在表格sheet1中设置对应的两列内容和二维码名称两列;下面设置填充对应的内容;
2.拖放实现内容读取:
分别给dataGridView添加两个方法:dataGridView1_DragEnter;dataGridView1_DragDrop;属性选择允许接收拖放;代码如下:
private void dataGridView1_DragDrop(object sender, DragEventArgs e)
{
System.Array myarr = (System.Array)e.Data.GetData(DataFormats.FileDrop);
System.Collections.IEnumerator myEnumerator = myarr.GetEnumerator();
myEnumerator.MoveNext();
string FileName = "";
FileName = myEnumerator.Current.ToString(); ;
dataGridView1.DataSource = GetExcelData("Sheet1", FileName);
dataGridView1.DataMember = "Sheet1";// "[Sheet1$]";
for (int count = 0; (count <= (dataGridView1.Rows.Count - 1)); count++)
{
dataGridView1.Rows[count].HeaderCell.Value = (count + 1).ToString();
}
MessageBox.Show("共有" + (this.dataGridView1.Rows.Count).ToString() + "条信息");
}
private void dataGridView1_DragEnter(object sender, DragEventArgs e)
{
if (e.Data.GetDataPresent(DataFormats.FileDrop))
e.Effect = DragDropEffects.Copy;
else
e.Effect = DragDropEffects.None;
}
其中一个获取excel的方法单独提取出来了如下,只读取sheet1中内容;现在出来;
public static DataSet GetExcelData(string strSheetName, string strExcelFileName)
{
string strCon = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" + strExcelFileName + ";Extended Properties='Excel 12.0;HDR=YES;IMEX=1;'";
OleDbConnection myConn = new OleDbConnection(strCon);
string strCom = string.Format("select * from [{0}$]", strSheetName);// " SELECT * FROM [Sheet1$]";
DataSet myDataSet = new DataSet();
try
{
myConn.Open();
OleDbDataAdapter myCommand = new OleDbDataAdapter(strCom, myConn);
myCommand.Fill(myDataSet, strSheetName);//"[Sheet1$]");
}
catch (Exception e)
{
//MessageBox.Show("表格中第一个表的名字必须是Sheet1!");
throw e;
}
finally
{
myConn.Close();
}
return myDataSet;
}
3.建立一个button设置对应的事件;
private void button1_Click(object sender, EventArgs e)
{
//自定义的一个列表,用于生码使用
impList.Clear();
currentPath = Application.StartupPath + @"\"+DateTime.Now.ToString().Replace("\\","").Replace(" ","").Replace(":","").Replace("/","");
Directory.CreateDirectory(currentPath);
int error = 0;
if (dataGridView1.Rows.Count > 0)
{
for (int j = 0; j < this.dataGridView1.Rows.Count; j++)//this.dataGridView1.Rows.Count
{
string imgname = dataGridView1.Rows[j].Cells["二维码图片文件名"].Value.ToString().Trim() ?? dataGridView1.Rows[j].Cells["二维码图片文件名"].Value.ToString().Trim();
string urlstring = dataGridView1.Rows[j].Cells["内容"].Value.ToString().Trim() ?? dataGridView1.Rows[j].Cells["内容"].Value.ToString().Trim();
if (!String.IsNullOrEmpty(imgname)&&!String.IsNullOrEmpty(urlstring))
{
impList.Add(new Imgs() { url = urlstring, name = imgname });
}
else
{
error++;
}
}
}else
{
MessageBox.Show("没有数据生成");
}
//图片需要的边距
int padding=10;
if (txpadding.Text != "10") { padding = int.Parse(txpadding.Text); }
foreach (var item in impList)
{
Bitmap image = Create_ImgCode(item.url, padding);
//保存图片
SaveImg(currentPath,item.name, image);
//打开文件夹
}
Open_File(currentPath);
MessageBox.Show("共计生成:" + impList.Count() + "个二维码,有" + error.ToString()+"无效码");
}
说明:如要内容1.读取excel中两列内容到imgList中;2.建立生码存放的地址currentPath;3.读取参数;4.生码然后保存,保存完后打开对应的目录;
上面生码Create_ImgCode代码如下:
public Bitmap Create_ImgCode(string codeNumber,int padd=0 ,int size=10)
{
int pad = padd;
//创建二维码生成类
QRCodeEncoder qrCodeEncoder = new QRCodeEncoder();
//设置编码模式
qrCodeEncoder.QRCodeEncodeMode = QRCodeEncoder.ENCODE_MODE.BYTE;
//设置编码测量度
qrCodeEncoder.QRCodeScale = size; //大小(值越大生成的二维码图片像素越高)
//设置编码版本
qrCodeEncoder.QRCodeVersion = 0;
//设置编码错误纠正
qrCodeEncoder.QRCodeErrorCorrect = QRCodeEncoder.ERROR_CORRECTION.H;
//生成二维码图片
System.Drawing.Bitmap image = qrCodeEncoder.Encode(codeNumber,Encoding.UTF8);
if (padd==0)
{
pad = image.Width / 30;
}
//当目标图片尺寸大于二维码尺寸时,将二维码绘制在目标尺寸白色画布的中心位置
//新建空白绘图
System.Drawing.Bitmap panel = new System.Drawing.Bitmap(image.Width + pad + pad, image.Width +pad+pad);
System.Drawing.Graphics graphic0 = System.Drawing.Graphics.FromImage(panel);
//bai--------------
graphic0.Clear(System.Drawing.Color.White);
int p_left = pad;
int p_top = pad;
//将生成的二维码图像粘贴至绘图的中心位置
graphic0.DrawImage(image, p_left, p_top, image.Width, image.Height);
image = new System.Drawing.Bitmap(panel);
panel.Dispose();
panel = null;
graphic0.Dispose();
graphic0 = null;
return image;
}
其他方法可以借鉴的如下;
/// <summary>
/// 生成二维码
/// </summary>
/// <param name="Content">内容文本</param>
/// <param name="QRCodeEncodeMode">二维码编码方式</param>
/// <param name="QRCodeErrorCorrect">纠错码等级</param>
/// <param name="QRCodeVersion">二维码版本号 0-40</param>
/// <param name="QRCodeScale">每个小方格的预设宽度(像素),正整数</param>
/// <param name="size">图片尺寸(像素),0表示不设置</param>
/// <param name="border">图片白边(像素),当size大于0时有效</param>
/// <returns></returns>
public System.Drawing.Image CreateQRCode(string Content, int size, int border)
{
QRCodeEncoder qrCodeEncoder = new QRCodeEncoder();
qrCodeEncoder.QRCodeEncodeMode = QRCodeEncoder.ENCODE_MODE.BYTE;
//设置编码测量度
// qrCodeEncoder.QRCodeScale = size; //大小(值越大生成的二维码图片像素越高)
//设置编码版本
qrCodeEncoder.QRCodeVersion = 7;
//设置编码错误纠正
qrCodeEncoder.QRCodeErrorCorrect = QRCodeEncoder.ERROR_CORRECTION.H;
//生成二维码图片
qrCodeEncoder.QRCodeForegroundColor = Color.Black;// btnQRCodeForegroundColor.BackColor;//设置二维码前景色
qrCodeEncoder.QRCodeBackgroundColor = Color.White;// btnQRCodeBackgroundColor.BackColor;//设置二维码背景色
qrCodeEncoder.QRCodeScale =1;// QRCodeScale;
System.Drawing.Image image = qrCodeEncoder.Encode(Content,Encoding.UTF8);
#region 根据设定的目标图片尺寸调整二维码QRCodeScale设置,并添加边框
if (size > 0)
{
//当设定目标图片尺寸大于生成的尺寸时,逐步增大方格尺寸
#region 当设定目标图片尺寸大于生成的尺寸时,逐步增大方格尺寸
while (image.Width < size)
{
qrCodeEncoder.QRCodeScale++;
System.Drawing.Image imageNew = qrCodeEncoder.Encode(Content,Encoding.UTF8);
if (imageNew.Width < size)
{
image = new System.Drawing.Bitmap(imageNew);
imageNew.Dispose();
imageNew = null;
}
else
{
qrCodeEncoder.QRCodeScale--; //新尺寸未采用,恢复最终使用的尺寸
imageNew.Dispose();
imageNew = null;
break;
}
}
#endregion
//当设定目标图片尺寸小于生成的尺寸时,逐步减小方格尺寸
#region 当设定目标图片尺寸小于生成的尺寸时,逐步减小方格尺寸
while (image.Width > size && qrCodeEncoder.QRCodeScale > 1)
{
qrCodeEncoder.QRCodeScale--;
System.Drawing.Image imageNew = qrCodeEncoder.Encode(Content, Encoding.UTF8);
image = new System.Drawing.Bitmap(imageNew);
imageNew.Dispose();
imageNew = null;
if (image.Width < size)
{
break;
}
}
#endregion
//如果目标尺寸大于生成的图片尺寸,则为图片增加白边
#region 如果目标尺寸大于生成的图片尺寸,则为图片增加白边
if (image.Width <= size)
{
//根据参数设置二维码图片白边的最小宽度
#region 根据参数设置二维码图片白边的最小宽度
if (border > 0)
{
while (image.Width <= size && size - image.Width < border * 2 && qrCodeEncoder.QRCodeScale > 1)
{
qrCodeEncoder.QRCodeScale--;
System.Drawing.Image imageNew = qrCodeEncoder.Encode(Content, Encoding.UTF8);
image = new System.Drawing.Bitmap(imageNew);
imageNew.Dispose();
imageNew = null;
}
}
#endregion
//当目标图片尺寸大于二维码尺寸时,将二维码绘制在目标尺寸白色画布的中心位置
if (image.Width < size)
{
//新建空白绘图
System.Drawing.Bitmap panel = new System.Drawing.Bitmap(size, size);
System.Drawing.Graphics graphic0 = System.Drawing.Graphics.FromImage(panel);
//bai--------------
graphic0.Clear(System.Drawing.Color.White);
int p_left = 0;
int p_top = 0;
if (image.Width <= size) //如果原图比目标形状宽
{
p_left = (size - image.Width) / 2;
}
if (image.Height <= size)
{
p_top = (size - image.Height) / 2;
}
//将生成的二维码图像粘贴至绘图的中心位置
graphic0.DrawImage(image, p_left, p_top, image.Width, image.Height);
image = new System.Drawing.Bitmap(panel);
panel.Dispose();
panel = null;
graphic0.Dispose();
graphic0 = null;
}
}
#endregion
}
#endregion
return image;
}
至此代码到此完成了;大家可以根据自己的想法再进行扩展;