springboot2.2.X手冊:Easypoi導出excel,最新版的手感香不香?

目錄

包體引入

編寫導入導出工具類

編寫導入導出對象

編寫測試方法

導出結果

導入結果

問題


springboot2.2.X手冊:Easypoi導出excel,最新版的手感香不香?

 

POI 工具類,Excel的快速導入導出,Excel模板導出,Word模板導出,可以僅僅5行代碼就可以完成Excel的導入導出,修改導出格式簡單粗暴,快速有效,easypoi值得你嘗試

目前來說,Easypoi確實方便,官網也提供了三種不同的版本,它在開源中國還,還是非常出名的,用的人非常多,也是對他的一個認可。

springboot2.2.X手冊:Easypoi導出excel,最新版的手感香不香?

 

小編目前的項目,也是用這個來做,今天我們來做個excel的導入導出例子,看看怎麼使用?

包體引入

目前官方提供最新版本是4.2.0,但是我在使用過程中,總是報錯,時間關係就沒怎麼去查找,有興趣的同學可以呀研究一下,類找不到,這個是apache的一個類,估計是新版本需要引入別的包,沒去仔細追究。

java.lang.NoClassDefFoundError: org/apache/poi/xssf/usermodel/XSSFWorkbook
        <!-- springboot核心web -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>

        <!-- 引入EasyPoi包 -->
        <dependency>
            <groupId>cn.afterturn</groupId>
            <artifactId>easypoi-spring-boot-starter</artifactId>
            <version>4.1.0</version>
        </dependency>
        
        <dependency>
            <groupId>commons-fileupload</groupId>
            <artifactId>commons-fileupload</artifactId>
            <version>1.4</version>
        </dependency>

編寫導入導出工具類

/**
 * Excel枚舉類型
 * @author:溪雲閣
 * @date:2020年5月29日
 */

public enum ExcelTypeEnum {

    XLS("xls"), XLSX("xlsx");

    private String value;

    private ExcelTypeEnum(String value) {
        this.value = value;
    }

    public String getValue() {
        return value;
    }

    public void setValue(String value) {
        this.value = value;
    }
}
/**
 * Excel導出工具類
 * @author:溪雲閣
 * @date:2020年5月29日
 */
@Component
public class ExcelExportUtils {

    @Autowired
    private HttpServletResponse response;

    /**
     * 導出excel
     * @author 溪雲閣
     * @param list 泛型數據
     * @param title 標題
     * @param sheetName sheet的名稱
     * @param pojoClass 需要導出的對象
     * @param fileName 文件名稱
     * @param isCreateHeader 是否創建表頭
     * @throws IOException void
     */
    public void exportExcel(List<?> list, Class<?> pojoClass, String title, String sheetName, String fileName,
            boolean isCreateHeader) throws IOException {
        final ExportParams exportParams = new ExportParams(title, sheetName, ExcelType.XSSF);
        exportParams.setCreateHeadRows(isCreateHeader);
        baseExport(list, pojoClass, fileName, exportParams);
    }

    /**
     * 導出excel
     * @author 溪雲閣
     * @param list 泛型數據
     * @param title 標題
     * @param sheetName sheet的名稱
     * @param pojoClass 需要導出的對象
     * @param fileName 文件名稱
     * @param response
     * @throws IOException void
     */
    public void exportExcel(List<?> list, Class<?> pojoClass, String title, String sheetName, String fileName)
            throws IOException {
        baseExport(list, pojoClass, fileName, new ExportParams(title, sheetName, ExcelType.XSSF));
    }

    /**
     * 導出excel
     * @author 溪雲閣
     * @param list 泛型數據
     * @param pojoClass 需要導出的對象
     * @param fileName 文件名稱
     * @param exportParams 文件書香
     * @param response
     * @throws IOException void
     */
    public void exportExcel(List<?> list, Class<?> pojoClass, String fileName, ExportParams exportParams)
            throws IOException {
        baseExport(list, pojoClass, fileName, exportParams);
    }

    /**
     * 多個sheet導出
     * @author 溪雲閣
     * @param list
     * @param fileName
     * @throws IOException void
     */
    public void exportExcel(List<Map<String, Object>> list, String fileName) throws IOException {
        baseExport(list, fileName);
    }

    /**
     * 最基礎的對象導出
     * @author 溪雲閣
     * @param list 數據列表
     * @param pojoClass 導出對象
     * @param fileName 文件名稱
     * @param exportParams 導出文件屬性
     * @throws IOException void
     */
    private void baseExport(List<?> list, Class<?> pojoClass, String fileName, ExportParams exportParams)
            throws IOException {
        final Workbook workbook = ExcelExportUtil.exportExcel(exportParams, pojoClass, list);
        downLoadExcel(fileName, workbook);
    }

    /**
     * 最基礎的多sheet導出
     * @author 溪雲閣
     * @param list 多個不同數據對象的列表
     * @param fileName 文件名稱
     * @throws IOException void
     */
    private void baseExport(List<Map<String, Object>> list, String fileName) throws IOException {
        final Workbook workbook = ExcelExportUtil.exportExcel(list, ExcelType.HSSF);
        downLoadExcel(fileName, workbook);
    }

    /**
     * 文件下載
     * @author 溪雲閣
     * @param fileName 文件名稱
     * @param workbook exce對象
     * @throws IOException void
     */
    private void downLoadExcel(String fileName, Workbook workbook) throws IOException {
        ServletOutputStream output = null;
        try {
            final String downloadName = URLEncoder.encode(fileName + "." + ExcelTypeEnum.XLSX.getValue(), "UTF-8");
            response.setCharacterEncoding("UTF-8");
            response.setHeader("content-Type", "application/vnd.ms-excel");
            response.setHeader("Content-Disposition", "attachment;filename=" + downloadName);
            output = response.getOutputStream();
            workbook.write(output);
        }
        catch (final Exception e) {
            throw new IOException(e.getMessage());
        }
        finally {
            if (output != null) {
                output.flush();
                output.close();
            }
        }
    }

}
/**
 * Excel導入工具類
 * @author:溪雲閣
 * @date:2020年5月29日
 */
@Component
public class ExcelImportUtils {

    /**
     * 從指定位置獲取文件後進行導入
     * @author 溪雲閣
     * @param filePath 文件路徑
     * @param titleRows 表格標題行數,默認0
     * @param headerRows 表頭行數,默認1
     * @param pojoClass 上傳後需要轉化的對象
     * @return
     * @throws IOException List<T>
     */
    public <T> List<T> importExcel(String filePath, Integer titleRows, Integer headerRows, Class<T> pojoClass)
            throws Exception {
        if (Strings.isEmpty(filePath)) {
            return null;
        } else {
            final ImportParams params = new ImportParams();
            // 表格標題行數,默認0
            params.setTitleRows(titleRows);
            // 表頭行數,默認1
            params.setHeadRows(headerRows);
            // 是否需要保存上傳的Excel
            params.setNeedSave(true);
            // 保存上傳的Excel目錄
            params.setSaveUrl("/excel/");
            return ExcelImportUtil.importExcel(new File(filePath), pojoClass, params);
        }
    }

    /**
     * 上傳文件導入
     * @author 溪雲閣
     * @param file
     * @param titleRows 標題行
     * @param headerRows 表頭行
     * @param needVerfiy 是否檢驗excel內容
     * @param pojoClass 導入的對象
     * @return
     * @throws Exception List<T>
     */
    public <T> List<T> importExcel(MultipartFile file, Integer titleRows, Integer headerRows, boolean needVerfiy,
            Class<T> pojoClass) throws Exception {
        if (file == null) {
            return null;
        } else {
            return baseImport(file.getInputStream(), titleRows, headerRows, needVerfiy, pojoClass);
        }

    }

    /**
     * 最基礎導入
     * @author 溪雲閣
     * @param inputStream
     * @param titleRows 表格標題行數,默認0
     * @param headerRows 表頭行數,默認1
     * @param needVerify 是否需要檢測excel
     * @param pojoClass 導入的對象
     * @return
     * @throws IOException List<T>
     */
    private <T> List<T> baseImport(InputStream inputStream, Integer titleRows, Integer headerRows,
            boolean needVerify, Class<T> pojoClass) throws Exception {
        if (inputStream == null) {
            return null;
        } else {
            final ImportParams params = new ImportParams();
            params.setTitleRows(titleRows);
            params.setHeadRows(headerRows);
            params.setSaveUrl("/excel/");
            params.setNeedSave(true);
            params.setNeedVerify(needVerify);
            return ExcelImportUtil.importExcel(inputStream, pojoClass, params);
        }

    }

}

