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