Java 根据固定格式的Excel生成实体类

/**
 * Excel文档转对象
 *
 * @author dxm
 *
 */
public class ExcelToObject {

	/**
	 * 转换
	 *
	 * @param file
	 */
	public static void convert(File file, String savePath, String pack) {

		// Excel是否存在
		if (null == file || !file.exists()) {
			return;
		}

		// 创建存放路径目录
		File save = new File(savePath);
		if (!save.exists()) {
			save.mkdirs();
		}

		try {

			// Excel文件名
			String fileName = file.getName();

			// 建立输入流
			InputStream input = new FileInputStream(file);
			Workbook wb = null;

			// 根据文件格式(2003或者2007)来初始化
			if (fileName.endsWith("xlsx")) {
				wb = new XSSFWorkbook(input);
			} else {
				wb = (Workbook) new HSSFWorkbook(input);
			}

			// 获得第一个表单
			Sheet sheet = wb.getSheetAt(0);

			// 文件输出流
			FileOutputStream fos = null;

			// 获得第一个表单的迭代器
			Iterator<Row> rows = sheet.rowIterator();

			// 插入语句
			List<String> typeList = new ArrayList<String>();
			List<String> nameList = new ArrayList<String>();
			StringBuffer sb = new StringBuffer();

			// 包名
			pack = "package " + pack + ";\n\n";

			// 获得第一个表单的迭代器
			while (rows.hasNext()) {

				// 获得行数据
				Row row = rows.next();

				// 列0,1,2表示属性名,类型,说明
				Cell cell0 = row.getCell(0);
				Cell cell1 = row.getCell(1);
				Cell cell2 = row.getCell(2);
				String name = cell0.getStringCellValue().trim();
				String type = cell1.getStringCellValue().trim();
				String mark = cell2.getStringCellValue().trim();

				// 过滤空数据
				if (name.isEmpty()) {
					continue;
				}

				// 过滤说明
				if (name.equals("字段")) {
					continue;
				}

				// 新表开始
				int index = type.indexOf("t_");
				if (-1 != index) {

					// 写入上个类文件
					if (null != fos) {
						getSet(typeList, nameList, sb);
						fos.write(sb.toString().getBytes("UTF-8"));
						fos.close();
						typeList.clear();
						nameList.clear();
						sb = new StringBuffer();
					}

					// 类首字母大写
					type = type.substring(index + 2);
					String c = String.valueOf(type.charAt(0));
					c = c.toUpperCase();
					type = c + type.substring(1);

					// 删除旧的类文件
					File f = new File(savePath + "/" + type + ".java");
					if (f.exists()) {
						f.delete();
					}

					// 创建文件输出流
					fos = new FileOutputStream(f);

					// 拼接输出语句
					sb.append(pack);
					sb.append("/**\n * ");
					sb.append(name);
					sb.append("\n * \n * @author juling\n *\n */\n");
					sb.append("public class ");
					sb.append(type);

					// 拼接继承类
					if (!mark.isEmpty()) {
						sb.append(" extends ");
						sb.append(mark);
						sb.append(" {\n");
						sb.append("\tprivate static final long serialVersionUID = -1L;\n");
						if (mark.equals("VData")) {
							sb.insert(pack.length(), "import com.mohe.common.db.VData;\n\n");
						}
					} else {
						sb.append(" {\n");
					}

					continue;
				}

				// 拼接输出语句
				sb.append("\n");
				sb.append("\t// ");
				sb.append(mark);
				sb.append("\n");
				sb.append("\tpublic ");
				sb.append(type);
				sb.append(" ");
				sb.append(name);
				sb.append(";\n");

				// 如果为时间类型插入导入java.util.Date包
				if (type.equals("Date")) {
					sb.insert(pack.length(), "import java.util.Date;\n\n");
				}

				typeList.add(type);
				nameList.add(name);
			}

			// 写入最后一个类文件
			if (null != fos) {
				getSet(typeList, nameList, sb);
				fos.write(sb.toString().getBytes("UTF-8"));
				fos.close();
				typeList.clear();
				nameList.clear();
				sb = new StringBuffer();
			}

		} catch (IOException ex) {
			ex.printStackTrace();
		}
	}

	/**
	 * 填充Get,Set方法
	 */
	private static void getSet(List<String> typeList, List<String> nameList, StringBuffer sb) {

		for (int i = 0; i < typeList.size(); i++) {

			// 属性类型和名称
			String type = typeList.get(i);
			String name = nameList.get(i);

			// GET,SET方法首字母大写
			String c = String.valueOf(name.charAt(0));
			c = c.toUpperCase();
			String n = c + name.substring(1);

			// 拼接输出语句
			sb.append("\n\tpublic ");
			sb.append(type);
			sb.append(" get");
			sb.append(n);
			sb.append("() {");
			sb.append("\n\t\treturn ");
			sb.append(name);
			sb.append(";\n\t}\n");
			sb.append("\n\tpublic void set");
			sb.append(n);
			sb.append("(");
			sb.append(type);
			sb.append(" ");
			sb.append(name);
			sb.append(") {");
			sb.append("\n\t\tthis.");
			sb.append(name);
			sb.append(" = ");
			sb.append(name);
			sb.append(";\n\t}\n");
		}

		sb.append("\n}");
	}

