java 读Execl生成SQL

import java.io.BufferedWriter;
import java.io.File;
import java.io.FileWriter;
import java.io.IOException;

import jxl.Cell;
import jxl.Sheet;
import jxl.Workbook;
import jxl.read.biff.BiffException;

public class GenSQLFromExcel {

String path ; //放.xls文件的目录 如"c:\\user\\test"
String fileNames[]; //目录下的所有.xls文件 如 a.xls b.xls
Workbook workbook = null; //jxl的类

public String getPath() {
return path;
}
public void setPath(String newfile) {
this.path = newfile;
}
public String[] getFileNames() {
return fileNames;
}
public void setFileNames(String[] fileNames) {
this.fileNames = fileNames;
}

//打印
private void print(StringBuilder sb) {
String tmp = sb.toString();
System.out.print(tmp);
}

/*
* 将生成的建表语句写入磁盘文件
* path 文件名(*.sql)
* sb  拼接生成的建表SQl语句
*/
public void write(String path, StringBuilder sb) {

try {
File f = new File(path);
if (f.exists()) {
System.out.println(f.getName()+" 文件存在,已覆盖...");
} else {
System.out.println(f.getName()+" 文件不存在,正在创建...");
if (f.createNewFile()) {
System.out.println(f.getName()+" 文件创建成功!");
} else {
System.out.println(f.getName()+" 文件创建失败!");
}
}
BufferedWriter output = new BufferedWriter(new FileWriter(f));
output.write(sb.toString());
output.close();
} catch (Exception e) {
e.printStackTrace();
}
}

/*
* 生成列名
* sheet 对应.xls文件的某一个Sheet
* sb 用于拼接SQL语句
*/
private void getColums(Sheet sheet, StringBuilder sb) {
Cell c;
String s;
boolean isID = false;// idStr 判断是否为ID
int rows = sheet.getRows();
int realRows = rows;
for(int i=9;i<rows ;i++){
c=sheet.getCell(24,i); //字段名
s=c.getContents();
if(s!=null && !s.equals("")){
sb.append(s);

if( s.equals("ID")&& i==9)
isID = true;
if(i<rows-1){
c=sheet.getCell(24,i+1);
s=c.getContents();
if(s!=null && s.equals(""))
realRows = i+1;
}
}
else
break;
c=sheet.getCell(38,i); //类型
s=c.getContents();
sb.append(" "+s);
if(s.equals("VARCHAR")){
c=sheet.getCell(42,i); //增加长度
s=c.getContents();
sb.append("("+s+")");
}
c=sheet.getCell(46,i); //是否为主健
s=c.getContents();
if(s!=null && !s.equals(""))
sb.append(" PRIMARY KEY");
if(isID == true){ // 为ID主健则自动增长
sb.append(" AUTO_INCREMENT");
isID = false;
}
c=sheet.getCell(56,i);
s=c.getContents();
if(s!=null && !s.equals("")) //非空
sb.append(" NOT NULL");
c=sheet.getCell(59,i);
s=c.getContents();
if(s!=null && !s.equals(""))
sb.append(" comment '"+s+"'");
if(i<realRows-1)
sb.append(",\n");
}
sb.append("\n);\n");
}


/*
* 生成表头 
* sheet 对应.xls文件的一个Sheet(如sheet1,sheet2)
* sb
*/
private void getTableName(Sheet sheet, StringBuilder sb) {
String s = getTableName(sheet);
sb.append("DROP TABLE IF EXISTS "+s+";\n\n" );
sb.append("CREATE TABLE ");
sb.append(s);
sb.append("(\n");
}

/*
* 生成表的文件名 如user, 然后调用者加上.sql 就成了usr.sql
* sheet 对应.xls文件的一个Sheet(如sheet1,sheet2)
*
*/
private String getTableName(Sheet sheet) {
Cell c;
String s;
c = sheet.getCell(35,4); //取表名
if(c != null)
s=c.getContents();
else
s ="TABLE1";
return s;
}

/*
* 生成SQL表   并显示打印
*/
private void buildSql(Sheet sheet) {
StringBuilder sb = new StringBuilder();

if( sheet.getColumns()== 0 &&
sheet.getRows() == 0)
return;
getTableName(sheet, sb);// 取表名
getColums(sheet, sb); // 取字段名

//print(sb); //打印

String file =path+ "\\"+getTableName(sheet)+".sql";
write(file,sb); //写入文件
}

/*
*  解析一个.xls文件
*/
public void run(Workbook workbook, String fileName) {
try {
workbook = Workbook.getWorkbook(new File(fileName));
} catch (BiffException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}

Sheet[] shs = workbook.getSheets(); //遍历目录下的.xls文件名

// 从第3个sheet开始 
for(int i=2;i<shs.length;i++)
buildSql(shs[i]);

workbook.close();
}

public void run(String s) {
DirList dir = new DirList();
dir.setPath(new File(s));

String[] fileNames = dir.dirList(); //取得该目录下的.xls文件名
setFileNames(fileNames);

for(String file: fileNames)
run(workbook,s+"\\"+file);
}


public static void main(String[] args){
String s = "C:\\user\\test"; //存放 .xls文件的目录  应修改成自己放.xls文件目录
GenSQLFromExcel g = new GenSQLFromExcel();
g.setPath(s);
g.run(s);
}
}


import java.io.File;
import java.io.FilenameFilter;
import java.util.regex.Pattern;

/*
* TIJ4 书上的一个类,拿来直接用了
*/
public class DirList {

static File path = new File("."); //默认是当前文件目录
static String regex = ".*\\.xls"; //默认的查找的文件格式

public static FilenameFilter filter(final String regex){

return new FilenameFilter() //匿名内部类
{
private Pattern pattern = Pattern.compile(regex);

//回掉函数 具体的过程还不清楚
public boolean accept(File dir,String name){
return pattern.matcher(name).matches();
}
};
}
DirList(){};
DirList(File file, String reg){
path = file;
regex = reg;
}
void setPath(File f){ path = f;}
void setRegex(String reg) {regex = reg;}


String[] dirList(){
String[] files ;
files = path.list(filter(regex));
return files;
}
public static void main(String[] args) {

DirList dl = new DirList(); //先在当前目录下找
String[] tmp = dl.dirList();

for(String s :tmp)
System.out.println(s);

System.out.println("-------------------------------");

dl.setPath(new File("c:\\user")); //重新 设置目录
dl.setRegex(".*\\.xls"); //重新 设置查找条件
tmp = dl.dirList();

for(String s :tmp)
System.out.println(s);
}

}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值