`
smilease
  • 浏览: 88819 次
  • 性别: Icon_minigender_1
  • 来自: 苏州
社区版块
存档分类
最新评论

Java POI读取excel,自动生成代码

 
阅读更多

本文是介绍通过读取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);
		}
	}
}
 
分享到:
评论

相关推荐

    Java通过POI读取Excel遍历数据,批量生成word文档

    本教程将重点讲解如何使用Apache POI库来读取Excel数据,并基于这些数据批量生成Word文档。Apache POI是一个开源项目,它允许Java开发者处理Microsoft Office格式的文件,如Excel(.xlsx或.xls)和Word(.docx)。 ...

    java的poi生成excel图表demo

    在Java中,它允许开发者创建、修改和读取Excel工作簿、工作表以及单元格的数据。POI库不仅支持基本的文本和数字操作,还支持更高级的功能,如公式计算、样式设置和图表创建。 2. **创建Excel图表** 要生成Excel图表...

    java poi处理excel数据

    通过以上知识点的学习和实践,你将能够熟练地利用Java POI进行Excel数据的处理,无论是数据导入导出、报表生成还是数据分析,都将变得游刃有余。记得在使用过程中,不断查阅文档、参考示例,结合实际项目进行练习,...

    POI读取excel的内容.zip

    在Java编程领域,Apache POI库是一个非常重要的工具,它允许开发者处理...通过学习和理解`ReadExcelUtils.java`中的代码,开发者可以轻松地读取Excel文件的各个单元格内容,进而进行数据分析、报表生成等操作。

    java POI读取Excel文件基本用法Demo

    在本示例"Java POI读取Excel文件基本用法Demo"中,我们将深入探讨如何使用Java POI库来读取Excel文件。 首先,我们需要在项目中引入Apache POI的依赖。对于Maven项目,可以在pom.xml文件中添加以下依赖: ```xml ...

    Java POI根据模板生成Excel(xlsx)文件

    在本示例中,我们关注的是如何利用Java POI来根据模板生成.xlsx格式的Excel文件。这个过程涉及到对Excel模板的理解、读取、修改以及最终的保存。 首先,理解模板文件是关键。一个.xlsx模板文件实际上是由一系列XML...

    JAVA读取Excel,建库建表,并生成java实体

    总结,Java读取Excel并进行数据库建库建表及生成Java实体的过程涉及了Apache POI库的使用、数据库操作和源代码生成。理解这些步骤可以帮助你有效地处理类似的任务,提高开发效率。在实际应用中,你还需要考虑错误...

    POI生成Excel POI操作Excel POI读取Excel POI类库

    **POI读取Excel** 读取Excel主要涉及以下步骤: 1. **打开Workbook**:通过 FileInputStream 读取Excel文件,然后创建Workbook对象。 2. **获取Sheet**:从Workbook中获取需要的Sheet。 3. **遍历Row和Cell**:...

    poi读取excel并输出到jsp页面

    标题中的“poi读取excel并输出到jsp页面”是指使用Apache POI库来处理Microsoft Excel文件,并将数据在JavaServer Pages (JSP) 页面上显示的技术。Apache POI 是一个开源项目,它允许开发者创建、修改和显示MS ...

    poi读取excel文件实例(兼容excel2007)

    在“poi读取excel文件实例.docx”文档中,应该包含了一个实际的Java代码示例,演示了上述步骤的完整流程。通过运行这个示例,你可以理解如何使用Apache POI库来读取Excel 2007文件,并从中提取数据。这不仅适用于...

    java读取excel文件生成矩阵

    在Java编程中,读取Excel文件并生成矩阵是一项常见的任务,尤其在数据分析、报表处理或者数据导入导出的场景下。Excel文件通常用于存储结构化的表格数据,而矩阵则是一种有效的数据表示方式,便于计算和分析。下面...

    android POI 读取excel 精简jar

    在Android平台上,使用Apache POI库来读取Excel文件是一种常见的解决方案。Apache POI是一个流行的开源项目,它允许程序员创建、修改和显示Microsoft Office格式的文件,包括Excel(.xls和.xlsx)。在这个“android ...

    JAVA poi 做EXCEL导出(包含图片) 完整版

    在Java编程环境中,Apache POI库是一个非常实用的工具,用于读取、写入和修改Microsoft Office格式的文件,特别是Excel(.xlsx 和 .xls)文件。本教程将详细介绍如何使用JAVA POI库来创建一个包含图片的完整Excel...

    poi读取Excel用到的jar包

    标题提到的“poi读取Excel用到的jar包”指的是在Java项目中使用POI库进行Excel操作所需引入的依赖文件。这些jar包在描述中给出,包括了以下几个: 1. poi-ooxml-schemas-3.8-beta5-20111217.jar:这个文件包含了...

    利用POI解析excel并存入数据库demo

    在上述代码中,我们首先打开 Excel 文件,然后遍历每一行数据(跳过表头),并将每个单元格的值转换为对应的 Java 类型。接着,我们通过预编译的 SQL 语句将数据插入到数据库中。为了提高效率,建议使用批处理操作,...

    Java用poi读取excel文件.pdf

    Java 使用 Apache POI 读取 Excel 文件是一种常见的数据处理任务,尤其在数据分析、报表生成以及自动化测试等场景中。Apache POI 是一个流行的开源库,它允许开发者在 Java 应用程序中创建、修改和显示 Microsoft ...

    java实现poi模板生成PPT文件代码

    Java中的Apache POI库是一个强大的工具,用于读取、创建和修改Microsoft Office格式的文件,包括PPT(PowerPoint)文档。在这个项目中,我们将会探讨如何使用POI API来生成PPT文件,特别是通过模板的方式。以下是...

    POI操作Excel完美生成水印

    在Java编程领域,Apache POI 是一个非常流行的库,它允许开发者读取、写入和修改Microsoft Office格式的文件,包括Excel(XLS和XLSX)。本教程将深入探讨如何利用Apache POI来在Excel文件中完美地生成水印。水印通常...

    poi 操作excel模板

    在Java开发中,POI库被广泛用于生成、修改和读取Excel文档。本篇将深入探讨如何利用Apache POI来操作Excel模板,以及如何读取数据并将其填充到新生成的文件中,最终提供下载。 首先,你需要在项目中引入Apache POI...

    Java POI 导出Excel 2007 实例源代码

    Java POI 是一个开源库...以上就是使用Java POI导出Excel 2007的实例源代码所涉及的主要知识点。通过这些步骤,开发者可以轻松地在Java程序中生成符合需求的Excel文件。在实际项目中,可以根据具体需求进行扩展和优化。

Global site tag (gtag.js) - Google Analytics