Java将SQL转为数据结构表(办公用)

/**
 * @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 
);

##############################################################################################

输出结果

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值