1.項(xiàng)目中添加POISpringMVC集成
?1.1?導(dǎo)出
???1.1.1?Employee
@Entity
@Table(name = "employee")
public class Employee extends BaseDomain{
@Excel(name = "用戶(hù)名")//一定要和Excel表上面對(duì)應(yīng)上
private String username;
private String password;
@Excel(name = "郵件")
private String email;
@Excel(name = "年齡")
private Integer age;
@Excel(name = "頭像",type = 2,savePath = "/images/head")
private String headImage;//圖片 頭像
@ManyToOne(fetch = FetchType.LAZY)//多對(duì)一.多個(gè)員工屬于一個(gè)部門(mén)
@JoinColumn(name = "department_id")
@ExcelEntity
private Department department;//部門(mén)
- Department
@Entity
@Table(name = "department")
public class Department extends BaseDomain{
@Excel(name = "部門(mén)")
private String name;
???1.1.2?準(zhǔn)備一個(gè)按鈕《導(dǎo)出》---Employss.jsp
<button type="submit" class="easyui-linkbutton" iconCls="icon-search">下載</button>

image.png
???1.1.3?EmployeeController加一個(gè)導(dǎo)出功能
//download下載
@RequestMapping("/download")
public String download(ModelMap map, EmployeeQuery query, HttpServletRequest request){
//要導(dǎo)出的數(shù)據(jù) 獲取到
List<Employee> list = employeeService.queryAll(query);
//主要是為了顯示頭像
//拿到項(xiàng)目的運(yùn)行路徑-----【絕對(duì)路徑】
String realPath = request.getServletContext().getRealPath("");//拿到運(yùn)行然后拼接
//進(jìn)行拼接,把頭像的路徑e.getHeadImage()拼接出來(lái)----【遍歷導(dǎo)出的數(shù)據(jù)list】
list.forEach(e->System.out.println(realPath + e.getHeadImage()));
//設(shè)置導(dǎo)出的Excel的一些參數(shù),表頭、頁(yè)名、版本
ExportParams exportParams = new ExportParams("title", "sheetName", ExcelType.XSSF);
//這個(gè)就是導(dǎo)出來(lái)的數(shù)據(jù) 鎖定多少列。不可以動(dòng)
exportParams.setFreezeCol(1);
//數(shù)據(jù)集合
map.put(NormalExcelConstants.DATA_LIST,list );
//導(dǎo)出實(shí)體
map.put(NormalExcelConstants.CLASS,Employee.class);
//文件名稱(chēng)
map.put(NormalExcelConstants.FILE_NAME,"employee");
//參數(shù)
map.put(NormalExcelConstants.PARAMS,exportParams);
return NormalExcelConstants.EASYPOI_EXCEL_VIEW;
}
}
???1.1.4?當(dāng)點(diǎn)擊導(dǎo)出的時(shí)候,出現(xiàn)報(bào)錯(cuò)

404--視圖解析器 自動(dòng)加了前綴后綴
????在配置一個(gè)視圖解析器【applicationController-mvc.xml】
<!--新搞一個(gè)視圖解析器【但是現(xiàn)在兩個(gè)視圖器。所以要配置優(yōu)先級(jí)】-->
<bean class="org.springframework.web.servlet.view.BeanNameViewResolver">
<property name="order" value="1"/>
</bean>
導(dǎo)出現(xiàn)在沒(méi)有頭像,因?yàn)轭^像找得是絕對(duì)路徑。他現(xiàn)在無(wú)法定位到,他找的是盤(pán)符。
- EmployeeController中加上----拿到頭像路徑【把真實(shí)路徑拼接出來(lái)】
//主要是為了顯示頭像
//拿到項(xiàng)目的運(yùn)行路徑-----【絕對(duì)路徑】
String realPath = request.getServletContext().getRealPath("");//拿到運(yùn)行然后拼接
//進(jìn)行拼接,把頭像的路徑e.getHeadImage()拼接出來(lái)----【遍歷導(dǎo)出的數(shù)據(jù)list】
list.forEach(e->System.out.println(realPath + e.getHeadImage()));
???1.1.5?根據(jù)查詢(xún)條件導(dǎo)出
把<a>標(biāo)簽 改成<button>
<button>----是直接提交表單 把路徑直接填到from表單上面
后臺(tái)在接收一下,在參數(shù)加上EmployeeQuery的參數(shù)。查詢(xún)的時(shí)候改成Query的根據(jù)條件查詢(xún)方法
?1.2?導(dǎo)入
???1.2.1?新建Controller
@Controller
@RequestMapping("/uploading")
public class uploadingController {
@Autowired
private IDepartmentService departmentService;
@Autowired
private IEmployeeService employeeService;
@RequestMapping("/index")
public String index(){
return "uploading";
}
}
???1.2.2?在WEB-INF/views/下面加一個(gè)頁(yè)面
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Title</title>
<%@ include file="/WEB-INF/views/head.jsp"%>
</head>
<body>
<form action="/uploading/employeeJudge" method="post" enctype="multipart/form-data">
<%--enctype="multipart/form-data ---【上傳就要加這個(gè)屬性】--%>
<input class="easyui-filebox" name="empFile" style="width:80%"
data-options="prompt:'選擇一個(gè)文件...',buttonText: '選擇文件'" />
<button class="easyui-linkbutton">上傳</button>
</form>
</body>
</html>

