EasyPOI結合SpringMVC使用

easypoi view 項目是爲了更簡單的方便搭建在導出時候的操作,利用spring mvc 的view 封裝,更加符合spring mvc的風格 view下面包括多個 view的實現
* EasypoiBigExcelExportView 大數據量導出
* EasypoiMapExcelView map 列表導出
* EasypoiPDFTemplateView pdf導出
* EasypoiSingleExcelView 註解導出
* EasypoiTemplateExcelView 模板導出
* EasypoiTemplateWordView word模板導出
* MapGraphExcelView 圖表導出
 
view的是使用方法大同小異,都有一個對應的bean,裏面保護指定的參數常量 同意用modelmap.put(‘常量參數名’,‘值’)就可以,最後返回這個view名字
註解目錄掃描的時候加上 cn.afterturn.easypoi.view 就可以使用了
 

實例

1.applicationContext-mvc.xml

<!-- 掃描easypoi中所有的view -->
<context:component-scan base-package="cn.afterturn.easypoi.view" />
<!-- Bean解析器,級別高於默認解析器,尋找bean對象進行二次處理 -->
<bean id="beanNameViewResolver"
      class="org.springframework.web.servlet.view.BeanNameViewResolver" p:order="1">
</bean>

2.controller層

導出

/**
*導出
*/
@RequestMapping("/export")
public String export(ModelMap map, EmployeeQuery query, HttpServletRequest request){
    //得到查找條件的結果
    List<Employee> list = employeeService.queryAll(query);
    //拿到當前項目的真實路徑
    String realPath = request.getServletContext().getRealPath("");
    list.forEach(e->{
        String headImage = e.getHeadImage();
        // 設置圖片路徑
        e.setHeadImage(realPath+headImage);
    });
    //設置一些屬性
    ExportParams params = new ExportParams("員工數據", "員工表", ExcelType.XSSF);
    //凍結
    //params.setFreezeCol(3);
    map.put(NormalExcelConstants.DATA_LIST, list); // 數據集合
    map.put(NormalExcelConstants.CLASS, Employee.class);//導出實體
    map.put(NormalExcelConstants.PARAMS, params);//參數
    map.put(NormalExcelConstants.FILE_NAME, "員工");//文件名稱
    //返回的名稱 :easypoiExcelView -> 並沒有找我的bean,而且當做一個路徑去進行訪問
    //  現在默認去找的視圖解析器,而沒有找我的那一個bean
    return NormalExcelConstants.EASYPOI_EXCEL_VIEW;//View名稱
}

導入

1.導入頁面

<!-- 上傳請配置enctype -->
<form action="/import/xlsx" method="post" enctype="multipart/form-data">
    <input class="easyui-filebox" name="xlsxFile" data-options="prompt:'選擇一個文件...'" style="width:80%">
    <button class="easyui-linkbutton" type="submit">確定</button>
</form>

2.controller層

    @RequestMapping("/xlsx")
    public String importXlsx(MultipartFile xlsxFile, HttpServletRequest request, HttpServletResponse response) throws Exception{
        ImportParams params = new ImportParams();
        params.setTitleRows(1); //注意:這裏有兩個表頭
        List<Employee> list = ExcelImportUtil.importExcel(
               xlsxFile.getInputStream(),
                Employee.class, params);
        for (Employee employee : list) {
            employee.setPassword("123"); //默認密碼123
            if(employee.getDepartment()!=null) {
                Department department = departmentService.findByName(employee.getDepartment().getName());
                employee.setDepartment(department);
            }
            employeeService.save(employee);
        }
        return "import";
    }
}

導入驗證功能

1.引入包

<dependency>
  <groupId>org.hibernate</groupId>
  <artifactId>hibernate-validator</artifactId>
  <version>5.2.4.Final</version>
</dependency>

2.domain類

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

3.controller層

  
  /**
     *導出
     */
    @RequestMapping("/employeeXlsx")
    public String employeeXlsx(MultipartFile empFile, HttpServletRequest request, HttpServletResponse response) throws Exception{
        //設置導入參數
        ImportParams params = new ImportParams();
        //設置標題和頭的行數
//        params.setTitleRows(1);
        params.setHeadRows(1);
        //設置需要驗證爲true
        params.setNeedVerfiy(true);
        //設計驗證規則  自己定義的校驗器
        params.setVerifyHandler(employeeVerifyHandler);
        //把上傳的文件變成數據   導入時拿到更多的信息
        ExcelImportResult<Employee> result = ExcelImportUtil.importExcelMore(
                empFile.getInputStream(),
                Employee.class, params);
        //正確的數據直接保存
        result.getList().forEach(e->{
            //設置一個默認密碼
            e.setPassword("123456");
            //獲取部門對象
            if(e.getDepartment()!=null) {
                Department department = departmentService.findByName(e.getDepartment().getName());
                e.setDepartment(department);
            }
            employeeService.save(e);
        });
        //有錯誤的數據返回工作薄給前臺
        if(result.isVerfiyFail()){
            Workbook workbook = result.getFailWorkbook();
            //設置響應頭
            response.setHeader("content-disposition", "attachment;filename=error.xlsx");
            ServletOutputStream out = response.getOutputStream();
            workbook.write(out);
            out.flush();
        }
        return "import";
    }

4.自定義驗證

自定義驗證需要實現IExcelVerifyHandler接口
(注:讓Spring來掃描到這個類)
 
@Component
public class MyVerifyHandler implements IExcelVerifyHandler<Employee> {

    @Autowired
    private IEmployeeService employeeService;
    //驗證用戶名是否重複
    @Override
    public ExcelVerifyHandlerResult verifyHandler(Employee employee) {
        ExcelVerifyHandlerResult result = new ExcelVerifyHandlerResult();
        if (!employeeService.checkUsername(employee.getUsername())) {
            result.setMsg("該用戶已存在");
            result.setSuccess(false);
            return result;
        }
        result.setSuccess(true);
        return result;
    }
}

 

 
 
 
 
 
發佈了70 篇原創文章 · 獲贊 3 · 訪問量 5752
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章