读取excel批量生成二维码

时间:2022-01-17 14:51:16

昨天工作需要,让生成二维码,让用草料生成,就需要一个个的复制粘贴,有点麻烦.关键是量特别大,如果传统的复制粘贴要很长时间才可以.

后来想到用程序生成.于是百度了一下生成二维码的方法,别说还很简单,把代码粘上,运行一下,竟然真的生成了,就是有点瑕疵,稍微调整一下就好了.

再找了一下读取excel的方法,粘上代码,导入jar包,稍微改造一下,竟然也可以用,于是就把二者 合二为一,循环了一下,就可以批量生成二维码了.稍微调试一下,加个logo,测试了一下中文竟然可以用了.

现在就分享一下使用方法.有需要批量生成二维码的朋友,可以拿去用一下.希望有用的朋友给个评论,也好做出相应的改正.

ps:暂时只支持xls格式,如有xlsx格式,请先转换成xls再使用.后续有空闲了再gai

代码如下:



import java.awt.Color;  
import java.awt.Graphics2D;
import java.awt.Image;
import java.awt.image.BufferedImage;  
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStream;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import javax.imageio.ImageIO;

import org.apache.commons.lang.StringUtils;

import com.swetake.util.Qrcode;

import jxl.Sheet;
import jxl.Workbook;
import jxl.read.biff.BiffException; 
 
 /**
 * 
* @ClassName: CreateQRCode 
* @Description: 读取excel 批量生成二维码的工具类
* @author A18ccms a18ccms_gmail_com 
* @date 2017年12月26日 下午1:24:04 
*
 */
public class CreateQRCode {  
     
   
   /**
   * @Title: QRCode 
   * @Description: 生成二维码 
   * @param @param name 文件名
   * @param @param data 二维码信息
   * @param @param logoPath 中间logo图片地址
   * @param @throws Exception    设定文件 
   * @return void    返回类型 
   * @throws
    */
   public void QRCode(String name,String qrData,String logoPath) throws Exception{
   Qrcode qrcode = new Qrcode();  
       qrcode.setQrcodeErrorCorrect('M');//纠错等级(分为L、M、H三个等级)  
       qrcode.setQrcodeEncodeMode('B');//N代表数字,A代表a-Z,B代表其它字符  
       qrcode.setQrcodeVersion(7);//版本  
       //设置一下二维码的像素  
       int width = 280;  
       int height = 280;  
       BufferedImage bufferedImage = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);  
       //绘图  
       Graphics2D gs = bufferedImage.createGraphics();  
       gs.setBackground(Color.WHITE);  
       gs.setColor(Color.BLACK);  
       gs.clearRect(0, 0, width, height);//清除下画板内容  
         
       //设置下偏移量,如果不加偏移量,有时会导致出错。  
       int pixoff = 2;  
         
       byte[] d = qrData.getBytes("UTF-8");  
       if(d.length > 0 && d.length <120){  
           boolean[][] s = qrcode.calQrcode(d);  
           for(int i=0;i<s.length;i++){  
               for(int j=0;j<s.length;j++){  
                   if(s[j][i]){  
                       gs.fillRect(j*6+pixoff+3, i*6+pixoff+3, 6, 6);  
                   }  
               }  
           }  
       }  
       Image img = ImageIO.read(new File(logoPath));  // 实例化一个Image对象。如果不需要logo 可以去掉这两行代码
       gs.drawImage(img, 105, 105, 60, 60, null);       // 105,105是距离gs两个边的距离,60,是中间logo的大小
       gs.dispose();  
       bufferedImage.flush();  
       ImageIO.write(bufferedImage, "png", new File("E:/code/"+name+".png"));
   }
   
   
   
   // 去读Excel的方法readExcel,该方法的入口参数为一个File对象  
   public List<Map<String, String>> readExcelWrite(File file) { 
   InputStream is = null;
   List<Map<String, String>> list = new ArrayList<>();
       try {  
           // 创建输入流,读取Excel  
           is = new FileInputStream(file.getAbsolutePath());  
           // jxl提供的Workbook类  
           Workbook wb = Workbook.getWorkbook(is);  
           // Excel的页签数量  
           int sheet_size = wb.getNumberOfSheets();  
           for (int index = 0; index < sheet_size; index++) {  
               // 每个页签创建一个Sheet对象  
               Sheet sheet = wb.getSheet(index);  
               // sheet.getRows()返回该页的总行数  
               //第一行为表头行,不需要读取,故从1开始,及第二行开始读取
               for (int i = 1; i < sheet.getRows(); i++) {  
                   // sheet.getColumns()返回该页的总列数  
               //列数从0开始,0位第一列,A列
                       String name = sheet.getCell(0, i).getContents();  
                       String data = sheet.getCell(1, i).getContents(); 
                       Map<String, String> map = new HashMap<>();
                       map.put("name", name);
                       map.put("data", data);
                       list.add(map);
               }  
           }  
       } catch (FileNotFoundException e) {  
           e.printStackTrace();  
       } catch (BiffException e) {  
           e.printStackTrace();  
       } catch (IOException e) {  
           e.printStackTrace();  
       } finally {  
           try {  
               // 记得关闭流  
           if (null != is) {
           is.close();  
           }
           } catch (Exception e) {  
               e.printStackTrace();  
           }  
       }  
       return list;
   }  

public static void main(String[] args) throws Exception{ 
File file = new File("E:/code/a1111.xls");
//读取excel并解析出返回的内容暂时不支持 xlsx格式,请自行改成xls
List<Map<String, String>> list = readExcelWrite(file);
if (null != list && list.size() > 0) {
for (Map<String, String> map : list) {
String name = map.get("name");
String data = map.get("data");
if (StringUtils.isNotEmpty(name)&& StringUtils.isNotEmpty(data)) {
//调用生成二维码方法
QRCode(name, data,"E:/code/20170911174614244.png");
}
}
}
}

jar包下载地址:点击打开链接

http://download.csdn.net/download/dejie0806/10173715

生成的二维码实例如下.

读取excel批量生成二维码


一定要注意一下,所要生成二维码图片的大小,相应的调整logo的位置.