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; } }