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