1. 程式人生 > >讀取excel批量生成二維碼

讀取excel批量生成二維碼

昨天工作需要,讓生成二維碼,讓用草料生成,就需要一個個的複製貼上,有點麻煩.關鍵是量特別大,如果傳統的複製貼上要很長時間才可以.

後來想到用程式生成.於是百度了一下生成二維碼的方法,別說還很簡單,把程式碼粘上,執行一下,竟然真的生成了,就是有點瑕疵,稍微調整一下就好了.

再找了一下讀取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的位置.