package com.fsinfo.common.utils;

import com.fsinfo.modules.enterprise.entity.EnterpriseRecordEntity;
import org.apache.commons.io.FileUtils;
import org.apache.poi.hssf.usermodel.HSSFDataFormat;
import org.apache.poi.hssf.usermodel.HSSFDateUtil;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import org.apache.poi.ss.usermodel.*;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;
import org.springframework.web.multipart.MultipartFile; import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream; import java.util.Date;
import java.text.DecimalFormat;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.List; /**
* @Author leijiaxuan
   * @Email 897953910@qq.com
* @Date 9:50 2020/7/22
**/
public class ExcelInsert { // private static Logger logger = Logger.getLogger(ExcelReader.class.getName()); // 日志打印类 private static final String XLS = "xls";
private static final String XLSX = "xlsx"; /**
* 根据文件后缀名类型获取对应的工作簿对象
* @param inputStream 读取文件的输入流
* @param fileType 文件后缀名类型(xls或xlsx)
* @return 包含文件数据的工作簿对象
* @throws IOException
*/
public static Workbook getWorkbook(InputStream inputStream, String fileType) throws IOException {
Workbook workbook = null;
if (fileType.equalsIgnoreCase(XLS)) {
workbook = new HSSFWorkbook(inputStream);
} else if (fileType.equalsIgnoreCase(XLSX)) {
workbook = new XSSFWorkbook(inputStream);
}
return workbook;
} /**
* 读取Excel文件内容
* @param myfile 要读取的Excel文件流
* @return 读取结果列表,读取失败时返回null
*/
public static List<EnterpriseRecordEntity> readExcel(MultipartFile myfile) { Workbook workbook = null;
FileInputStream inputStream = null; try {
// 获取Excel后缀名
String fileName=myfile.getOriginalFilename();
String fileType = fileName.substring(fileName.lastIndexOf(".") + 1, fileName.length());
// // 获取Excel文件
// File excelFile = new File(fileName);
// if (!excelFile.exists()) {
//// logger.warning("指定的Excel文件不存在!");
// return null;
// } File file = new File(myfile.getOriginalFilename());
FileUtils.copyInputStreamToFile(myfile.getInputStream(), file);
// 获取Excel工作簿
inputStream = new FileInputStream(file);
workbook = getWorkbook(inputStream, fileType);
// 会在本地产生临时文件,用完后需要删除
if (file.exists()) {
file.delete();
} // 读取excel中的数据
List<EnterpriseRecordEntity> resultDataList = parseExcel(workbook); return resultDataList;
} catch (Exception e) {
// logger.warning("解析Excel失败,文件名:" + fileName + " 错误信息:" + e.getMessage());
return null;
} finally {
try {
if (null != workbook) {
workbook.close();
}
if (null != inputStream) {
inputStream.close();
}
} catch (Exception e) {
// logger.warning("关闭数据流出错!错误信息:" + e.getMessage());
return null;
}
}
} /**
* 解析Excel数据
* @param workbook Excel工作簿对象
* @return 解析结果
*/
private static List<EnterpriseRecordEntity> parseExcel(Workbook workbook) {
List<EnterpriseRecordEntity> resultDataList = new ArrayList<>();
// 解析sheet
for (int sheetNum = 0; sheetNum < workbook.getNumberOfSheets(); sheetNum++) {
Sheet sheet = workbook.getSheetAt(sheetNum); // 校验sheet是否合法
if (sheet == null) {
continue;
} // 获取第一行数据
int firstRowNum = sheet.getFirstRowNum();
Row firstRow = sheet.getRow(firstRowNum);
if (null == firstRow) {
// logger.warning("解析Excel失败,在第一行没有读取到任何数据!");
} // 解析每一行的数据,构造数据对象
int rowStart = firstRowNum + 1;
int rowEnd = sheet.getPhysicalNumberOfRows();
for (int rowNum = rowStart; rowNum < rowEnd; rowNum++) {
Row row = sheet.getRow(rowNum); if (null == row) {
continue;
} EnterpriseRecordEntity resultData = convertRowToData(row);
if (null == resultData) {
// logger.warning("第 " + row.getRowNum() + "行数据不合法,已忽略!");
continue;
}
resultDataList.add(resultData);
}
} return resultDataList;
} /**
* 将单元格内容转换为字符串
* @param cell
* @return
*/
private static String convertCellValueToString(Cell cell) {
if(cell==null){
return null;
}
String returnValue = null;
switch (cell.getCellType()) {
case 0: //数字
if (HSSFDateUtil.isCellDateFormatted(cell)) {// 处理日期格式、时间格式
SimpleDateFormat sdf = null;
if (cell.getCellStyle().getDataFormat() == HSSFDataFormat
.getBuiltinFormat("h:mm")) {
sdf = new SimpleDateFormat("HH:mm");
} else {// 日期
sdf = new SimpleDateFormat("yyyy-MM-dd");
}
Date date = cell.getDateCellValue();
returnValue = sdf.format(date);
} else if (cell.getCellStyle().getDataFormat() == 58) {
// 处理自定义日期格式:m月d日(通过判断单元格的格式id解决,id的值是58)
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
double value = cell.getNumericCellValue();
Date date = org.apache.poi.ss.usermodel.DateUtil
.getJavaDate(value);
returnValue = sdf.format(date);
} else {
double value = cell.getNumericCellValue();
CellStyle style = cell.getCellStyle();
DecimalFormat format = new DecimalFormat();
String temp = style.getDataFormatString();
// 单元格设置成常规
if (temp.equals("General")) {
format.applyPattern("#");
}
returnValue = format.format(value);
}
break;
case 1: //字符串
returnValue = cell.getStringCellValue();
break;
case 4: //布尔
Boolean booleanValue = cell.getBooleanCellValue();
returnValue = booleanValue.toString();
break;
case 2: // 空值
break;
case 7: // 公式
returnValue = cell.getCellFormula();
break;
case 64: // 故障
break;
default:
break;
}
return returnValue;
} /**
* 提取每一行中需要的数据,构造成为一个结果数据对象
*
* 当该行中有单元格的数据为空或不合法时,忽略该行的数据
*
* @param row 行数据
* @return 解析后的行数据对象,行数据错误时返回null
*/
private static EnterpriseRecordEntity convertRowToData(Row row) {
EnterpriseRecordEntity resultData = new EnterpriseRecordEntity(); Cell cell;
int cellNum = 0;
// 获取记录日期
cell = row.getCell(cellNum++);
String recorddate = convertCellValueToString(cell);
resultData.setRecorddate(java.sql.Date.valueOf(recorddate));
// 获取企业名称
cell = row.getCell(cellNum++);
String enterpriseuuid = convertCellValueToString(cell);
resultData.setEnterpriseuuid(enterpriseuuid);
// 获取企业反映问题
cell = row.getCell(cellNum++);
String recordcontext = convertCellValueToString(cell);
resultData.setRecordcontext(recordcontext);
// 获取解决情况
cell = row.getCell(cellNum++);
String handlinfo = convertCellValueToString(cell);
resultData.setHandlinfo(handlinfo);
// 获取备注
cell = row.getCell(cellNum++);
String remarks = convertCellValueToString(cell);
resultData.setRemarks(remarks); return resultData;
}
}

