1.導入poi相關jar包
對於只操作2003及以前版本的excel,只需要導入poi-XXX.jar ,如果還需要對2007及以後版本進行操作,則需要導入
poi-ooxml-XXX.jar
poi-ooxml-schemas-XXX.jar
2. 導入excel的工具類-ImportExcel
import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import org.apache.poi.ss.usermodel.*;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;
import java.io.InputStream;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
public class ImportExcel {
// abc.xls
public static boolean isXls(String fileName){
// (?i)忽略大小寫
if(fileName.matches("^.+\\.(?i)(xls)$")){
return true;
}else if(fileName.matches("^.+\\.(?i)(xlsx)$")){
return false;
}else{
throw new RuntimeException("格式不對");
}
}
public static List<Map<String, Object>> readExcel(String fileName, InputStream inputStream) throws Exception{
boolean ret = isXls(fileName);
Workbook workbook = null;
// 根據後綴創建不同的對象
if(ret){
workbook = new HSSFWorkbook(inputStream);
}else{
workbook = new XSSFWorkbook(inputStream);
}
Sheet sheet = workbook.getSheetAt(0);
// 得到標題行
Row titleRow = sheet.getRow(0);
int lastRowNum = sheet.getLastRowNum();
int lastCellNum = titleRow.getLastCellNum();
List<Map<String, Object>> list = new ArrayList<>();
for(int i = 1; i <= lastRowNum; i++ ){
Map<String, Object> map = new HashMap<>();
Row row = sheet.getRow(i);
for(int j = 0; j < lastCellNum; j++){
// 得到列名
String key = titleRow.getCell(j).getStringCellValue();
Cell cell = row.getCell(j);
cell.setCellType(CellType.STRING);
map.put(key, cell.getStringCellValue());
}
list.add(map);
}
workbook.close();
return list;
}
}
3. 編寫控制類
@RequestMapping("/staff/import.do")
@ResponseBody
public String importExcel(@RequestParam MultipartFile mFile){
try {
String fileName = mFile.getOriginalFilename();
// 獲取上傳文件的輸入流
InputStream inputStream = mFile.getInputStream();
// 調用工具類中方法,讀取excel文件中數據
List<Map<String, Object>> sourceList = ImportExcel.readExcel(fileName, inputStream);
// 將對象先轉爲json格式字符串,然後再轉爲List<SysUser> 對象
ObjectMapper objMapper = new ObjectMapper();
String infos = objMapper.writeValueAsString(sourceList);
// json字符串轉對象
// Staff是我們寫的成員實體類po
List<Staff> list = objMapper.readValue(infos, new TypeReference<List<Staff>>() {});
// 批量添加
// 這是我們寫的批量添加成員的服務類
staffService.addStaffBatch(list);
return "操作成功";
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
return "操作失敗";
}
}
4. 編寫jsp代碼
<form id="importForm" method="post" action="/staff/import.do" enctype="multipart/form-data">
<input type="file" class="btn btn-primary" size="60" name="xlsFile" id="xlsFile"/>
<input type="submit" class="btn btn-primary fa fa-search" size="60" value="批量導入"/>
</form>
5. 還要配置spring-bean.xml
<!-- 文件上傳的解析器 id的值不能改-->
<bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
<!-- 上傳文件的最大大小 ,單位字節 ,比如 1024 * 1024 = 1M-->
<property name="maxUploadSize" value="1048576"></property>
</bean>
6. 注意
excel文件的列名要與Po實體的屬性名對應上,要不轉換出錯
對於有date類型的數據,excel輸入2019-12-12會變爲日期格式數據,日期類型傳到後臺時會轉成字符串,其格式會出錯,就無法轉換Date類型。
所以Excel表格一定要將時間相關數據用文本格式存儲!!!
數據庫對應實體類與時間相關屬性要添加@DateTimeFormat(pattern=“yyyy-MM-dd”)註解。