上傳必須要加enctype="multipart/form-data"
???1.2.3?接收文件里面的數(shù)據(jù)
- 在Controller中在加方法--拿到數(shù)據(jù)
@RequestMapping("/employeeJudge")
public String employeeJudge(MultipartFile empFile)throws Exception{
ImportParams params = new ImportParams();
params.setHeadRows(1);//不要第0行
List<Employee> list = ExcelImportUtil.importExcel(empFile.getInputStream(), Employee.class, params);
list.forEach(e->{
Department department = e.getDepartment();//拿部門(mén)
if (department!=null){
String name = e.getDepartment().getName();//拿到部門(mén)名稱(chēng)
Department byName = departmentService.findByName(name);//根據(jù)部門(mén)名稱(chēng)拿到對(duì)應(yīng)部門(mén)
e.setDepartment(byName);//把部門(mén)放到員工對(duì)象去
}
employeeService.save(e);//把員工保存到數(shù)據(jù)庫(kù)
});
return "uploading";
}
- DepartmentRepository-----------
Department findByName(String name); - IDepartmentService -----------
Department findByName(String name); - DepartmentServiceImpl
@Autowired
private DepartmentRepository departmentRepository;
@Override
public Department findByName(String name) {
return departmentRepository.findByName(name);
}
???1.2.4?在EmployeeServiceImpl的判斷里面加一句判斷
傳的時(shí)候會(huì)報(bào)錯(cuò)空指針,因?yàn)槟阍诒4娴臅r(shí)候加了密碼加密的方法。傳過(guò)去的時(shí)候沒(méi)有密碼,密碼為空 就報(bào)500空指針
我們?cè)贓mployeeServiceImpl設(shè)一個(gè)初始密碼
- 就是一個(gè)三目運(yùn)算,如果有密碼就用它的,如果沒(méi)有密碼就設(shè)置初始密碼。。。。
//這里加一句代碼,設(shè)置初始面。因?yàn)樯蟼鲿r(shí)如果沒(méi)有密碼會(huì)報(bào)錯(cuò)---[三目運(yùn)算 如果有就用他的,沒(méi)有就默認(rèn)]
String password = StringUtils.isNotBlank(employee.getPassword())?employee.getPassword():"123456";
?1.3?Excel導(dǎo)入校驗(yàn)
導(dǎo)入的時(shí)候想要做一些驗(yàn)證。比如用戶(hù)名不能為空、年齡大于18小于60、郵件不能為空、用戶(hù)名不能重復(fù)
- 我們要做的就是 導(dǎo)入---成功的話(huà)就不管,如果失敗的話(huà)就自動(dòng)下載一個(gè)文件,這個(gè)文件里面寫(xiě)著失敗的某條,并且把失敗原因?qū)懺诶锩?/li>
???1.3.1?導(dǎo)入規(guī)范包JSR 303
<!--JSR 303 規(guī)范包-->
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-validator</artifactId>
<version>5.2.4.Final</version>
</dependency>
???1.3.2?Employee
@Excel(name = "用戶(hù)名")//一定要和Excel表上面對(duì)應(yīng)上
@NotNull//該字段不能為空
private String username;
private String password;
@Excel(name = "郵件")
@NotNull
private String email;
@Excel(name = "年齡")
@Max(value = 60,message = "年齡不能超過(guò)60")
@Min(value = 18,message = "年齡不能小于18")
private Integer age;
???1.3.3?在Controller的方法中添加上驗(yàn)證
//注入閘門(mén)寫(xiě)的工具類(lèi) 專(zhuān)門(mén)自定義的驗(yàn)證
@Autowired
private EmployeeExcelVerifyHandler handler;
...
@RequestMapping("/employeeJudge")
public String employeeJudge(MultipartFile empFile, HttpServletResponse response)throws Exception{
ImportParams params = new ImportParams();
params.setHeadRows(1);//不要第0行
params.setNeedVerfiy(true);//讓他支持驗(yàn)證
params.setVerifyHandler(handler);//加上咋們自己定義的驗(yàn)證
//拿到導(dǎo)入的數(shù)據(jù)
ExcelImportResult<Employee> result= ExcelImportUtil.importExcelMore(empFile.getInputStream(), Employee.class, params);
//成功數(shù)據(jù)保存
result.getList().forEach(e->{
Department department = e.getDepartment();//拿部門(mén)
if (department!=null){
String name = e.getDepartment().getName();//拿到部門(mén)名稱(chēng)
Department byName = departmentService.findByName(name);//根據(jù)部門(mén)名稱(chēng)拿到對(duì)應(yīng)部門(mén)
e.setDepartment(byName);//把部門(mén)放到員工對(duì)象去
}
employeeService.save(e);//把員工保存到數(shù)據(jù)庫(kù)
});
//上面是正確了就保存,下面是錯(cuò)誤了,導(dǎo)出來(lái)
boolean verfiyFail = result.isVerfiyFail();//確認(rèn)是否有錯(cuò)誤數(shù)據(jù)
if (verfiyFail) {//判斷如果有錯(cuò)誤信息就。。執(zhí)行下面方法
Workbook failWorkbook = result.getFailWorkbook();//當(dāng)判斷有就用流導(dǎo)出來(lái)
response.setContentType("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet");
response.setHeader("Content-disposition", "attachment;filename=employee.xlsx");
response.setHeader("Pragma", "No-cache");//設(shè)置不要緩存
OutputStream ouputStream = response.getOutputStream();
failWorkbook.write(ouputStream);
ouputStream.flush();
ouputStream.close();
}
return "uploading";
}
???1.3.4?唯一性校驗(yàn)
上面只是判斷了不為空可年齡范圍,下面來(lái)規(guī)范用戶(hù)名不重復(fù)(唯一性校驗(yàn))
新建接口----【工具類(lèi)EmployeeExcelVerifyHandler 】
/**
* 自定義驗(yàn)證
*/
@Component//不知道什么層 的注解
public class EmployeeExcelVerifyHandler implements IExcelVerifyHandler<Employee>{
@Autowired
private IEmployeeService employeeService;
@Override
public ExcelVerifyHandlerResult verifyHandler(Employee employee) {
ExcelVerifyHandlerResult excelVerifyHandlerResult = new ExcelVerifyHandlerResult(true);
//通過(guò)用戶(hù)名獲取用戶(hù)
Employee byUsername = employeeService.findByUsername(employee.getUsername());
if (byUsername!=null){
//excelVerifyHandlerResult不為空,就代表這個(gè)用戶(hù)是存在的,就應(yīng)該添加失敗
excelVerifyHandlerResult = new ExcelVerifyHandlerResult(false,"用戶(hù)名重復(fù)");
}
return excelVerifyHandlerResult;
}
}
掃描之后就可以加入注入
- 成功之后直接接入
-
如果有錯(cuò)誤數(shù)據(jù)---導(dǎo)出打印
SpringMVC掃描
2、數(shù)據(jù)字典
-
對(duì)于相同的表的抽取,注:沒(méi)有什么業(yè)務(wù)意義的



