easyPOI的上傳和下載(導入和導出功能)


  1. Java操作辦公室軟件的框架

a)       jxl:只能對Excel進行操作,屬於比較老的框架。
          POI:是apache的項目,可對ms(微軟)的word,Excel,PPT進行操作,包括office2003和2007。

b)       POI框架學習

                     i.            導包

                   ii.            第一個demo

  1. EasyPOI導入導出

a)       導入easyPOI的包

<!-- easypoi的支持 -->
<dependency>
  <groupId>cn.afterturn</groupId>
  <artifactId>easypoi-base</artifactId>
  <version>3.2.0</version>
</dependency>
<dependency>
  <groupId>cn.afterturn</groupId>
  <artifactId>easypoi-web</artifactId>
  <version>3.2.0</version>
</dependency>
<dependency>
  <groupId>cn.afterturn</groupId>
  <artifactId>easypoi-annotation</artifactId>
  <version>3.2.0</version>
</dependency>

b)      

在我們要進行數據操作的實體類中的屬性上打上@Excel(name=”XXX”)
這里的savePath表示是圖片在項目中的路徑
@Excel(name = "頭像",type = 2,savePath = "/images/head",height = 23)
private String headImage; //頭像的導出
如果是關聯對象的話在關聯對象的屬性上面打上@ExcelEntity
@ExcelEntity
private Department department;

c)        前台JSP頁面添加按鈕后台寫業務邏輯,傳入ModelMap,query,request作為參數,寫完之后需要在Springmvc的xml配置文件中去配置掃描easypoi的一些view:視圖
傳入的request參數用來解決圖片路徑問題,request獲取項目根路徑與圖片路徑拼接。

d)   在Employee對象里面去加@Excel注解

@Entity
@Table(name="employee")
public class Employee extends BaseDomain {
    @Excel(name="用戶名")
    private String username;
    private String password;
    @Excel(name="郵件",width = 25)
    private String email;
    @Excel(name="年紀")
    private Integer age;

    @Excel(name = "頭像",type = 2,savePath = "/images/head",height = 23)
    private String headImage; //頭像

    @ManyToOne(fetch = FetchType.LAZY)
    @JoinColumn(name="department_id")
    //Json Ignore(忽略) Properties(屬性)
    //@JsonIgnoreProperties(value={"hibernateLazyInitializer","handler","fieldHandler"})
    @ExcelEntity
    private Department department;

   這里必須寫get和set方法

}

部門有相應的關連

@Entity
@Table(name="department")
public class Department extends BaseDomain {

    @Excel(name = "部門名稱")
    private String name;

}

e)employee.JSP 頁面添加按鈕

<form id="searchForm" action="/employee/download">
    用戶名: <input name="username" class="easyui-textbox" style="width:80px">
    郵件: <input name="email" class="easyui-textbox" style="width:80px">
    部門:<input name="departmentId" class="easyui-combobox" name="dept"
              panelHeight="auto"
              data-options="valueField:'id',textField:'name',url:'/util/dept'" />

    <a href="#" class="easyui-linkbutton" data-method="search" iconCls="icon-search">查詢</a>
    <!--  button不加type屬性就是提交 -->
    <button class="easyui-linkbutton" iconCls="icon-search">導出</button>
</form>

f)EmployeeController文件下載實現

//    文件導出功能

/**
*
* @param map
* @param employeeQuery
* @param request
* @return
*/
@RequestMapping("/download")
public String downloadExcel(ModelMap map,EmployeeQuery employeeQuery, HttpServletRequest request){
System.out.println("--------------");
// 查詢獲取到所有的數據
List<Employee> list = employeeService.findByQuery(employeeQuery);
// 解決加載圖片時的路徑拼接問題
String realPath = request.getServletContext().getRealPath("/");
for (Employee employee : list) {
employee.setHeadImage(realPath+employee.getHeadImage());
System.out.println(employee.getHeadImage());
}

// 設置下載表格的一些屬性
ExportParams exportParams = new ExportParams("員工管理","明細", ExcelType.XSSF);
// 導出的集合
map.put(NormalExcelConstants.DATA_LIST, list); // 數據集合
map.put(NormalExcelConstants.CLASS, Employee.class);//導出實體
map.put(NormalExcelConstants.PARAMS, exportParams);//參數
map.put(NormalExcelConstants.FILE_NAME, "employee");//文件名稱
//返回的名稱 :easypoiExcelView -> 並沒有找我的bean,而且當做一個路徑去進行訪問
// 現在默認去找的視圖解析器,而沒有找我的那一個bean
// return "forward:/WEB-INF/views/employee.jsp";//View名稱,這如果不去MVC的配置文件去坐配置,它會默認去找我媽自己配置的視圖解析器,而我們根本沒有這個頁面,就會報404,
 所以要在配置文件去添加掃描easypoi的一些view:視圖導出文件時優先找這個視圖解析器出理
return NormalExcelConstants.EASYPOI_EXCEL_VIEW;//View名稱
}


