JAVA 读取excel文件成List<Entity>
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>的更多相关文章
- Java读取Excel文件的几种方法
Java读取 Excel 文件的常用开源免费方法有以下几种: 1. JDBC-ODBC Excel Driver 2. jxl.jar 3. jcom.jar 4. poi.jar 简单介绍: 百度文 ...
- java读取excel文件的代码
如下内容段是关于java读取excel文件的内容,应该能对各朋友有所用途. package com.zsmj.utilit; import java.io.FileInputStream;import ...
- 关于解决java读取excel文件遇空行抛空指针的问题 !
关于解决java读取excel文件遇空行抛空指针的问题 ! package exceRead; import java.io.File; import java.io.FileInputStream; ...
- java 读取Excel文件并数据持久化方法Demo
import java.io.IOException; import java.io.InputStream; import java.util.ArrayList; import java.util ...
- java读取excel文件数据导入mysql数据库
这是我来公司的第二周的一个小学习任务,下面是实现过程: 1.建立maven工程(方便管理jar包) 在pom.xml导入 jxl,mysql-connector 依赖 可以在maven仓库搜索 2.建 ...
- Java读取Excel文件转换成JSON并转成List——(七)
Jar包
- JAVA读取EXCEL文件异常Unable to recognize OLE stream
异常: jxl.read.biff.BiffException: Unable to recognize OLE stream at jxl.read.biff.CompoundFile.<in ...
- java 读取excel文件(只读取xls文件)
package com.sun.test; import java.io.BufferedInputStream;import java.io.File;import java.io.FileInpu ...
- Java 读取Excel 文件内容
在一个项目中,有一个需求,是把excel文件的内容转换为xml格式展示.在学习如何操作的过程中,首先是如何获取excel文件,其中操作的代码如下: 1.首先是导入需要的 jar, 下载地址:https ...
随机推荐
- Jupyter Notebook 导出PDF与Latex中文支持
Jupyter Notebook 最近搞机器学习用到了Jupyter Notebook. 作为一个实时记事本,有时需要将内容导出为PDF. 但是,Jupyter Notebook自带的File -&g ...
- Java线程-- 线程池
1.线程池概念 线程池,其实就是一个容纳多个线程的容器,其中的线程可以反复使用,省去了频繁创建线程对象的操作,无需反复创建线程而消耗过多资源. 为什么要使用线程池? 在java中,如果每个请求到达就创 ...
- LQB201803乘积尾零
果然是练思维呀!!要是我的话估计就能挨个算一算呜呜呜 分解成 2和5相乘的式子 #include <iostream> using namespace std; //快速幂运算 int m ...
- Day12_搜索过滤
学于黑马和传智播客联合做的教学项目 感谢 黑马官网 传智播客官网 微信搜索"艺术行者",关注并回复关键词"乐优商城"获取视频和教程资料! b站在线视频 0.学习 ...
- PHP getrandmax() 函数
实例 返回通过调用 rand() 函数显示的随机数的最大可能值: <?phpecho(getrandmax()); ?>高佣联盟 www.cgewang.com 定义和用法 The get ...
- Typora+PicGo-Core(command line)+SMMS、github、gitee实现Typora图片上传到图床
Typora+PicGo-Core(command line)+SMMS.github.gitee实现Typora图片上传到图床 1 安装插件2 配置config.json 2.1 设置SMMS ...
- Springboot拦截器使用及其底层源码剖析
博主最近看了一下公司刚刚开发的微服务,准备入手从基本的过滤器以及拦截器开始剖析,以及在帮同学们分析一下上次的jetty过滤器源码与本次Springboot中tomcat中过滤器的区别.正题开始,拦截器 ...
- 7月15日考试 题解(链表+状压DP+思维题)
前言:蒟蒻太弱了,全打的暴力QAQ. --------------------- T1 小Z的求和 题目大意:求$\sum\limits_{i=1}^n \sum\limits_{j=i}^n kth ...
- 【洛谷P3802】小魔女帕琪 题解(概率期望)
前言:蒟蒻太弱了,不会推式子QAQ -------------------- 题目链接 题目大意:给定$7$种能量晶体各$a_i$个,每次随机摸到一个晶体,如果连续摸到$7$个不同的晶体就会触发一次伤 ...
- SpringBoot2.x下RabbitMQ的并发参数(concurrency和prefetch)
RabbitMQ消费端配置 spring: rabbitmq: host: localhost port: 5672 username: guest password: guest listene ...