package excel2sql;

 import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List; import org.apache.poi.hssf.usermodel.HSSFCell;
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.ss.usermodel.Row; public class Excel2Sql { private HSSFWorkbook workbook;// 工作簿 /**
* 构造器-获取工作簿
* @param file
*/
public Excel2Sql(File file) {
try {
// 获取工作薄workbook
workbook = new HSSFWorkbook(new FileInputStream(file));
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
} /**
* 获取sheet中所有数据
* @param sheetNumber
* @return
*/
private List<List<Object>> getSheetDatas(int sheetNumber) { //sheet中数据结果集
List<List<Object>> result = new ArrayList<List<Object>>(); // 获得指定的sheet
HSSFSheet sheet = workbook.getSheetAt(sheetNumber); // 获得sheet总行数
int rowCount = sheet.getLastRowNum(); if (rowCount < 1) {
return result;
} // 遍历行row
for (int rowIndex = 0; rowIndex <= rowCount; rowIndex++) {
// 获得行对象
HSSFRow row = sheet.getRow(rowIndex);
if (null != row) {
List<Object> rowData = new ArrayList<Object>();
// 获取对应行单元格总数
int cellCount = row.getLastCellNum();
// 遍历列cell
for (int cellIndex = 0; cellIndex < cellCount; cellIndex++) {
//Missing cells are returned as null, Blank cells are returned as normal
HSSFCell cell = row.getCell(cellIndex, Row.RETURN_NULL_AND_BLANK);
// 获得指定单元格中的数据
Object cellValue = this.getCellValue(cell); rowData.add(cellValue);
}
result.add(rowData);
}
} return result;
} /**
* 获取cell值
* @param cell
* @return
*/
private Object getCellValue(HSSFCell cell) {
Object result = null;
if (cell != null) {
// 单元格类型:Numeric:0;String:1;Formula:2;Blank:3;Boolean:4;Error:5
switch (cell.getCellType()) {
case HSSFCell.CELL_TYPE_NUMERIC:
result = cell.getNumericCellValue();
break;
case HSSFCell.CELL_TYPE_STRING:
result = cell.getStringCellValue();
break;
case HSSFCell.CELL_TYPE_FORMULA:
result = cell.getNumericCellValue();
break;
case HSSFCell.CELL_TYPE_BLANK:
result = null;
break;
case HSSFCell.CELL_TYPE_BOOLEAN:
result = cell.getBooleanCellValue();
break;
case HSSFCell.CELL_TYPE_ERROR:
result = null;
break;
}
}
return result;
} /**
* excel格式转换成建表脚本
* @param tableName 表名
* @param tableComment 表注释
* @return SQL 建库脚本
*/
public String excel2Sql(String tableName, String tableComment) {
//获取sheet数据
List<List<Object>> datas = this.getSheetDatas(0);
//主键
String primary = "";
//字段列
int column = 0;
//类型列
int type = 1;
//是否为空列
int cannull = 2;
//默认值列
int defaultValue = 3;
//是否主键
int pk = 4;
//注释列
int comment = 5;
//注释
StringBuffer comments = new StringBuffer();
//表名注释
comments.append("comment on table "+tableName+" is '"+tableComment+"';\n");
//建表SQL语句
StringBuffer sql = new StringBuffer();
sql.append("create table " + tableName + "(\n");
//前两行为说明
for (int i = 2; i < datas.size(); i++) {
//对应行数据
List<Object> row = datas.get(i);
//字段项 0
sql.append(String.valueOf(row.get(column)) + " ");
//类型 1
sql.append(String.valueOf(row.get(type)) + " ");
//默认值 3
if(null!=row.get(defaultValue)){
sql.append(" default " +row.get(defaultValue));
}
//是否为空 2
if("N".equalsIgnoreCase(String.valueOf(row.get(cannull)))){
sql.append(" not null");
}
if(i < datas.size() - 1){
sql.append(",");
}
//是否主键 4
if(null != row.get(pk) && "Y".equalsIgnoreCase(String.valueOf(row.get(pk)))){
//设置主键
primary = "alter table "+tableName+" add constraint PK_"+tableName+"_ID primary key (" + String.valueOf(row.get(column)) + ");";
}
//增加注释
comments.append("comment on column ").append(tableName).append(".").append(String.valueOf(row.get(column))).append(" is '"). append(String.valueOf(row.get(comment))).append("';\n");
sql.append("\n");
}
//结束
sql.append(");\n");
//添加注释
sql.append(comments);
//添加主键
sql.append(primary);
return sql.toString();
}
}

excel示例:

excel转换成oracle建表脚本的更多相关文章

  1. PowerDesigner生成的ORACLE 建表脚本中去掉对象的双引号,设置大、小写

    原文:PowerDesigner生成的ORACLE 建表脚本中去掉对象的双引号,设置大.小写 若要将 CDM 中将 Entity的标识符都设为指定的大小写,则可以这么设定: 打开cdm的情况下,进入T ...

  2. SQL SERVER 生成ORACLE建表脚本

    /****** Object: StoredProcedure [dbo].[GET_TableScript_ORACLE] Script Date: 06/15/2012 13:07:16 **** ...

  3. [转载]PowerDesigner生成的ORACLE 建表脚本中去掉对象的双引号,设置大、小写

    若要将 CDM 中将 Entity的标识符都设为指定的大小写,则可以这么设定: 打开cdm的情况下,进入Tools-Model Options-Naming Convention,把Name和Code ...

  4. Oracle建表脚本记录

    --删除 drop table dianfei; --创建表 create table dianfei ( uon ) not null, mmonth ) not null, ddf ,) not ...

  5. MyBatis项目实战 快速将MySQL转换成Oracle语句

    一.前言 因项目需求,小编要将项目从mysql迁移到oracle中 ~ 之前已经完成 数据迁移 (https://zhengqing.blog.csdn.net/article/details/103 ...

  6. 5.oracle建表的时候同时创建主键,外键,注释,约束,索引

    5.oracle建表的时候同时创建主键,外键,注释,约束,索引 1 --主键 )); ) ,constraint aba_pr primary key(id,name1)); --外键 )); --复 ...

  7. 生成建表脚本up_CreateTable

    已经很久没用使用这个脚本了,今天用到,并做修改,增加了生成扩展属性功能. Go if object_ID('[up_CreateTable]') is not null Drop Procedure ...

  8. oracle 建表时显示ORA-00984: 列在此处不允许

      oracle 建表时显示ORA-00984: 列在此处不允许 CreationTime--2018年7月19日16点10分 Author:Marydon 1.情景展示 使用plsql建表时,报错 ...

  9. oracle 建表时显示ORA-00904无效的标识符

      oracle 建表时显示ORA-00904无效的标识符 CreationTime--2018年7月19日16点03分 Author:Marydon 1.情景展示 使用plsql建表时,报错 字段展 ...

随机推荐

  1. 《深入理解java虚拟机》学习笔记四/垃圾收集器GC学习/一

    Grabage Collection      GC GC要完毕的三件事情: 哪些内存须要回收? 什么时候回收? 怎样回收? 内存运行时区域的各个部分中: 程序计数器.虚拟机栈.本地方法栈这3个区域随 ...

  2. HTTP (httpwebrequest)

    1.GET请求: public static string Get(string url) { string buffer = ""; try { HttpWebRequest r ...

  3. amazeui的表单开关插件的自定义事件必须添加.bootstrapSwitch 命名空间,给了我们什么启示

    amazeui的表单开关插件的自定义事件必须添加.bootstrapSwitch 命名空间,给了我们什么启示 一.总结 一句话总结:详细看使用文档(说明文档说的真的是非常详细呢,不过循序渐进,不同阶段 ...

  4. Filebeat之input和output(包含Elasticsearch Output 、Logstash Output、 Redis Output、 File Output和 Console Output)

    前提博客 https://i.cnblogs.com/posts?categoryid=972313 Filebeat啊,根据input来监控数据,根据output来使用数据!!! Filebeat的 ...

  5. JavaScript--模块化 JavaScript module designer

    module: 模块就是实现特定功能的一组方法.1.在首页的一个接口js;首先下载好require.js文件引入首页. <script src="require.js" da ...

  6. 决策树2 -- CART算法

    声明: 1,本篇为个人对<2012.李航.统计学习方法.pdf>的学习总结.不得用作商用,欢迎转载,但请注明出处(即:本帖地址). 2,因为本人在学习初始时有非常多数学知识都已忘记.所以为 ...

  7. 导出查询结果到csv文件

    set colsep ,   set feedback off   set heading off   set trimout on   spool my.csv  select * from emp ...

  8. Appium_Python_API

    1) find_element_by_android_uiautomator (‘new UiSelector().text(“XXXX”)’).click 正常匹配2) find_element_b ...

  9. robotframework Selenium2+RFS自动化测试

    支持浏览器版本:Google Chrome (64位) 52.0.2743.82 正式版 52.0.2743.6_chrome_installer 64位 下载地址:http://www.online ...

  10. opencv cvPreCornerDetect

    关于OpenCv中cvPreCornerDetect 运行出错解决方法 http://m.blog.csdn.net/blog/wode0239 由于书本上示例的不全,相信大家在做的时候,肯定是无从下 ...