/**
* @author shany
* @date 2018年9月18日 上午9:00:47
* @version V1.0
*/
package shany;
import java.io.BufferedReader;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.FileReader;
import java.io.IOException;
import java.io.OutputStream;
import java.io.UnsupportedEncodingException;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import org.apache.poi.hssf.usermodel.HSSFCell;
import org.apache.poi.hssf.usermodel.HSSFCellStyle;
import org.apache.poi.hssf.usermodel.HSSFFont;
import org.apache.poi.hssf.usermodel.HSSFRichTextString;
import org.apache.poi.hssf.usermodel.HSSFRow;
import org.apache.poi.hssf.usermodel.HSSFSheet;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import org.apache.poi.hssf.util.HSSFColor;
//将sql文件中内容转为excel数据表
public class Sql_Excel {
// 要读取的数据类型,可以根据需求自己添加和修改
String type_list[] = { "numeric", "nvarchar", "datetime", "ntext",
"int", "bit", "decimal" };
// #################################################################
// 解析sql文本内容 --start
// 读取指定路径下文件
public String read_file(String source) {
StringBuilder buf = new StringBuilder();
BufferedReader bufferedReader;
try {
bufferedReader = new BufferedReader(new FileReader(source));
while (bufferedReader.ready()) {
buf.append(bufferedReader.readLine() + "\r\n");
}
bufferedReader.close();
} catch (FileNotFoundException e) {
e.printStackTrace();
System.out.println("文件路径错误");
} catch (IOException e) {
e.printStackTrace();
System.out.println("文件读取失败");
}
return buf.substring(0, buf.length() - 2);
}
// 根据每行内容逐行解析
public void read_analyze(String source) {
// 如果出现乱码则执行下面语句,转之前编码是指读取的文件编码内容,要转的编码是指你当前编译器的编码格式
/*
* try { source=new String(source.getBytes("转之前编码"), "要转的编码"); } catch
* (UnsupportedEncodingException e) { e.printStackTrace();
* System.out.println("编码格式转换失败"); }
*/
// 这个语句有一点问题,有的数据库区分大小写,如果区分就去掉toLowerCase
String ss[] = source.toLowerCase().split("\r\n");
core(ss, 0);
}
// 判断该行SQL中是否包含type_list数组中的类型
public String get_type(String str) {
for (String s : type_list)
if (str.indexOf(s) != -1)
return s;
return null;
}
// 解析内容-算法部分
public void core(String ss[], int start) {
List<String[]> list = new ArrayList<String[]>(); // 表内容
String tableName = ""; // 表名
String tableHeader[] = { "序号", "字段名", "字段意义", "字段类型", "是否主键", "外键关联",
"允许为空" };
for (int j = start; j < ss.length; j++) {
// 如果找到了创建该表的sql语句开头
int num = 1;
if (findOne(ss[j], "go")) {
for (int i = j; i < ss.length; i++) {
System.out.println(ss[i]);
// 序号,字段名,字段意义,字段类型,是否主键,外键关联,允许为空
String obj[] = new String[7];
// 确定表的中文名
if (ss[i].indexOf("--") == 0 && i >= 1
&& findOne(ss[i - 1], "go"))
tableName = ss[i].substring(2, ss[i].length())
.replaceAll(" ", "");
/*
* else if (ss[i + 2].indexOf("--") != -1) tableName = ss[i
* + 1].substring(2, ss[i].length()) .replaceAll(" ", "");
*/
// 判断表的英文名
if (ss[i].indexOf("create table ") != -1) {
tableName += "——"
+ ss[i].substring("create table ".length(),
ss[i].indexOf("(")).replaceAll(" ", "");
} else {
// 判断是否是主键
if (ss[i].indexOf("primary key") != -1) {
obj[4] = "主键";
obj[6] = "不允许";
}
// 判断是否是外键
else if (ss[i].indexOf("references") != -1) {
// System.out.println("index="+ss[i].lastIndexOf(")"
// ));
obj[5] = ss[i].substring(
ss[i].indexOf("references") + 10,
ss[i].lastIndexOf(")") + 1).replaceAll(" ",
"");
}
// 添加字段意义信息
if (ss[i].indexOf("--") != -1) {
obj[2] = ss[i].substring(ss[i].indexOf("--") + 2,
ss[i].length()).replaceAll(" ", "");
}
if (ss[i].indexOf("not null") != -1) {
obj[6] = "不允许";
}
// 判断字段类型( numeric , nvarchar , datetime , ntext )
if (get_type(ss[i]) != null) {
obj[0] = num++ + "";
obj[1] = ss[i].substring(0,
ss[i].indexOf(get_type(ss[i]))).replaceAll(
" ", "");
obj[3] = get_type(ss[i]);
}
// 判断数据是否符合条件,将符合条件的数据加入list中
if (obj != null && obj[1] != null
&& !"".equals(obj[1].replaceAll(" ", "")))
list.add(obj);
}
// 判断何时结束开始新一轮的查找
if (findOne(ss[i], ");")) {
// 将整理好的数据解析
if (tableName == null
|| "".equals(tableName.replaceAll(" ", ""))) {
tableName = "用户数据表";
}
// 写入到Excel中
ReadToExcel(list, tableName, tableHeader);
// 递归调用
core(ss, i);
// 结束当前function,防止内存溢出
return;
}
}
}
}
}
/**
* @Title: ReadToExcel
* @Description: 解析的数据转为Excel
* @author shany
* @date 2018年9月20日 下午2:36:05
*/
private void ReadToExcel(List<String[]> list, String tableName,
String[] tableHeader) {
// 数据导出
if (list != null && list.size() > 0) {
// test
System.out.println("tableName=" + tableName);
System.out.println("tableHeader=" + Arrays.toString(tableHeader));
System.out.println("list.size=" + list.size());
String sss[][] = new String[list.size()][7];
for (int i = 0; i < list.size(); i++) {
sss[i] = list.get(i);
}
// 文件名
String path ="F:/"+ tableName +"数据表.xls";
try {
exporteExcel(tableName, tableHeader, sss, new FileOutputStream(
path));
System.out.println("导出" + tableName + "成功");
} catch (FileNotFoundException e) {
System.out.println("导出" + tableName + "失败");
e.printStackTrace();
}
}
}
// 指定要保存的文件位置
// 该行是否包含指定内容
public boolean findOne(String source, String item) {
if (source == null || "".equals(source) || item == null
|| "".equals(item))
return false;
return source.indexOf(item) != -1;
}
// 解析sql文本内容 --end
// #################################################################
// list转为Excel导出 --start
/**
* 导出excel文件
*
* @param title
* 表sheet的名字
* @param headers
* 表头
* @param dataList
* 正文单元格
* @param out
* 输出流
*/
public void exporteExcel(String title, String[] headers,
String[][] dataList, OutputStream out) {
HSSFWorkbook workBook = new HSSFWorkbook();
createSheet(title, headers, dataList, workBook);
// createSheet(title + "2", headers, dataList, workBook);
try {
workBook.write(out);
} catch (IOException e) {
System.out.println("写入文件失败" + e.getMessage());
}
}
/**
* 创建sheet
*
* @param title
* sheet的名字
* @param headers
* 表头
* @param dataList
* 正文单元格
*/
private void createSheet(String title, String[] headers,
String[][] dataList, HSSFWorkbook workBook) {
HSSFSheet sheet = workBook.createSheet(title);
// sheet.setDefaultColumnWidth(15);
// 设置表头和普通单元格的格式
HSSFCellStyle headStyle = setHeaderStyle(workBook);
HSSFCellStyle bodyStyle = setBodyStyle(workBook);
createBody(dataList, sheet, bodyStyle);
createHeader(headers, sheet, headStyle);
}
/**
* 创建正文单元格
*
* @param dataList
* 数据数组
* @param sheet
* 表
* @param bodyStyle
* 单元格格式
*/
private void createBody(String[][] dataList, HSSFSheet sheet,
HSSFCellStyle bodyStyle) {
for (int a = 0; a < dataList.length; a++) {
HSSFRow row = sheet.createRow(a + 1);
for (int j = 0; j < dataList[a].length; j++) {
HSSFCell cell = row.createCell(j);
cell.setCellStyle(bodyStyle);
HSSFRichTextString textString = new HSSFRichTextString(
dataList[a][j]);
cell.setCellValue(textString);
}
}
}
/**
* 创建表头
*
* @param headers
* 表头
* @param sheet
* 表
* @param headStyle
* 表头格式
*/
private void createHeader(String[] headers, HSSFSheet sheet,
HSSFCellStyle headStyle) {
HSSFRow row = sheet.createRow(0);
for (int i = 0; i < headers.length; i++) {
HSSFCell cell = row.createCell(i);
cell.setCellStyle(headStyle);
HSSFRichTextString textString = new HSSFRichTextString(headers[i]);
cell.setCellValue(textString);
sheet.autoSizeColumn((short) i);
}
}
/**
* 设置正文单元格格式
*
* @param workBook
* @return
*/
private HSSFCellStyle setBodyStyle(HSSFWorkbook workBook) {
HSSFCellStyle style2 = workBook.createCellStyle();
style2.setFillForegroundColor(HSSFColor.WHITE.index);
style2.setFillPattern(HSSFCellStyle.SOLID_FOREGROUND);
style2.setBorderBottom(HSSFCellStyle.BORDER_THIN);
style2.setBorderLeft(HSSFCellStyle.BORDER_THIN);
style2.setBorderRight(HSSFCellStyle.BORDER_THIN);
style2.setBorderTop(HSSFCellStyle.BORDER_THIN);
style2.setAlignment(HSSFCellStyle.ALIGN_LEFT);
HSSFFont font2 = workBook.createFont();
font2.setFontName("微软雅黑");
font2.setBoldweight(HSSFFont.BOLDWEIGHT_NORMAL);
style2.setFont(font2);
return style2;
}
/**
* 设置表头格式
*
* @param workBook
* @return
*/
private HSSFCellStyle setHeaderStyle(HSSFWorkbook workBook) {
HSSFCellStyle style = workBook.createCellStyle();
style.setFillForegroundColor(HSSFColor.LIGHT_YELLOW.index);
style.setFillPattern(HSSFCellStyle.SOLID_FOREGROUND);
style.setBorderBottom(HSSFCellStyle.BORDER_THIN);
style.setBorderLeft(HSSFCellStyle.BORDER_THIN);
style.setBorderRight(HSSFCellStyle.BORDER_THIN);
style.setBorderTop(HSSFCellStyle.BORDER_THIN);
style.setAlignment(HSSFCellStyle.ALIGN_LEFT);
HSSFFont font = workBook.createFont();
font.setFontName("微软雅黑");
font.setFontHeightInPoints((short) 12);
font.setBoldweight(HSSFFont.BOLDWEIGHT_BOLD);
style.setFont(font);
return style;
}
// list转为Excel导出 --end
// #################################################################
// 直接调用次方法即可,传入目标文件路径
public void run(String source) {
String result = read_file(source);
read_analyze(result);
}
// 主函数
public static void main(String[] args) {
String source = "E:/aa.txt";
// Sql_Excel se= new Sql_Excel();
new Sql_Excel().run(source);
}
}
备注:因为前段时间做个SQL转为数据库结构表的,一直复制粘贴太累,所以写了一个Java脚本。对了,其中数据写到Excel是使用一位前辈实现好的function(重复造轮子不可取)
他的那篇博客链接:利用poi将数据写入到excel
一下是我推荐的SQL语句书写规范(sqlserver)
go
--aaa表
create table a_aas_a(
aaa numeric(20,0) IDENTITY PRIMARY KEY NOT NULL,--主键
aaa numeric(20,0) REFERENCES ORG_EMPLOYEE(EMP_ID) NOT NULL,--aaa
aaa numeric(10,1),--aaa
aaa ntext,--aaa
aaa numeric(20,0),--aaa
aaa numeric(10,0),--aaa
aaa nvarchar(200),--aaa
aaa numeric(10,0),--aaa
aaa nvarchar(200),--aaa
aaa ntext,--aaa
aaa ntext,--aaa
aaa datetime,--aaa
aaa numeric(5,0)--aaa
);
##############################################################################################
输出结果