文章目录
安装 Gradle 包
dependencies {
compile group: 'net.sourceforge.jexcelapi', name: 'jxl', version: '2.6.12'
compile group: 'org.dom4j', name: 'dom4j', version: '2.0.0'
}
代码
见函数 :buildRandomCode。
package com.kd.shared.tool;
import jxl.Workbook;
import jxl.write.Label;
import jxl.write.WritableSheet;
import jxl.write.WritableWorkbook;
import jxl.write.WriteException;
import java.io.File;
import java.io.IOException;
import java.util.HashSet;
import java.util.Set;
/**
* 礼品码生成工具.
* uniqueId不同,生成的礼包码不会相同。
*/
public class GiftCodeBuilder {
/** 礼品码的长度*/
private static final Integer CODE_LENGTH = 10;
private static final char [] delimiter = new char[]{
'5', '2', '7', 'Z', 'B', 'Y'};
private static final char [] mixCharactersGroup1 = new char[]{
'P', 'A', 'R', '8', 'U', 'V', '1', 'F', 'X', 'M'};
private static final char [] mixCharactersGroup2 = new char[]{
'C', 'S', '3', 'E', 'H', 'J', 'K','0', 'N', 'O'};
private static final char [] mixCharactersGroup3 = new char[]{
'D', '4', 'G', 'I', '6', 'L', 'Q', 'T', 'W', '9'};
private static final char [] number = new char[]{
'0', '1', '2', '3', '4', '5', '6', '7', '8', '9'};
private static final char [] upperLetter = new char[]{
'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z'};
private static final char [] alphaNum = new char[]{
'0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z'};
public static void main(String[] args) {
generateExcel("礼包码1", 1, 1, 5);
generateExcel("礼包码2", 2, 6, 10);
generateExcel("礼包码3", 3, 11, 15);
}
public static void testCode(){
Set<String> set = new HashSet<>();
long start = System.currentTimeMillis();
for (int i = 0; i < 1000000; i++){
set.add(buildRandomCode(i));
System.out.println(buildRandomCode(i));
}
long end = System.currentTimeMillis();
System.out.println(set.size());
System.out.println(end - start);
}
/**
* @param giftPackageName 礼包的名字
* @param giftId 礼包的Id
* @param startId 生成礼包码的起始唯一id
* @param endId include
*/
public static void generateExcel(String giftPackageName, int giftId, int startId, int endId){
if(endId < startId){
System.out.println("输入错误!");
return;
}
int count = Math.max(0, endId - startId) + 1;
String outPath = System.getProperty("user.dir") + File.separator + giftPackageName + ".xls";
File xlsFile = new File(outPath);
// 创建一个工作簿
WritableWorkbook workbook = null;
try {
workbook = Workbook.createWorkbook(xlsFile);
} catch (IOException e) {
e.printStackTrace();
return;
}
WritableSheet sheet = workbook.createSheet(giftPackageName, 0);
try {
sheet.addCell(new Label(0, 0, "id"));
sheet.addCell(new Label(1, 0, "code"));
sheet.addCell(new Label(2, 0, "gift_id"));
sheet.addCell(new Label(3, 0, "uid"));
for (int row = 1; row <= count; row++) {
sheet.addCell(new Label(0, row, String.valueOf(startId)));
sheet.addCell(new Label(1, row, buildRandomCode(startId)));
sheet.addCell(new Label(2, row, String.valueOf(giftId)));
sheet.addCell(new Label(3, row, String.valueOf(0)));
startId += 1;
}
}catch (WriteException e){
e.printStackTrace();
}finally {
try {
workbook.write();
workbook.close();
}catch (IOException | WriteException e){
e.printStackTrace();
}
}
}
/**
* 区间 [0, maxValue) 随机数
* @param maxValue
* @return
*/
private static int randomPositiveInt(int maxValue){
return (int) (Math.random() * maxValue);
}
/**
* 生成礼包码.
* uniqueId不同,生成的礼包码不会相同。
* @param uniqueId
* @return
*/
private static String buildRandomCode(int uniqueId){
StringBuilder builder = new StringBuilder();
appendRandomConfusionString(builder, uniqueId);
prependRandomConfusionString(builder, uniqueId);
return builder.toString();
}
/**
* 补全后半部分的混淆字符串.
* @param builder
* @param uniqueId
*/
private static void appendRandomConfusionString(StringBuilder builder, int uniqueId){
int maxValue;
for (int i = 1; i <= CODE_LENGTH; i++){
maxValue = (int) Math.pow(10, i);
if(uniqueId < maxValue){
appendFixRandomConfusionString(builder, String.valueOf(uniqueId).toCharArray());
return;
}
}
System.out.println("唯一id不合法!");
System.out.println(0);
}
/**
* 补全后半部分的混淆字符串.
* @param builder
* @param chars
*/
private static void appendFixRandomConfusionString(StringBuilder builder, char [] chars){
if(chars.length <= 0){
return;
}
for (int i = 0; i < chars.length; i++){
builder.insert(0, getGroupRandomChar(chars[i]));
}
}
/**
* 补全固定混淆字符串
* @param builder
* @param uniqueId
*/
private static void prependRandomConfusionString(StringBuilder builder, int uniqueId){
int maxValue;
for (int i = 1; i <= CODE_LENGTH; i++){
maxValue = (int) Math.pow(10, i);
if(uniqueId < maxValue){
prependFixRandomConfusionString(builder, CODE_LENGTH - i);
return;
}
}
}
/**
* 补全固定混淆字符串
* @param builder
* @param length
* @return
*/
private static void prependFixRandomConfusionString(StringBuilder builder, int length){
if(length <= 0){
return;
}
builder.insert(0, getRandomDelimiter());
int loop = length - 1;
for (int i = 1; i <= loop; i++){
builder.insert(0, getRandomChar());
}
}
/**
* 返回随机字母或者数字.
* @return
*/
public static char getRandomChar(){
return alphaNum[randomPositiveInt(alphaNum.length)];
}
/**
* 返回分隔字符.
* @return
*/
public static char getRandomDelimiter(){
return delimiter[randomPositiveInt(delimiter.length)];
}
/**
* number => [0, 9]
* @param numChar
* @return
*/
public static char getGroupRandomChar(char numChar){
if(numChar < '0' || numChar > '9'){
System.out.println("数字超出范围");
System.exit(0);
}
int group = randomPositiveInt(3);
if(group == 0){
return mixCharactersGroup1[Character.getNumericValue(numChar)];
}else if(group == 1){
return mixCharactersGroup2[Character.getNumericValue(numChar)];
}else {
return mixCharactersGroup3[Character.getNumericValue(numChar)];
}
}
/**
* 校验配置数据长度.
*/
public static void checkCharacterArray(){
Set<Character> s = new HashSet<>();
for (char c: delimiter){
s.add(c);
}
for (char c: mixCharactersGroup1){
s.add(c);
}
for (char c: mixCharactersGroup2){
s.add(c);
}
for (char c: mixCharactersGroup3){
s.add(c);
}
System.out.println(delimiter.length);
System.out.println(mixCharactersGroup1.length);
System.out.println(mixCharactersGroup2.length);
System.out.println(mixCharactersGroup3.length);
System.out.println(s.size());
int length2 = s.size();
int length1 = delimiter.length + mixCharactersGroup3.length + mixCharactersGroup2.length + mixCharactersGroup1.length;
if(length1 != length2){
System.out.println("数组配置错误!");
}else {
System.out.println("数组配置正确!");
}
}
}