Excel poi导出

后期繁忙,对本篇有问题的地方未修复。切勿阅读。       

 最近接手一个做了一半的遗留游戏项目,策划弟弟不懂数据库,只会看Excel(其实我觉得没有区别啊!偷笑),但是得配置数据啊,如果你是做过游戏的,那么你就应该知道,策划一般是把数据配置到Excel中,然后再通过工具,把数据导入到数据库中,公司是有这种工具的,但是不太对应,实在是懒得整理,想了想,反正也不是很忙,就写了个导表工具,谈到导表,肯定要解析Excel,于是我先去down了相对应的poi的jar包(不要问我为什么用poi而不用jxl,你试一下就知道了大笑


这里贴上poi的地址,(有友友说不知道去哪里down jar包)我用的是3.9的,现在好像出3.10了,没太注意!

poi的3.9版本jar包


借助poi的jar包,很快就写出了解析的代码


public static Workbook catchExcelData(String filePath) {//读取文件内容

		File file = new File(filePath);

		if (!file.exists()) { // 极其经典的一步判断
			System.out.println("亲,您提供的路径有问题哦!");
			return null;
		}

		Workbook workBook = null; // 为什么要用Workbook来声明呢? 看下面...
		InputStream streamOfExcel = null;
		try {
			streamOfExcel = new FileInputStream(file);
			if (filePath.endsWith(".xls")) {// 91-03版Excel
				workBook = new HSSFWorkbook(streamOfExcel);
			} else if (filePath.endsWith(".xlsx")) {// 2007版Excel
				workBook = new XSSFWorkbook(streamOfExcel);
			} else {
				System.out.println("亲,您提供的文件类型有误哦!");
				return null;
			}
			return workBook;
		} catch (FileNotFoundException e) {
			System.out.println("亲,您提供的路径有问题哦!");
			e.printStackTrace();
		} catch (IOException e) {
			System.out.println("亲,解析失败了!");
			e.printStackTrace();
		} finally {
			try {
				streamOfExcel.close();
			} catch (IOException e) {
				e.printStackTrace();
			}
		}

		return null;
	}


那么通过上面这个方法得到文件的内容后,接着就是解析具体的内容了,好了,下一步


public static List<String> createSqlByExcelData(String filePath, int sheetNum,
			String tableName){//filePath为文件路径,sheetNum为要读取的sheet,tableName是要表名,主要用于sql拼接
		
		Workbook excelData = ExcelCreateSql.catchExcelData(filePath);//拿到文件数据
		//注:这里Sheet导入的是 org.apache.poi.ss.usermodel.Sheet,不要导错了哦
		Sheet sheet =  excelData.getSheetAt(sheetNum);
		
		int rows = sheet.getLastRowNum();//获取行数
		//获取最大列数,这个只是针对我做的导表,因为我导表第一列是列名,列名有多少,下面的数据也是多少
		int cols = sheet.getRow(0).getPhysicalNumberOfCells();
		
		List<String> sqlList = new ArrayList<String>();
		String sql = "INSERT INTO " + tableName + " VALUES (";//准备好我的sql头部
		Row rowContent;
		String contentTmp;
		//有同事问我为什么contentTmp不用StringBuilder,其实开始我也是想过的,后来发现我的表最多的就是8个字段,用StringBuilder建立的对象太多,速度上也不如这样直接连接快。
		for (int r = 1; r < rows + 1; r++) {
			rowContent = sheet.getRow(r);
			contentTmp = "";
			for (int c = 0; c < cols; c++) {

				if(rowContent.getCell(c) == null){//如果某列无值,跳过
					continue;
				}
				contentTmp += contentTmp.length() > 0 ? "," : "";//对值进行判断,值之间用 “,”隔开
				contentTmp += rowContent.getCell(c).toString();
			}
				sqlList.add(sql + contentTmp + " );");//将生成好的sql存起来
		}
		
		return sqlList;
	} 

这样,我就把表中的数据完全的转成sql语句了,只要传入数据库执行就ok了,当然,现在的这个导表还不完善,明天根据具体的生产环境继续完善它!大家有建议的也提提,根据API写的,不完善的地方肯定有 大笑

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值