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. Web前端开发实战4:导航菜单(一)

    在前面的博文中我们提到横向一级菜单,这里我们来看看导航菜单. 导航菜单种类非常多,可是制作原理都是大同 小异的.这里看的比二级下拉式菜单还简单. 来看一些站点上的导航菜单: 垂直导航菜单: 水平导航菜 ...

  2. IAR for STM8介绍、下载、安装与注册--转

    Ⅰ.写在前面 本文讲述的内容是IAR for STM8的介绍.下载.安装与注册,其安装.注册过程和IAR for ARM类似,如果需要了解IAR for ARM相关的文章,可以到我博客,或微信公众号查 ...

  3. wps如何输入连续的长破折号

    最近在写论文, 想输入破折号,结果是— — 这个破折号中间是有缝隙的, 如何变成没有缝隙. 第一步,选中: 第二步,右击选择字体 第三步,放大(只加一个破折号,然后放大到200%) 不知道有没有人,像 ...

  4. 洛谷 P2374 搬运工

    P2374 搬运工 题目背景 陈老师喜欢网购书籍,经常一次购它个百八十本,然后拿来倒卖牟取暴利.(ps:描述要看懂) 题目描述 前些天,高一的新同学来了,他便像往常一样兜售他的书,经过一番口舌,同学们 ...

  5. actionbar spinner-用法实例

    今天需要更改一个actionbar上的spinner的字体颜色,结果试了好长时间都没有解决,最后才发现,原来他是在代码下增加的一个textview,然后使用adapter加载的,并不是直接用frame ...

  6. 自己在linux上编译、链接、动态库和静态库的学习笔记

    在平常的项目中,我们都是使用公司要求的makefile.makedebug一类的文件,因此,在编译.链接.生成和链接动态库与静态库的时候,我们只是简单的使用一些已经设置的变量,只是简单的修改.添加一些 ...

  7. ASP.NET路径解惑

    对于ASP.NET的路径问题,一直都是云里雾里,没有去详细的理解,今天正好可以梳理一下它们之间的关系和使用方法.而若想明白路径的表示方式的使用方法和区别以及注意事项可以通过下面的几个概念来进一步加深: ...

  8. python投票统计程序,统计序列中各个数值的份数,字典的应用。

    这里可能会用到字典的知识, 字典主要是用来存储最后的统计结果. 字典的用法:http://www.runoob.com/python/python-dictionary.html https://ww ...

  9. JS学习笔记 - fgm练习 - 数字自增 定时器 数字比大小Math.max

    <script> window.onload = function(){ var oP = document.getElementsByTagName('p')[0]; var i = 0 ...

  10. [JSOI2009]计数问题

    一个n*m的方格,初始时每个格子有一个整数权值.接下来每次有2种操作: 改变一个格子的权值: 求一个子矩阵中某种特定权值出现的个数. 输入输出格式 输入格式: 第一行有两个数N,M. 接下来N行,每行 ...