本文是介绍通过读取Excel格式的数据字典,生成sql脚本的工具类,目前涉及到的读取方法,特别是行和列的属性还是硬编码,是针对我们现有的数据字典的格式的,如果数据字典的格式发生了变动,相关代码也要做相应改动。
所用的Excel版本为2007,后缀是.xlsx,生成的sql脚本是针对Mysql数据库的
1、读取Excel的工具类
package allan.dbUtil;
import java.util.HashMap;
import java.util.Map;
import org.apache.poi.xssf.usermodel.XSSFCell;
import org.apache.poi.xssf.usermodel.XSSFHyperlink;
import org.apache.poi.xssf.usermodel.XSSFRow;
import org.apache.poi.xssf.usermodel.XSSFSheet;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;
public class ReadExcelUtil{
@SuppressWarnings("static-access")
public static String getValue(XSSFCell xssfCell) {
if(xssfCell!=null){
if (xssfCell.getCellType() == xssfCell.CELL_TYPE_BOOLEAN) {
return String.valueOf(xssfCell.getBooleanCellValue());
} else if (xssfCell.getCellType() == xssfCell.CELL_TYPE_NUMERIC) {
return String.valueOf(xssfCell.getNumericCellValue());
} else {
return String.valueOf(xssfCell.getStringCellValue());
}
}
return "";
}
public static Table getTabelModel(XSSFWorkbook xssfWorkbook,int numSheet,Map<String,String> sheetMap){
return new Table(getTableName(xssfWorkbook, numSheet), getColumns(xssfWorkbook, numSheet,sheetMap));
}
public static String getTableName(XSSFWorkbook xssfWorkbook,int numSheet){
XSSFSheet xssfSheet = xssfWorkbook.getSheetAt(numSheet);
//获取指定单元格的值 begin
XSSFRow xssfRow = xssfSheet.getRow(1);
XSSFCell xssfCell1 = xssfRow.getCell(0);
String text=getValue(xssfCell1);
//获取指定单元格的值 end
return text;
}
public static Column[] getColumns(XSSFWorkbook xssfWorkbook,int numSheet,Map<String,String> sheetMap){
//for (int numSheet = 2; numSheet < xssfWorkbook.getNumberOfSheets(); numSheet++) {
XSSFSheet xssfSheet = xssfWorkbook.getSheetAt(numSheet);
xssfSheet.getSheetName();
int lastRowNum=xssfSheet.getLastRowNum();
Column[] columns=new Column[lastRowNum-3];
XSSFHyperlink link=null;
// 循环行Row,从第四行开始
for (int rowNum = 4; rowNum <= lastRowNum; rowNum++) {
XSSFRow xssfRow = xssfSheet.getRow(rowNum);
if (xssfRow == null) {
continue;
}
//获得字段描述
String columnDesc =getValue(xssfRow.getCell(0));
//获得字段名
String columnName = getValue(xssfRow.getCell(1));
//获得字段类型
String columnType = getValue(xssfRow.getCell(2));
//获得字段长度
String columnLength =getValue(xssfRow.getCell(3));
//获得小数长度
String decimalLength=getValue(xssfRow.getCell(4));
//是否必填
String isNotNull =getValue(xssfRow.getCell(5));
//是否主键 暂时无用
String isPrimary =getValue(xssfRow.getCell(6));
//是否外键
String isForeign =getValue(xssfRow.getCell(7));
if(isForeign!=null&&!isForeign.equals("")){
link=xssfRow.getCell(7).getHyperlink();
String[] s=link.getLocation().split("!");
int foreignNumSheet=Integer.parseInt(sheetMap.get(s[0]));
XSSFSheet foreignSheet = xssfWorkbook.getSheetAt(foreignNumSheet);
String foreignTableName=getTableName(xssfWorkbook,foreignNumSheet);
int index=Integer.parseInt(s[1].substring(1));
String foreignColumnName=getValue(foreignSheet.getRow(index-1).getCell(1));
String foreignColumnType=getValue(foreignSheet.getRow(index-1).getCell(2));
String foreignColumnLength=getValue(foreignSheet.getRow(index-1).getCell(3));
String foreignColumnDecimalLength=getValue(foreignSheet.getRow(index-1).getCell(4));
isForeign=foreignTableName+","+foreignColumnName+","
+foreignColumnType+","+foreignColumnLength
+","+foreignColumnDecimalLength;
}
columns[rowNum-4]=new Column(columnName, columnType, columnLength,
decimalLength,isNotNull, columnDesc, isPrimary, isForeign);
}
return columns;
}
//将sheet的名字和序号放入map中保存,用于解析外键,因其是以链接形式存在的
public static Map<String,String> getSheetMap(XSSFWorkbook xssfWorkbook){
Map<String,String> sheetMap=new HashMap<String,String>();
XSSFSheet xssfSheet;
for (int numSheet = 2; numSheet < xssfWorkbook.getNumberOfSheets(); numSheet++) {
xssfSheet = xssfWorkbook.getSheetAt(numSheet);
sheetMap.put(xssfSheet.getSheetName(), String.valueOf(numSheet));
}
return sheetMap;
}
}
2、用于生成sql脚本的工具类
package allan.dbUtil;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
import java.util.UUID;
public class WriteUtil {
public static void generateJavaHead(String fileName){
File f = new File("D:\\codeGeneration\\"+fileName+".java");
StringBuffer sb=new StringBuffer("package com.amaxgs.epp.model\n");
sb.append("public class "+fileName+"{\n");
try {
BufferedWriter output = new BufferedWriter(new FileWriter(f));
output.write(sb.toString());
output.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
public static void generateSqlFile(Table tableModel){
String fileName="D:\\codeGeneration\\createTable.sql";
String tableName=tableModel.getName();
StringBuffer sb=new StringBuffer("DROP TABLE IF EXISTS "+tableName+";\n");
sb.append("CREATE TABLE "+tableName+" (\n");
writeFile(fileName,sb.toString(),true);
//添加字段信息
Column[] columns=tableModel.getColumns();
for(Column column:columns){
String content="";
if(column!=null){
//如果不是外键
if(column.getIsForeign().equals("")){
content=column.getName()+" "+column.getType();
if(!column.getLength().equals("")){
content+="("+replaceZeroSuffix(column.getLength());
if(!column.getDecimalLength().equals("")){
content+=","+replaceZeroSuffix(column.getDecimalLength());
}
content+=")"+replaceNull(column.getIsNotNull())+",\n";
}else{
content+=",\n";
}
}else{
//如果字段是外键,那么它的类型,长度等信息从外键所在表里取得
String[] s=column.getIsForeign().split(",");
String type=s[2];
String length="";
String decimalLength="";
if(s.length==5){
decimalLength=s[4];
length=s[3];
}else if(s.length==4){
length=s[3];
}
if(!length.equals("")){
content=column.getName()+" "+type
+"("+replaceZeroSuffix(length);
if(!decimalLength.equals("")){
content+=","+replaceZeroSuffix(decimalLength);
}
content+=")"+replaceNull(column.getIsNotNull())+",\n";
}else{
content+=",\n";
}
}
writeFile(fileName,content,true);
}
}
//添加主键信息
writeFile(fileName, "PRIMARY KEY (id)", true);
//添加外键信息
for(Column column:columns){
String s=column.getIsForeign();
if(!s.equals("")){
String fk=("FK"+UUID.randomUUID().toString()).replace("-", "");
String columnName=column.getName();
String[] fs=s.split(",");
writeFile(fileName,",\nKEY "+fk+ " ("+columnName+"),\n" +
"CONSTRAINT "+fk+" FOREIGN KEY ("
+columnName+") REFERENCES "
+fs[0]+" ("+fs[1]+")",true);
}
}
//添加编码信息
writeFile(fileName,"\n) ENGINE=InnoDB DEFAULT CHARSET=utf8 \n\n\n",true);
}
//用于初版的数据字典,后来字段类型直接用数据库中的名称表示了,就用不到这个方法了
public static String replaceColumnType(String originType){
String type="";
if(originType.equals("字符型")||originType.equals("布尔型")){
type="varchar";
}else if(originType.equals("数值型")){
type="int";
}
return type;
}
//去掉数值类型后面的".0",excel中的数字比如36,读出来是36.0
public static String replaceZeroSuffix(String originString){
return originString.replace(".0", "");
}
//转换是否为空
public static String replaceNull(String originString){
String s="";
if(originString.equals("是")){
s=" NOT NULL ";
}else{
s=" DEFAULT NULL ";
}
return s;
}
//新建或追加文件:使用FileWriter
public static void writeFile(String fileName, String content,boolean append) {
try {
//打开一个写文件器,构造函数中的第二个参数true表示以追加形式写文件
BufferedWriter output = new BufferedWriter(new FileWriter(fileName,append));
output.write(content);
output.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
3、用于封装数据表信息的模型类
package allan.dbUtil;
public class Table {
private String name;
private Column[] columns;
public Table(String name, Column[] columns) {
super();
this.name = name;
this.columns = columns;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Column[] getColumns() {
return columns;
}
public void setColumns(Column[] columns) {
this.columns = columns;
}
}
4、用于封装字段信息的模型类
package allan.dbUtil;
/**
*
* @author Allan
* 用于封装字段数据的类
*/
public class Column {
public Column(String name, String type, String length,
String decimalLength, String isNotNull, String desc,
String isPrimary, String isForeign) {
super();
this.name = name;
this.type = type;
this.length = length;
this.decimalLength = decimalLength;
this.isNotNull = isNotNull;
this.desc = desc;
this.isPrimary = isPrimary;
this.isForeign = isForeign;
}
//字段名称
private String name;
//字段类型
private String type;
//字段长度
private String length;
//小数长度
private String decimalLength;
//是否为空,1是,0否
private String isNotNull;
//字段描述
private String desc;
//是否主键,1是,0否
private String isPrimary;
//是否外键,1是,0否
private String isForeign;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getType() {
return type;
}
public void setType(String type) {
this.type = type;
}
public String getLength() {
return length;
}
public void setLength(String length) {
this.length = length;
}
public String getDecimalLength() {
return decimalLength;
}
public void setDecimalLength(String decimalLength) {
this.decimalLength = decimalLength;
}
public String getIsNotNull() {
return isNotNull;
}
public void setIsNotNull(String isNotNull) {
this.isNotNull = isNotNull;
}
public String getDesc() {
return desc;
}
public void setDesc(String desc) {
this.desc = desc;
}
public String getIsPrimary() {
return isPrimary;
}
public void setIsPrimary(String isPrimary) {
this.isPrimary = isPrimary;
}
public String getIsForeign() {
return isForeign;
}
public void setIsForeign(String isForeign) {
this.isForeign = isForeign;
}
}
5、包含main方法的主类
package allan.dbUtil;
import java.io.IOException;
import java.util.Map;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;
public class CodeGeneration {
public static void main(String[] args) throws IOException{
String fileName = "D:\\codeGeneration\\newEpp.xlsx";
XSSFWorkbook xssfWorkbook = new XSSFWorkbook(fileName);
Map<String,String> sheetMap=ReadExcelUtil.getSheetMap(xssfWorkbook);
for (int numSheet = 2; numSheet < xssfWorkbook.getNumberOfSheets(); numSheet++) {
String name=ReadExcelUtil.getTableName(xssfWorkbook, numSheet);
//取得下划线分割的字符串数组
String[] nameArr=name.split("_");
//将首字母替换为大写,并保存为新的文件名
String newName="";
for(int i=0;i<nameArr.length;i++){
newName+=nameArr[i].replace(nameArr[i].charAt(0), Character.toUpperCase(nameArr[i].charAt(0)));
}
Table tableModel=ReadExcelUtil.getTabelModel(xssfWorkbook, numSheet,sheetMap);
WriteUtil.generateSqlFile(tableModel);
//WriteUtil.generateJavaHead(newName);
}
}
}
分享到:
相关推荐
本教程将重点讲解如何使用Apache POI库来读取Excel数据,并基于这些数据批量生成Word文档。Apache POI是一个开源项目,它允许Java开发者处理Microsoft Office格式的文件,如Excel(.xlsx或.xls)和Word(.docx)。 ...
在Java中,它允许开发者创建、修改和读取Excel工作簿、工作表以及单元格的数据。POI库不仅支持基本的文本和数字操作,还支持更高级的功能,如公式计算、样式设置和图表创建。 2. **创建Excel图表** 要生成Excel图表...
通过以上知识点的学习和实践,你将能够熟练地利用Java POI进行Excel数据的处理,无论是数据导入导出、报表生成还是数据分析,都将变得游刃有余。记得在使用过程中,不断查阅文档、参考示例,结合实际项目进行练习,...
在Java编程领域,Apache POI库是一个非常重要的工具,它允许开发者处理...通过学习和理解`ReadExcelUtils.java`中的代码,开发者可以轻松地读取Excel文件的各个单元格内容,进而进行数据分析、报表生成等操作。
在本示例"Java POI读取Excel文件基本用法Demo"中,我们将深入探讨如何使用Java POI库来读取Excel文件。 首先,我们需要在项目中引入Apache POI的依赖。对于Maven项目,可以在pom.xml文件中添加以下依赖: ```xml ...
在本示例中,我们关注的是如何利用Java POI来根据模板生成.xlsx格式的Excel文件。这个过程涉及到对Excel模板的理解、读取、修改以及最终的保存。 首先,理解模板文件是关键。一个.xlsx模板文件实际上是由一系列XML...
总结,Java读取Excel并进行数据库建库建表及生成Java实体的过程涉及了Apache POI库的使用、数据库操作和源代码生成。理解这些步骤可以帮助你有效地处理类似的任务,提高开发效率。在实际应用中,你还需要考虑错误...
**POI读取Excel** 读取Excel主要涉及以下步骤: 1. **打开Workbook**:通过 FileInputStream 读取Excel文件,然后创建Workbook对象。 2. **获取Sheet**:从Workbook中获取需要的Sheet。 3. **遍历Row和Cell**:...
标题中的“poi读取excel并输出到jsp页面”是指使用Apache POI库来处理Microsoft Excel文件,并将数据在JavaServer Pages (JSP) 页面上显示的技术。Apache POI 是一个开源项目,它允许开发者创建、修改和显示MS ...
在“poi读取excel文件实例.docx”文档中,应该包含了一个实际的Java代码示例,演示了上述步骤的完整流程。通过运行这个示例,你可以理解如何使用Apache POI库来读取Excel 2007文件,并从中提取数据。这不仅适用于...
在Java编程中,读取Excel文件并生成矩阵是一项常见的任务,尤其在数据分析、报表处理或者数据导入导出的场景下。Excel文件通常用于存储结构化的表格数据,而矩阵则是一种有效的数据表示方式,便于计算和分析。下面...
在Android平台上,使用Apache POI库来读取Excel文件是一种常见的解决方案。Apache POI是一个流行的开源项目,它允许程序员创建、修改和显示Microsoft Office格式的文件,包括Excel(.xls和.xlsx)。在这个“android ...
在Java编程环境中,Apache POI库是一个非常实用的工具,用于读取、写入和修改Microsoft Office格式的文件,特别是Excel(.xlsx 和 .xls)文件。本教程将详细介绍如何使用JAVA POI库来创建一个包含图片的完整Excel...
标题提到的“poi读取Excel用到的jar包”指的是在Java项目中使用POI库进行Excel操作所需引入的依赖文件。这些jar包在描述中给出,包括了以下几个: 1. poi-ooxml-schemas-3.8-beta5-20111217.jar:这个文件包含了...
在上述代码中,我们首先打开 Excel 文件,然后遍历每一行数据(跳过表头),并将每个单元格的值转换为对应的 Java 类型。接着,我们通过预编译的 SQL 语句将数据插入到数据库中。为了提高效率,建议使用批处理操作,...
Java 使用 Apache POI 读取 Excel 文件是一种常见的数据处理任务,尤其在数据分析、报表生成以及自动化测试等场景中。Apache POI 是一个流行的开源库,它允许开发者在 Java 应用程序中创建、修改和显示 Microsoft ...
Java中的Apache POI库是一个强大的工具,用于读取、创建和修改Microsoft Office格式的文件,包括PPT(PowerPoint)文档。在这个项目中,我们将会探讨如何使用POI API来生成PPT文件,特别是通过模板的方式。以下是...
在Java编程领域,Apache POI 是一个非常流行的库,它允许开发者读取、写入和修改Microsoft Office格式的文件,包括Excel(XLS和XLSX)。本教程将深入探讨如何利用Apache POI来在Excel文件中完美地生成水印。水印通常...
在Java开发中,POI库被广泛用于生成、修改和读取Excel文档。本篇将深入探讨如何利用Apache POI来操作Excel模板,以及如何读取数据并将其填充到新生成的文件中,最终提供下载。 首先,你需要在项目中引入Apache POI...
Java POI 是一个开源库...以上就是使用Java POI导出Excel 2007的实例源代码所涉及的主要知识点。通过这些步骤,开发者可以轻松地在Java程序中生成符合需求的Excel文件。在实际项目中,可以根据具体需求进行扩展和优化。