package com.dzg.utils;
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import com.dzg.excel2json.ExcelToJsonReservoir;
import org.apache.poi.ss.usermodel.*;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.io.FileInputStream;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
public class Excel2JsonUtil {
private final static Logger logger = LoggerFactory.getLogger(ExcelToJsonReservoir.class);
private static FileInputStream inp = null;
/**
*根据excel文件名(后缀名为.xlsx),将其转化为一个JSON数组
*
* JSON数组中的每一元素为对应表格中的一行数据
*
* 表格中的数字数据(如年龄、体重等)默认都被转化为了double类型,要获取整型数据自行处理即可(Integer对象进行处理)
* @param fileName
*/
public static JSONArray excelToJson(String fileName){
JSONObject jsonObject = null;
try {
inp = new FileInputStream(fileName);
Workbook workbook = WorkbookFactory.create(inp);
//获取sheet数
int sheetNum = workbook.getNumberOfSheets();
jsonObject = new JSONObject();
for (int s = 0; s < sheetNum; s++) {
// Get the Sheet of s.
Sheet sheet = workbook.getSheetAt(s);
//获取最大行数
int rownum = sheet.getPhysicalNumberOfRows();
if (rownum <= 1) {
continue;
}
//获取第一行
Row row1 = sheet.getRow(0);
//获取最大列数
int colnum = row1.getPhysicalNumberOfCells();
JSONArray jsonArray = new JSONArray();
for (int i = 1; i < rownum; i++) {
Row row = sheet.getRow(i);
if (row != null) {
// List<Object> list = new ArrayList<>();
JSONObject rowObj = new JSONObject();
//循环列
for (int j = 0; j < colnum; j++) {
Cell cellData = row.getCell(j);
if (cellData != null) {
//判断cell类型
switch (cellData.getCellType()) {
//cell为double数值类型
case Cell.CELL_TYPE_NUMERIC: {
/*if (j == 0 || j ==1 || j ==2){
rowObj.put(row1.getCell(j).getStringCellValue(), new Double(cellData.getNumericCellValue()).intValue());
}*/
rowObj.put(row1.getCell(j).getStringCellValue(), cellData.getNumericCellValue());
break;
}
case Cell.CELL_TYPE_FORMULA: {
//判断cell是否为日期格式
if (DateUtil.isCellDateFormatted(cellData)) {
//转换为日期格式YYYY-mm-dd
rowObj.put(row1.getCell(j).getStringCellValue(), cellData.getDateCellValue());
} else {
//数字
rowObj.put(row1.getCell(j).getStringCellValue(), cellData.getNumericCellValue());
}
break;
}
case Cell.CELL_TYPE_STRING: {
rowObj.put(row1.getCell(j).getStringCellValue(), cellData.getStringCellValue());
break;
}
default:
//默认为空值
rowObj.put(row1.getCell(j).getStringCellValue(), "");
}
} else {
//某一行的第j列为空
rowObj.put(row1.getCell(j).getStringCellValue(), "");
}
}
jsonArray.add(rowObj);
// num++;
}
}
// logger.info(jsonArray.toJSONString());
jsonObject.put(sheet.getSheetName(), jsonArray);
return jsonArray;
}
// logger.info(jsonObject.toJSONString());
} catch (Exception e) {
e.printStackTrace();
}
// return jsonObject;
return null;
}
/**
* 根据关系表,获取对应的一对多映射关系(一个Target_Fid对应多个JOIN_FID)
*
* @param fileName
* @return
*/
public static Map<Integer, List<Integer>> getOne2ManyRelationship(String fileName) {
JSONObject rowJsonObject = null;
JSONArray jsonArray = Excel2JsonUtil.excelToJson(fileName);
Map<Integer, List<Integer>> tempMap = new HashMap<>();
if (jsonArray == null){
return null;
}
for (Object obj : jsonArray) {
rowJsonObject = (JSONObject) obj;
if(NumberUtil.double2Int((Double) rowJsonObject.get("Join_Count")) == 1);{
//在这里获取一对多中"多"的一方对应的数据
int target_fid = new Double((Double) rowJsonObject.get("TARGET_FID")).intValue();
int join_fid = new Double((Double) rowJsonObject.get("JOIN_FID")).intValue();
//判断当前Map中是否已经包含target_fid
if(tempMap.containsKey(target_fid)){
//包含的话根据键值获取对应的List将join_id加进去
tempMap.get(target_fid).add(join_fid);
}else{
//不包含,则先将对应的join_id添加到一个List中
ArrayList<Integer> list= new ArrayList<>();
list.add(join_fid);
tempMap.put(target_fid,list);
}
}
}
return tempMap;
}
}