JAVA 读取excel文件成List<Entity>的更多相关文章

  1. Java读取Excel文件的几种方法

    Java读取 Excel 文件的常用开源免费方法有以下几种: 1. JDBC-ODBC Excel Driver 2. jxl.jar 3. jcom.jar 4. poi.jar 简单介绍: 百度文 ...

  2. java读取excel文件的代码

    如下内容段是关于java读取excel文件的内容,应该能对各朋友有所用途. package com.zsmj.utilit; import java.io.FileInputStream;import ...

  3. 关于解决java读取excel文件遇空行抛空指针的问题 !

    关于解决java读取excel文件遇空行抛空指针的问题 ! package exceRead; import java.io.File; import java.io.FileInputStream; ...

  4. java 读取Excel文件并数据持久化方法Demo

    import java.io.IOException; import java.io.InputStream; import java.util.ArrayList; import java.util ...

  5. java读取excel文件数据导入mysql数据库

    这是我来公司的第二周的一个小学习任务,下面是实现过程: 1.建立maven工程(方便管理jar包) 在pom.xml导入 jxl,mysql-connector 依赖 可以在maven仓库搜索 2.建 ...

  6. Java读取Excel文件转换成JSON并转成List——(七)

    Jar包

  7. JAVA读取EXCEL文件异常Unable to recognize OLE stream

    异常: jxl.read.biff.BiffException: Unable to recognize OLE stream at jxl.read.biff.CompoundFile.<in ...

  8. java 读取excel文件(只读取xls文件)

    package com.sun.test; import java.io.BufferedInputStream;import java.io.File;import java.io.FileInpu ...

  9. Java 读取Excel 文件内容

    在一个项目中,有一个需求,是把excel文件的内容转换为xml格式展示.在学习如何操作的过程中,首先是如何获取excel文件,其中操作的代码如下: 1.首先是导入需要的 jar, 下载地址:https ...

