最近有个需求是做个数据导入的接口,对方入到进来若干个excel文档,每个文档对应数据库中不同表的内容。数据格式:INFO文件中存放若10张excel文档,文档名称格式为表名-描述(如user-用户表.xls)。
下面将这个过程记录下来,方便之后的查看。

第一步、定义一个Map,用于存放excel文件中所有列的信息。

以user表为例,存放其中字段的信息,代码如下,仅供参考。

private Map<String, Object> getExcelFileType() {
	Map<String, Object> Map = new HashMap<String, Object>();
	JSONObject jsonData = new JSONObject();
	jsonData.put("name", "Str");             //不同类型的数据
	jsonData.put("date", "DateTime");
	Map.put("user", jsonData);
	return Map;
}

第二步、 日志设置

     数据处理过程中需要记录日志信息。这里使用的是 java.util.logging,配置相关的设置,可以将程序中的导入情况输出到日志中,方便查看。代码如下,仅供参考。

Logger log = Logger.getLogger("tesglog");   //日志
//设置日志的级别
log.setLevel(Level.ALL); 
//设置日志存放的路径
FileHandler fileHandler = new FileHandler("D:\import.log");  
fileHandler.setLevel(Level.ALL);  
fileHandler.setFormatter(new LogFormatter());  
log.addHandler(fileHandler);  
}

程序执行中会将相应的信息写入到指定的out文件中,程序执行后,可以查看执行的结果信息。

第三步 读取文件夹内容

思路
1、读取文件夹,遍历其中的excel文件,获取文件名称
2、定义两个变量sqlcolumn 和sqlvalue,分别用于存放拼接的列和值的信息。
3、按行遍历excel文件内容, 第二行开始,对每个单元格进行读取,根据是否有值来进行拼接插入的字符串。
4、运用jdbcOperations来执行拼接的sql语句,实现数据的入库。
程序实现的代码如下所示,仅供参考。

//读取文件夹的信息
File fileINFO = new File("D:\INFO");
if(fileINFO.isDirectory()){
	String[] fileINFOlist = fileINFO.list();
	for(int i = 0 ; i< fileINFOlist.length; i++ ){
	TableName=fileINFOlist[i].substring(0, fileINFOlist[i].indexOf('-'));  	`	//截取获取表名
	filePath=fileINFO+"\\"+fileINFOlist[i];      //拼接excel文件的路径
	//以流 逐个读取文件夹中的文件
	stream = new FileInputStream(file);
	//读取工作簿
	Workbook book = new Workbook(stream);
	WorksheetCollection sheets = book.getWorksheets();  //获取sheet信息
	// 获取表格中的所有单元格
	Cells cells = sheets.get(0).getCells();       //从第一行开始取单元格
	int maxColumnCount = cells.getMaxColumn()+1; //获取最大列
	int rowCount = cells.getLastDataRow(1);      //获取最近数据行
	String cellValue = new String();               //单元格的信息串
	StringBuffer errorReport = new StringBuffer();   // 检验错误信息
	//获取excel文件中的所有列信息   --自定义的方法
	Map<String, Object> ExcelFile = getExcelFileType();      
	JSONObject  jsonObject =(JSONObject) ExcelFile.get(TableName);
	// 判断表格列数是否符合要求
	int mm=jsonObject.size();
	if (maxColumnCount != jsonObject.size()) {
		map.put("success", "false");
		log.info("列的数量不正确!"+fileINFOlist[i]+"信息只能"+jsonObject.size()+"列值!");
		return;
		}
		
 	int k = 2; //从第2行开始取值
 	for (; k <= rowCount; k++) {     //从第二行开始读数据
		int j = 0;
		Iterator<String> male_Iterator = jsonObject.keys();
		//拼接数据库插入sql insert
		String  sqlcolumn = " INSERT INTO "+TableName+" ( ";
		//拼接数据库插入sql value值
		String  sqlvalue = " ) VALUES( ";
		int tableNameID=0;
		while(male_Iterator.hasNext()){   //迭代器遍历
			//获得单元格的value值
			Cell cell = cells.get(k, j);//单元格
			// 单元格内数据
			cellValue = (null == cell.getValue() ||cell.getValue().equals("")? null: cell.getStringValue().trim());
			// 获得key 
			String key = male_Iterator.next();
			if(cellValue != null){
				sqlcolumn += key+",";    //拼接列值,如: insert into user
				String dataType = jsonObject.getString(key);
				if(dataType.equals("Str")){  
					sqlvalue+= "'"+cellValue+"',";
				}else if(dataType.equals("DateTime")){   //排序字段
					sqlvalue+= " DATE_FORMAT('"+cellValue+"','%Y-%m-%d %H:%i:%s'),";
				}else {
					sqlvalue+= "'"+cellValue+"',";
				}				
		     }
	    }
	    //读取完整行数据 拼接一条insert插入语句执行
	    sqlcolumn = sqlcolumn.substring(0,sqlcolumn.length()-1);  //去除逗号
		sqlvalue = sqlvalue.substring(0,sqlvalue.length()-1);  //去除逗号
		String insertsql = sqlcolumn + sqlvalue+") ";
		//这里运用jdbcOperations来实现数据库的操作
		try {
				jdbcOperations.update(insertsql);
			} catch (Exception e) {
				map.put("success", "false");
				map.put("msg", fileINFOlist[i]+" 文件中 第" + (k+1) + "行数据插入失败,请核查该条数据。;");
				log.info(fileINFOlist[i]+"文件中 第" + (k+1) + "行数据插入失败,请核查该条数据。");
				log.info("错误日志信息为:"+e.getMessage());
		}
	}
}

总结:读取excel文件的内容功能较为常见,这里采用的主要是提前将文件中的列写入到map中,根据类型来进行取值,拼接sql来实现数据的入库。