Java解析导入Excel文件后台代码实现
使用MultipartFile上传Excel文件后端代码实现:(springmvc下的spring-webmvc (MultipartFile )上传)
由于POST一个包含文件上传的Form会以multipart/form-data请求发送给服务器,必须明确告诉转发器(DispatcherServlet)如何处理MultipartRequest。首先,在配置文件中声明一个MultipartResolver;
<bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
<!-- 设置上传文件的最大尺寸为1MB(也可以不配置而在代码中限制上传的文件大小) -->
<property name="maxUploadSize">
<value>1048576</value>
</property>
</bean>
代码所需jar包下载地址:
https://files.cnblogs.com/files/Big-Boss/Java%E5%AF%BC%E5%85%A5Excel%E6%96%87%E4%BB%B6%E6%89%80%E9%9C%80jar%E5%8C%85.zip
注:以下代码只能满足基本需求,需根据实际需求做代码更改。
代码:
import java.io.FileInputStream;
import java.io.InputStream;
import java.lang.reflect.Field;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map; import javax.servlet.http.HttpServletRequest; import org.apache.commons.lang3.StringUtils;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;
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 org.springframework.web.multipart.MultipartHttpServletRequest;
/**
* 解析导出的Excel文件
* 注:需根据实际需求做代码更改
* @author 【】
*
*/
public class ImportExcelUtil {
/*
* 导入Excel文件
* @param obj 导入文件数据对应的实体类
* @param request HttpServletRequest请求request
* @return 解析后数据集合
*/
public List<Object> importExcel(Object obj, HttpServletRequest request) {
// 将请求转化为多部件的请求
MultipartHttpServletRequest multipartRequest = (MultipartHttpServletRequest) request;
// 解析多部件请求文件
MultipartFile mFile = multipartRequest.getFile("importFile");
// 获得上传文件的文件名
String fileName = mFile.getOriginalFilename();
// 获取文件扩展名
String eName = fileName.substring(fileName.lastIndexOf(".")+1);
InputStream inputStream = mFile.getInputStream();
Workbook workbook = getWorkbook(inputStream, eName);
// 获取工作薄第一张表
Sheet sheet = workbook.getSheetAt(0);
// 获取名称
String sheetName = sheet.getSheetName().trim();
// 获取第一行
Row row = sheet.getRow(0);
// 获取有效单元格数
int cellNum = row.getPhysicalNumberOfCells();
// 表头集合
List<String> headList = new ArrayList<>();
for (int i = 0; i < cellNum; i++) {
Cell cell = row.getCell(i);
String val = cell.getStringCellValue();
headList.add(val);
}
Map<String, Field> map = getObjComment(obj);
// 获得有效行数
int rowNum = sheet.getPhysicalNumberOfRows();
// 定义导出文件中数据集合
List<Object> objList = new ArrayList<>();
for (int i = 1; i < rowNum; i++) {
row = sheet.getRow(i);
Object data = new Object();
for (int j = 0; j < headList.size(); j++) {
// 解析单元格
Cell cell = row.getCell(j);
// 根据字段给字段设值(根据实际需求更改代码)
Field field = map.get(headList.get(j));
field.setAccessible(true);
field.set(data, cell.getStringCellValue());
}
objList.add(data);
} return objList;
} /*
* 利用java反射机制获取该类及父类的字段@Comment("")注解和字段信息Map集合
*/
public Map<String, Field> getObjComment(Object obj) {
Map<String, Field> map = new HashMap<>();
// 获取该类所有字段信息
Field[] fields = obj.getClass().getDeclaredFields();
for (Field field : fields) {
Comment comment = field.getAnnotation(Comment.class);
if (null == comment) {
continue;
}
if (StringUtils.isNotBlank(comment.value())) {
map.put(comment.value(), field);
}
}
// 获取其父类所有属性(字段信息)
Field[] superFields = obj.getClass().getSuperclass().getDeclaredFields();
for (Field field : superFields) {
Comment comment = field.getAnnotation(Comment.class);
if (null == comment) {
continue;
}
if (StringUtils.isNotBlank(comment.value())) {
map.put(comment.value(), field);
}
}
return map;
} /*
* 根据excel文件格式获知excel版本信息
*/
public static Workbook getWorkbook(InputStream fs,String str){
Workbook book = null;
try{
if ("xls".equals(str)) {
// 2003
book = new HSSFWorkbook(fs);
} else {
// 2007
book = new XSSFWorkbook(fs);
}
}catch (Exception e) {
e.printStackTrace();
}
return book;
} }
Java解析导入Excel文件后台代码实现的更多相关文章
- Spring Boot下的一种导入Excel文件的代码框架
1.前言 Spring Boot下如果只是导入一个简单的Excel文件,是容易的.网上类似的文章不少,有的针对具体的实体类,代码可重用性不高:有的利用反射机制或自定义注解,开发了Excel导入工具 ...
- Java POI导入Excel文件
今天在公司需要做个导入Excel文件的功能,所以研究了一下,参考网上的一些资料总算是做出来了,在此记录一下防止以后忘记怎么弄. 本人用的是poi3.8,所以需要的JAR包如下: poi-3.8.jar ...
- java如何导入Excel文件
Java使用POI导入Excel文件,操作起来比较简单,支持xlsx格式. 下载POI资源包 从官网https://poi.apache.org/下载POI,笔者选择的是版本是3.17,下载后文件名是 ...
- java解析导入excel表格转为实体类javabean,根据实体类中的中文名称
最近公司需求解析excel,一开始使用poi做的挺好的,后来直接上了几十万条数据的excel文件,内存直接溢出了,网上查到apache poi还提供了专门处理海量数据的方法,使用sax解析,果然用了内 ...
- java poi导入Excel(个人代码)
案例使用的框架:jsp+spring+mybaties <form id="importForm" name="importForm" method=&q ...
- Java实现导入Excel文件
一.配置文件名称.路径.内容: <bean id="multipartResolver" class="org.springframework.web.multip ...
- excel文件后台代码
很多情况下,我们都需要从Excel中获取数据来创建Word报表文档.首先在Excel中分析数据,然后将分析结果导出到Word文档中发布.技术实现方式:1.创建Word模板,用来作为数据分析结果发布平台 ...
- Java jxl导入excel文件,导入的数字、身份证号码、手机号变成了科学计数法,解决方案
原文出自:https://blog.csdn.net/seesun2012 这是一个execl文件导入数据库操作,使用jxl解析execl导入数据库过程出现了科学计数法,与想要导入的数据不匹配,以下是 ...
- java上传excel文件及解析
java上传excel文件及解析 CreateTime--2018年3月5日16:25:14 Author:Marydon 一.准备工作 1.1 文件上传插件:swfupload: 1.2 文件上 ...
随机推荐
- matplotlib的annotate用法小结
这个是matplotlib自定义的annotate方法的文本: 一. def annotate(self, s, xy, *args, **kwargs): a = mtext.Annotation( ...
- Selenium Webdriver——操作隐藏的元素display属性
有时候我们会碰到一些元素不可见,这个时候selenium就无法对这些元素进行操作了.例如,下面的情况: 页面主要通过“display:none”来控制整个下拉框不可见.这个时候如果直接操作这个下拉框, ...
- 图论·Floyd算法·HDU2544&1874 (伪)2066
在看到1874的题时,第一反应是用上一篇的并查集方法,后来查了一下是要用Floyd做,所以就去查Floyd算法的资料. 即插点法,是一种用于寻找给定的加权图中顶点间最短路径的算法. 核心代码: ma ...
- LightOJ - 1189 - Sum of Factorials
先上题目 Sum of Factorials Time Limit:500MS Memory Limit:32768KB 64bit IO Format:%lld & %llu ...
- java反射意义
JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法:对于任意一个对象,都能够调用它的任意方法和属性:这种动态获取信息以及动态调用对象方法的功能称为java语言的反射机制. ...
- Java高级程序猿技术积累
watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQveDczNDQwMDE0Ng==/font/5a6L5L2T/fontsize/400/fill/I0JBQk ...
- ssh 结构
service:业务层 dao:数据訪问层 hibernate:持久层
- soapui icon以及resource的理解
https://www.soapui.org/getting-started/soapui-interface/main-window.html 以调用博客园的api为例 第一个是域名 第二个是res ...
- linux系统在线搭建禅道
1.先安装wget:yum -y install wget 2.下载安装禅道:[root@zhaowen ~]# wget http://dl.cnezsoft.com/zentao/9.0.1/Ze ...
- BZOJ 1116 并查集
思路: 如果 每个联通块 边数>=点数 就OK 用并查集搞 //By SiriusRen #include <cstdio> #include <cstring> #in ...