package com.oneyac.milos.utils;
import com.alibaba.fastjson.JSONObject;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import org.apache.poi.ss.usermodel.*;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;
import org.jxls.common.Context;
import org.jxls.util.JxlsHelper;
import org.springframework.web.multipart.MultipartFile;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.InputStream;
import java.io.OutputStream;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.List;
/**
* Excel相关工具类
*
* @author yourin.yang
*/
public class ExcelUtils {
/**
* 创建workbook(会抛出异常,调用请捕获处理)
*
* @param file 文件
* @return 返回workbook
*/
public static Workbook createWorkbook(MultipartFile file) throws Exception {
// 如果文件为空,则创建失败
if (file.isEmpty()) {
throw new Exception("文件为空");
}
String filename = file.getOriginalFilename();
try {
if (BaseUtils.isExcel2003(filename)) {
return new HSSFWorkbook(file.getInputStream());
} else if (BaseUtils.isExcel2007(filename)) {
return new XSSFWorkbook(file.getInputStream());
} else {
throw new Exception("非EXCEL文件");
}
} catch (Exception e) {
// 打印错误,并抛出
e.printStackTrace();
throw new Exception("文件解析失败");
}
}
/**
* 创建workbook(会抛出异常,调用请捕获处理)
*/
public static Workbook createWorkbook(InputStream inputStream, String filename) throws Exception {
try {
if (BaseUtils.isExcel2003(filename)) {
return new HSSFWorkbook(inputStream);
} else if (BaseUtils.isExcel2007(filename)) {
return new XSSFWorkbook(inputStream);
} else {
throw new Exception("非EXCEL文件");
}
} catch (Exception e) {
// 打印错误,并抛出
e.printStackTrace();
throw new Exception("文件解析失败");
}
}
/**
* 从workbook读取指定sheet的数据 (会抛出异常,调用请捕获处理)
* (统一转为String)
* 日期指定为格式 yyyy-MM-dd HH:mm:ss
*
* @param wb workbook
* @param sheetIndex sheet索引
* @return 指定sheet页的数据
*/
public static List<List<String>> readData(Workbook wb, int sheetIndex) throws Exception {
try {
List<List<String>> data = new ArrayList<>();
// 得到sheet
Sheet sheet = wb.getSheetAt(sheetIndex);
// 得到总行数
int rowsCount = sheet.getLastRowNum();
// 逐行取得数据
for (int i = 0; i <= rowsCount; i++) {
// 获取行
Row row = sheet.getRow(i);
if (BaseUtils.isEmpty(row)) {
continue;
}
// 获得每行列数
int colsCount = row.getLastCellNum();
List<String> lineData = new ArrayList<>();
// 逐列取得数据
for (int j = 0; j < colsCount; j++) {
// 获取单元格
Cell cell = row.getCell(j);
lineData.add(readData(cell));
}
data.add(lineData);
}
return data;
} catch (Exception e) {
// 打印错误,并抛出
e.printStackTrace();
throw new Exception("EXCEL数据读取失败");
}
}
/**
* 读取单元格数据
* (统一转为String)
* 日期指定为格式 yyyy-MM-dd HH:mm:ss
*
* @param cell 单元格
* @return 单元格数据
*/
private static String readData(Cell cell) throws Exception {
if (cell == null) {
return "";
}
CellType cellType = cell.getCellTypeEnum();
switch (cellType) {
case BOOLEAN:
return cell.getBooleanCellValue() + "";
case NUMERIC:
// 数字的时候需要特别判断是否是日期 日期统一返回 yyyy-MM-dd HH:mm:ss
if (DateUtil.isCellDateFormatted(cell)) {
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
return sdf.format(cell.getDateCellValue());
}
return cell.getNumericCellValue() + "";
case BLANK:
// 空值暂时返回空字符串,有遇到再修改
return "";
case FORMULA: //公式
return cell.getCellFormula();
case _NONE:
// 空值暂时返回空字符串,有遇到再修改
return "";
case ERROR:
return "";
case STRING:
return cell.getStringCellValue();
default:
return "";
}
}
}