随机推荐

  1. ubuntu DEBIAN_FRONTEND环境变量用法

    DEBIAN_FRONTEND环境变量,告知操作系统应该从哪儿获得用户输入.如果设置为"noninteractive",你就可以直接运行命令,而无需向用户请求输入(所有操作都是非交 ...

  2. 数据库(十三):MySQL内置方法

    进击のpython ***** 数据库--MySQL内置方法 目录 数据库--MySQL内置方法 视图 增加 修改 删除 触发器 创建 使用 删除 存储过程 无参 有参 事务 代码实现 视图 视图是一 ...

  3. Ansible 远程服务器连接 Internet 测试

    Email 连接: lonnyliu@126.com 需求 在使用Ansible过程中不可避免需要了解远端服务器是否能够联通外网,以便进行在线安装软件或者其他.对于运维人员来说普遍的办法有 1. 登录 ...

  4. Redis之Redis入门介绍

    1.Redis概述    所谓Redis全称为REmote DIctionary Server(远程字典服务器) 是完全开源免费的,用C语言编写的,遵守BSD协议,是一个高性能的(key/value) ...

  5. clion 如何执行外部文件

    https://blog.csdn.net/he_yang_/article/details/96644480 这里这里

  6. shell动态向sql传参

    一直在想有什么好方法可以实现,用shell动态给sql传参,自己写了一个简单,有什么好方法,欢迎留言补充,下面代码纯手打,可能有疏忽之处,请大佬批评指正指正. 实现方法如下: 1.新建一个文件02.t ...

  7. PHP touch() 函数

    定义和用法 touch() 函数设置指定文件的访问和修改时间. 如果成功,该函数返回 TRUE.如果失败,则返回 FALSE. 语法 touch(filename,time,atime) 参数 描述 ...

  8. QDC DAY1

    暴毙了,比较自闭的心理,有点崩溃.. LINK:幸福 一道曾经的我肯定能写出来的 但是我心态崩了 所以没有推出来. 当然 还是 我比较垃圾 但同时也不垃圾 ... 求 $T_n =\displayst ...

  9. Redis分布式限流器

    以下文章来源于微信公众号:程序员内点事 ,作者:程序员内点事 请大家关注原作者 1. 什么是限流?为什么要限流? 限流是保证系统高可用的重要手段!!!由于互联网公司的流量巨大,系统上线会做一个流量峰值 ...

  10. Docker管理工具之portainer

    参考:https://www.cnblogs.com/frankdeng/p/9686735.html 1. 查询portainer镜像 命令:docker search portainer 实例: ...