	public static void main(String[] args) throws InterruptedException {

		String app = System.getProperty("user.dir");
		String modelPath = app + "*";
		ExcelToObject.convert(new File(“*”), modelPath, "*");
		ObjectToMapping.convert(new File(modelPath), app + "*", "timeKey", true);
	}
}

时间: 2024-11-05 22:39:31

Java 根据固定格式的Excel生成实体类的相关文章

将Excel生成实体类

package com.excel.test; import java.util.List; public class createUtil { public static String appendPrivate(List<String> types,List<String> attributes,List<String> mark){ StringBuffer sb = new StringBuffer(); if(types.size()==attributes.

如何通过java反射将数据库表生成实体类?

首先有几点声明: 1.代码是在别人的基础进行改写的: 2.大家有什么改进的意见可以告诉我,也可以自己改好共享给其他人: 3.刚刚毕业,水平有限,肯定有许多不足之处: 4.希望刚刚学习java的同学能有所启发. //这个是做转换的类,里面的DB只是封装了数据库的连接,大家可以用自己的,随意 package com.tt.util.gen.entity.tool; import java.io.File;import java.io.FileWriter;import java.io.IOExcep

java利用poi包 为excel生成超链接

转载自:http://www.blogjava.net/leekiang/archive/2008/10/21/235794.html 1,一个需求, 要求报表生成的Excel表格支持超链接.例如点击Excel内的公司名, 自动打开浏览器并连到该公司的网站上去.在Excel里面选中所需的单元格, 右键弹出属性, 选超链接就能输入相应的地址了,既然Excel支持超链接.那就没有什么借口说不能实现了.:). 翻了翻POI的文档, 很容易就找到了解决方案.在POI中让单元格实现超链接功能, 可以用Hy

java生成实体类的工具内部是如何实现的(mysql)

一.认识INFORMATION_SCHEMA数据库 INFORMATION_SCHEMA数据库提供了访问数据库元数据(数据的数据)的方式 该数据库中存放有数据库名.表名,列名.列的数据类型等各种数据 生成实体类就要从该数据库下手 二.显示所有的数据库 生成实体类,往往要先选择数据库,这个非常简单,只需要简单的一句sql即可获得所有的数据库 show databases; 三.利用TABLES表获取数据库中的表 下一步,要显示所选数据库的所有的表,这里就用到了前面所提的INFORMATION_SC

MyEclipse从数据库反向生成实体类之Hibernate方式 反向工程

步骤大致如下: 第一步: window-->open Perspective-->MyEclipse Java Persistence 操作后会出现一个视图DB Brower:MyEclipse Derby 在空白区点击右键,新建一个数据库对象.我用的是mysql,其实我一直想用oracle之类的,只是机子内存小,又懒得倒腾别的,结果截个图吧: 左边的属性按照自己使用的数据库填就行了,左边部分是我建好以后的结果,数据库名叫mydb,有个customer表 是专门这次测试用的 第二步: 新建一个

Mybatis自动生成实体类和实体映射工具

Mybatis Mysql生成实体类 用到的Lib包: mybatis-generator-core-1.3.2.jarmysql-connector-java-5.1.30.jar 1. 创建一个文件generator.properties, 主要用于配置相关路径和数据库信息. #工程src路径 project = D:/project/ #工程存放mapper.xml路径 resource = D:/project/ #指定数据连接驱动jar地址 classPath=D:/project/m

Mybatis自动生成实体类、dao接口和mapping映射文件

由于Mybatis是一种半自动的ORM框架,它的工作主要是配置mapping映射文件,为了减少手动书写映射文件,可以利用mybatis生成器,自动生成实体类.dao接口以及它的映射文件,然后直接拷贝到工程中稍微修改就可以直接使用了. 生成器目录如下: 首先进入lib文件夹中,该目录如下: (图上文件下载地址:http://download.csdn.net/detail/qiwei31229/9790909) 主要修改generatorConfig.xml <?xml version="1

C#集合篇,在业务背景下(***产品升级管理):依赖注入,变量声明,三元表达式,常用字符串相关操作方法,ADO.NET,EF机制,T4模板自动生成实体类,ref变量巧用,属性实际运用,唯一性验证

QQ:1187362408 欢迎技术交流和学习 关于系统产品升级报告管理,业务需求: TODO: 1,升级报告管理:依据各县区制定升级报告(关联sAreaCode,给每个地区观看具体升级报告信息) 2,运用的技术:依赖注入,变量声明,三元表达式,常用字符串相关操作方法,ADO.NET,EF机制,T4模板自动生成实体类,ref变量与可null变量巧用,属性实际运用,唯一性验证,url传递中文编码和解码问题 讲解篇:1,服务端aspx,2,服务端后台返回数据(这里采用服务器端程序:aspx.cs)

MyEclipse Hibernate反向工程生成实体类

不废话,直接上步骤 step1.Window -> Open Perspective -> MyEclipse Database Explorer 到DB Broswer界面 step2.右键 -> New,新建一个数据库连接 step3.创建一个java项目 step4.给项目添加Hibernate Capabilities 项目 -> 右键 -> MyEclipse -> Add Hibernate Capabilities Add Hibernate Capabi