昨天工作需要,让生成二维码,让用草料生成,就需要一个个的复制粘贴,有点麻烦.关键是量特别大,如果传统的复制粘贴要很长时间才可以.
后来想到用程序生成.于是百度了一下生成二维码的方法,别说还很简单,把代码粘上,运行一下,竟然真的生成了,就是有点瑕疵,稍微调整一下就好了.
再找了一下读取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
生成的二维码实例如下.
一定要注意一下,所要生成二维码图片的大小,相应的调整logo的位置.