讀取excel批量生成二維碼
阿新 • • 發佈:2019-02-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
生成的二維碼例項如下.
一定要注意一下,所要生成二維碼圖片的大小,相應的調整logo的位置.