Commit cae4ba2e authored by liguofu@yeejoin.com's avatar liguofu@yeejoin.com

修改:【空工大】解析Excel文件,自动创建数据库表和插入数据,并生成数据源

parent 42753a79
package com.yeejoin.amos.kgd.config;
import org.apache.commons.lang.StringUtils;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import org.apache.poi.poifs.filesystem.POIFSFileSystem;
import org.apache.poi.ss.usermodel.Cell;
import org.apache.poi.ss.usermodel.Row;
import org.apache.poi.ss.usermodel.Sheet;
import org.apache.poi.ss.usermodel.Workbook;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;
import org.springframework.web.multipart.MultipartFile;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.text.NumberFormat;
import java.util.*;
public class ExcelTool {
private static NumberFormat numberFormat = null;
/**
* 解析xls和xlsx不兼容问题
*
* @param pfs
* @param workbook
* @param inputStream
* @return
*/
public static Workbook getWorkBook(POIFSFileSystem pfs, Workbook workbook, InputStream inputStream, String filename) throws IOException {
if (filename.endsWith("xls")) {
pfs = new POIFSFileSystem(inputStream);
workbook = new HSSFWorkbook(pfs);
return workbook;
} else if (filename.endsWith("xlsx")) {
try {
workbook = new XSSFWorkbook(inputStream);
return workbook;
} catch (IOException e) {
return null;
}
} else {
return null;
}
}
/**
* 解析Excel表头
*
* @param inputStream 文件
* @return
*/
public static List<String> readColumnsFromExcel(InputStream inputStream, String filename) throws Exception {
POIFSFileSystem pfs = null;
Workbook workbook = null;
try {
// 解析xls和xlsx不兼容问题
workbook = getWorkBook(pfs, workbook, inputStream, filename);
} catch (IOException e) {
e.printStackTrace();
throw new Exception("模板保存异常。");
}
if (workbook == null) {
throw new Exception("请使用模板上传文件");
}
// 拿第一个sheet表
Sheet sheet = workbook.getSheetAt(0);
// 校验sheet是否合法
if (Objects.isNull(sheet)) {
return null;
}
// 获取第一行数据(假如第一行就是列名)
Row sheetTitleRow = sheet.getRow(sheet.getFirstRowNum());
// 取出最后一列
short lastCellNum = sheetTitleRow.getLastCellNum();
List<String> sheetTitleList = new LinkedList<>();
for (int i = 0; i < lastCellNum; i++) {
// 取出每一列的名
String cellValue = sheetTitleRow.getCell(i).getStringCellValue();
sheetTitleList.add(cellValue);
}
return sheetTitleList;
}
/**
* 解析Excel数据
*
* @param inputStream 文件
* @return
*/
public static List<List<String>> readDataFromExcel(InputStream inputStream, String filename) throws Exception {
POIFSFileSystem pfs = null;
Workbook workbook = null;
try {
// 解析xls和xlsx不兼容问题
workbook = getWorkBook(pfs, workbook, inputStream, filename);
} catch (IOException e) {
e.printStackTrace();
throw new Exception("模板保存异常。");
}
if (workbook == null) {
throw new Exception("请使用模板上传文件");
}
numberFormat = NumberFormat.getNumberInstance();
// 创建一个集合根据下标来确定每个单元格对应对象的什么属性
List<List<String>> resultList = new ArrayList<>();
// 获取表格第一个sheet的内容
Sheet sheetAt = workbook.getSheetAt(0);
// 获得sheet总行数
int lastRowNum = sheetAt.getLastRowNum();
if (lastRowNum < 1) {
throw new Exception("数据错误");
}
// 开始读取,不读取表头所以从第二行开始
for (int i = 1; i <= lastRowNum; i++) {
// 获取每一行
Row row = sheetAt.getRow(i);
// 行为空不读取
if (row == null) {
continue;
}
Cell cell = row.getCell(0);
//列为空不读取
if (cell == null || StringUtils.isEmpty(convertData(cell))) {
continue;
}
List<String> rowList = new ArrayList<>();
//添加数据
short lastCellNum = row.getLastCellNum();
for (int j = 0; j < lastCellNum; j++) {
Cell cellOne = row.getCell(j);
try {
String item = convertData(cellOne);
rowList.add(item.trim());
} catch (Exception e) {
System.out.println("-------------------Err-----------------------");
System.out.println(i + "行" + j + "列数据转换出现异常");
rowList.add("");
}
resultList.add(rowList);
}
//规避行数数据后几行为空
if (rowList.size() < lastCellNum) {
for (int k = 0; k < 15 - rowList.size(); k++) {
rowList.add("");
}
}
}
return resultList;
}
/**
* 表格数据转换
*
* @param cell
* @return
*/
public static String convertData(Cell cell) {
String str = "";
switch (cell.getCellTypeEnum()) {
case NUMERIC:
//判断是否是整数
str = numberFormat.format(cell.getNumericCellValue());
break;
case STRING:
str = cell.getStringCellValue();
break;
case FORMULA:
try {
str = String.valueOf(cell.getNumericCellValue());
} catch (IllegalArgumentException e) {
str = String.valueOf(cell.getRichStringCellValue());
}
break;
default:
str = "";
}
return str;
}
}
package com.yeejoin.amos.kgd.message.model;
import lombok.Data;
@Data
public class TableFieldModel {
// 字段类型
private String fieldType="String";
// 字段名称
private String fieldName;
// 字段长度
private String fieldLength;
// 数值类型时,小数点长度
private String decimalPoint;
// 主键
private String primaryKey;
// 是否为空
private String isNull="1";
// 不为空时,需设置得值
private String fieldRemark;
}
package com.yeejoin.amos.kgd.message.model;
import lombok.Data;
import java.util.List;
@Data
public class TableModel {
// 表名称
private String tableName;
// 表字段
private List<TableFieldModel> tableFields;
}
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment