JeeSite的Excel匯入、匯出
阿新 • • 發佈:2019-01-08
介紹:
對Apache POI 3.9的簡單封裝,實現Excel的匯出匯入功能。使用Annotation定義匯出匯入欄位。http://jeesite.com
優點:
- 簡單易用,支援大數量匯出,配置簡單,程式碼量少。
- 支援Excel 2003、2007、2010(xls、xlsx)格式。
- 支援簡單格式設定,對齊方式,排序等
- 可匯出字典型別資料,自定義資料欄位型別(例如:部門關聯物件,部門名稱與部門編號互轉)。
- 無需建立匯入模板,系統自動生成。
缺點:
- 格式單一,無法匯出格式比較複雜的表格。
- 不能使用模板進行匯入,匯出。
使用示例:
1、匯出實體物件中的annotation的定義(ExcelField說明見:5、
- @Entity
- @Table(name = "sys_user")
- publicclass User extends BaseEntity {
- private Long id; // 編號
- ...
- ...
- ...
- private List<Role> roleList = Lists.newArrayList(); // 擁有角色列表
- @Id
- @ExcelField(title="ID", type=1, align=2, sort=1)
- public Long getId() {
- return id;
- }
- @ManyToOne
- @ExcelField(title="所屬區域", align=2, sort=10)
- public Area getArea() {
- return area;
- }
- @ManyToOne
- @ExcelField(title="所屬部門", align=2, sort=20)
- public Office getOffice() {
- return office;
- }
- @Length(min=1, max=100)
- @ExcelField(title="姓名", align=2, sort=40)
- public String getName() {
- return name;
- }
- @Length(min=0, max=100)
- @ExcelField(title="使用者型別", align=2, sort=80, dictType="sys_user_type")
- public String getUserType() {
- return userType;
- }
- @ExcelField(title="建立時間", type=0, align=1, sort=90)
- public Date getCreateDate() {
- return createDate;
- }
- @ExcelField(title="最後登入日期", type=1, align=1, sort=110)
- public Date getLoginDate() {
- return loginDate;
- }
- @ManyToMany
- @ExcelField(title="擁有角色", align=1, sort=800, fieldType=RoleListType.class)
- public List<Role> getRoleList() {
- return roleList;
- }
- }
2、Excel匯出示例:
- public String exportFile(User user) {
- try {
- String fileName = "使用者資料"+DateUtils.getDate("yyyyMMddHHmmss")+".xlsx";
- // 查詢資料
- Page<User> page = systemService.findUser(new Page<User>(request, response, -1), user);
- // 1:建立Excel匯出物件;2:設定資料;3:寫入輸出流;4:臨時資料銷燬
- new ExportExcel("使用者資料", User.class)
- .setDataList(page.getList())
- .write(response, fileName)
- .dispose();
- returnnull;
- } catch (Exception e) {
- addFlashMessage("匯出使用者失敗!失敗資訊:"+e.getMessage());
- }
- return"redirect:"+BaseController.ADMIN_PATH+"/sys/user/?repage";
- }
3、Excel 匯入示例:
- public String importFile(MultipartFile file) {
- try {
- int successNum = 0;
- int failureNum = 0;
- StringBuilder failureMsg = new StringBuilder();
- // 建立匯入Excel物件
- ImportExcel ei = new ImportExcel(file, 1, 0);
- // 獲取傳入Excel檔案的資料,根據傳入引數型別,自動轉換為物件
- List<User> list = ei.getDataList(User.class);
- // 遍歷資料,儲存資料
- for (User user : list){
- try{
- if ("true".equals(checkLoginName("", user.getLoginName()))){
- user.setPassword(SystemService.entryptPassword("123456"));
- BeanValidators.validateWithException(validator, user);
- systemService.saveUser(user);
- successNum++;
- }else{
- failureMsg.append("<br/>登入名 "+user.getLoginName()+" 已存在; ");
- failureNum++;
- }
- }catch(ConstraintViolationException ex){
- failureMsg.append("<br/>登入名 "+user.getLoginName()+" 匯入失敗:");
- List<String> messageList = BeanValidators.extractPropertyAndMessageAsList(ex, ": ");
- for (String message : messageList){
- failureMsg.append(message+"; ");
- failureNum++;
- }
- }catch (Exception ex) {
- failureMsg.append("<br/>登入名 "+user.getLoginName()+" 匯入失敗:"+ex.getMessage());
- }
- }
- if (failureNum>0){
- failureMsg.insert(0, ",失敗 "+failureNum+" 條使用者,匯入資訊如下:");
- }
- addFlashMessage("已成功匯入 "+successNum+" 條使用者"+failureMsg);
- } catch (Exception e) {
- addFlashMessage("匯入使用者失敗!失敗資訊:"+e.getMessage());
- }
- return"redirect:"+BaseController.ADMIN_PATH+"/sys/user/?repage";
- }
4、Excel 匯入模板下載示例
- public String importFileTemplate() {
- try {
- String fileName = "使用者資料匯入模板.xlsx";
- List<User> list = Lists.newArrayList(); list.add(UserUtils.getUser(true));
- // 第三個引數設定為“2”表示輸出為匯入模板(1:匯出資料;2:匯入模板)
- new ExportExcel("使用者資料", User.class, 2).setDataList(list).write(response, fileName).dispose();
- returnnull;
- } catch (Exception e) {
- addFlashMessage("匯出使用者失敗!失敗資訊:"+e.getMessage());
- }
- return"redirect:"+BaseController.ADMIN_PATH+"/sys/user/?repage";
- }
5、ExcelField定義說明:
- /**
- * Copyright © 2012-2013 <a href="https://github.com/thinkgem/jeesite">JeeSite</a> All rights reserved.
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- */
- package com.thinkgem.jeesite.common.utils.excel.annotation;
- import java.lang.annotation.ElementType;
- import java.lang.annotation.Retention;
- import java.lang.annotation.RetentionPolicy;
- import java.lang.annotation.Target;
- /**
- * Excel註解定義
- * @author ThinkGem
- * @version 2013-03-10
- */
- @Target({ElementType.METHOD, ElementType.FIELD, ElementType.TYPE})
- @Retention(RetentionPolicy.RUNTIME)
- public@interface ExcelField {
- /**
- * 匯出欄位名(預設呼叫當前欄位的“get”方法,如指定匯出欄位為物件,請填寫“物件名.物件屬性”,例:“area.name”、“office.name”)
- */
- String value() default"";
- /**
- * 匯出欄位標題
- */
- String title();
- /**
- * 欄位型別(0:匯出匯入;1:僅匯出;2:僅匯入)
- */
- int type() default0;
- /**
- * 匯出欄位對齊方式(0:自動;1:靠左;2:居中;3:靠右)
- */
- int align() default0;
- /**
- * 匯出欄位欄位排序(升序)
- */
- int sort() default0;
- /**
- * 如果是字典型別,請設定字典的type值
- */
- String dictType() default"";
- /**
- * 反射型別
- */
- Class<?> fieldType() default Class.class;
- }