添加Springmvc.xml的配置
<!-- 掃描easypoi的一些view:視圖 -->
<context:component-scan base-package="cn.afterturn.easypoi.view" />
<!--導出文件時優先找這個視圖解析器出理-->
<!-- bean的視圖解析器 p:order="0":順序在最前面 -->
<bean id="beanNameViewResolver" class="org.springframework.web.servlet.view.BeanNameViewResolver"
p:order="0" />

d)       easyPOI的文件上傳

i.            准備一個上傳文件的頁面import.JSP

<%--這是個文件上傳的頁面--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Title</title>
<%@include file="/WEB-INF/views/head.jsp" %>
</head>
<body>
<!-- 上傳必需是:post,enctype="multipart/form-data"-->
<form action="/import/employeeXlsx" method="post" enctype="multipart/form-data">
<input class="easyui-filebox" name="empFile" style="width:80%"
data-options="prompt:'選擇一個文件...',buttonText: '選擇文件'" />
<button class="easyui-linkbutton">導入</button>
</form>
</body>
</html>

   ii.            寫一個文件上傳的controller,先跳轉到頁面,再到后台進行文件上傳,進行文件上傳的時候傳入MultipartFile empFile, HttpServletResponse response這兩個關鍵的對象,
如果說要對導入的數據進行一個驗證的話,就需要導入easyPOI的驗證包,然后在controller層開啟這個驗證。

@Controller
@RequestMapping("/import")
public class ImportController {
@Autowired
private IDepartmentService departmentService;
@Autowired
private IEmployeeService employeeService;

@RequestMapping("/index")
public String index(){
return "import";
}

// 具備驗證的導入管理
@RequestMapping("/employeeXlsx")
public String employeeXlsx(MultipartFile empFile, HttpServletResponse response) throws Exception {
// 准備要導入的參數
ImportParams params = new ImportParams();
// 設置從第一行開始導入
params.setTitleRows(1);
// 啟動導入時的一個驗證功能
params.setNeedVerfiy(true);

// 獲取導入Excel的方法
ExcelImportResult<Employee> result = ExcelImportUtil.importExcelMore(empFile.getInputStream(), Employee.class, params);
List<Employee> List = result.getList();
// 將正確的list進行保存到數據庫
for (Employee employee : List) {
// 解決導入數據時部門問題
Department department = departmentService.findByName(employee.getDepartment().getName());
employee.setDepartment(department);
// employee.setUsername("1111");
// employee.setPassword("2222");
// System.out.println(employee.getUsername());
// 將數據存儲到數據庫
employeeService.save(employee);
}
// 將錯誤的list印出來不保存到數據庫
List<Employee> failList = result.getFailList();
for (Employee employee : failList) {
System.out.println("有問題的employee"+employee);
}
//如果有錯誤,就直接導出錯誤文件到前台
// Verfiy:檢驗 Fail:失敗
if(result.isVerfiyFail()){
//如果驗證失敗,代碼到這里面來
//失敗的文件已經准備好了
Workbook failWorkbook = result.getFailWorkbook();
//把這個文件導出
response.setContentType("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet"); //mime類型
response.setHeader("Content-disposition", "attachment;filename=error.xlsx");
response.setHeader("Pragma", "No-cache");//設置不要緩存
OutputStream ouputStream = response.getOutputStream();
failWorkbook.write(ouputStream);
ouputStream.flush();
ouputStream.close();
}

return "import";
}

}

注意頁面導入文件的文件屬性名要與controller中參數的名稱對應,

如果要對導入的數據進行驗證的話就要導入EasyPOI驗證的jar包

<!-- JSR 303 規范驗證包 -->
<dependency>
  <groupId>org.hibernate</groupId>
  <artifactId>hibernate-validator</artifactId>
  <version>5.2.4.Final</version>
</dependency>

然后在實體類上加上相應的驗證的注解

public class Employee{

@Excel(name="用戶名")
@NotNull(message = "用戶名不為空")
private String username;
private String password;
@Excel(name="郵件",width = 25)
private String email;
@Excel(name="年紀")
@Max(value = 80,message = "max 最大值不能超過80")
private Integer age;

getset方法

}

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM