Java读取excel
背景介绍
JAVA 实现批量读取excel文件,将文件中的内容写入到数据库。
最近有个需求是做个数据导入的接口,对方入到进来若干个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来实现数据的入库。
博客参考
【1】https://blog.csdn.net/gxx_csdn/article/details/79085713