編寫導入導出對象

這裏,爲了覆蓋更全一點,我分別用了不同的類型來做實驗,數字類型採用NumberFormat進行格式化操作。

/**
 * 用戶信息
 * @author:溪雲閣
 * @date:2020年5月29日
 */
public class User implements Serializable {

    // 數字格式化
    private NumberFormat nf = NumberFormat.getNumberInstance();

    private static final long serialVersionUID = 1L;

    @Excel(name = "用戶id", orderNum = "0", width = 15)
    @Setter
    @Getter
    private long userId;

    @Excel(name = "性別", orderNum = "1", width = 15, replace = { "男_1", "女_2" }, suffix = "孩")
    @Setter
    @Getter
    private int sex;

    @Excel(name = "金錢", orderNum = "2", width = 15)
    @Setter
    private double money;

    public String getMoney() {
        return nf.format(money);
    }

    @Excel(name = "用戶信息", orderNum = "3", width = 15)
    @Setter
    @Getter
    private String userName;

    @Excel(name = "價格", orderNum = "4", width = 15)
    @Setter
    @Getter
    private float price;

    @Excel(name = "時間", orderNum = "5", width = 15, format = "yyyy-MM-dd")
    @Setter
    @Getter
    private Date now;

}

編寫測試方法

/**
 * excel導入導出
 * @author:溪雲閣
 * @date:2020年5月29日
 */
@Api(tags = { "APP服務:數據接口" })
@RestController
@RequestMapping("view/ie")
public class ImportExportController {

    @Autowired
    private ExcelExportUtils excelExportUtils;

    @Autowired
    private ExcelImportUtils excelImportUtils;

    /**
     * 導出用戶信息
     * @author 溪雲閣 void
     */
    @ApiOperation(value = "導出excel")
    @GetMapping(value = "/exportExcel")
    public void exportExcel() throws Exception {
        final List<User> userList = new ArrayList<>();
        for (int i = 0; i < 10; i++) {
            final User user = new User();
            user.setUserId(i);
            user.setSex(1);
            user.setMoney(12332123 + i);
            user.setUserName("小明" + i);
            user.setPrice(23.1f + i);
            user.setNow(new Date());
            userList.add(user);
        }
        excelExportUtils.exportExcel(userList, User.class, "用戶信息", "員工信息的sheet", "用戶信息表");
    }

    /**
     * 導入用戶信息
     * @author 溪雲閣
     * @param file
     * @return
     * @throws IOException Object
     */
    @ApiOperation(value = "導入excel")
    @GetMapping(value = "/importExcel")
    public ResponseMsg<List<User>> importExcel(@RequestParam("file") MultipartFile file) throws Exception {
        final List<User> userList = excelImportUtils.importExcel(file, 1, 1, false, User.class);
        return MsgUtils.buildSuccessMsg(userList);
    }

}

導出結果

在導出中,直接在瀏覽器輸入地址接口,結果如截圖所示

其中,金錢,時間上,我們分別進行了格式化

springboot2.2.X手冊:Easypoi導出excel,最新版的手感香不香?

 

導入結果

把剛剛導出來的文件,直接導入進去,這裏採用postMan進行操作,其中要注意的點,我已經用紅色的圈圈標出來。

從實驗結果上看,已經可以導入進去,並且把數據返回來

springboot2.2.X手冊:Easypoi導出excel,最新版的手感香不香?

 

問題

在導入進去的構成中,這裏留下一個問題給同學自行解決,導入的金額是0,可自行研究解決

--END--

作者:@溪雲閣

原創作品,抄襲必究,轉載註明出處

如需要源碼,轉發,關注後私信我

部分圖片或代碼來源網絡,如侵權請聯繫刪除,謝謝!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章