[SpringBoot] 37. SpringBootは、EasyPoiカスタム辞書を統合してExcelをエクスポートします

以前、SpringBootでExcelをエクスポートするためのJeecgBootのAutopoiの使用を紹介しました。実際、Autopoiの最下層もEasyPoiであり、Excelのインポート/エクスポートに非常に便利です。次に、EasyPoiもPOIに基づいています。この側面を詳しく調べたい場合は、最初にネイティブPOIのインポート/エクスポート方法を確認してから、EasyPoiを選択してください。

1.はじめに

EasyPoiの機能は名前easyと同じで、メインの機能も簡単なので、poiを見たことがない人でも、簡単な注釈とテンプレート言語(使い慣れた)で、Excelエクスポート、Excelテンプレートエクスポート、Excelインポート、Wordテンプレートエクスポートを簡単に作成できます。式の構文)、前の複雑な記述を完了します

JeecgBootのAutopoiについて知りたい場合は、JeecgBootのAutopoiを使用してSpringBootでExcelをエクスポートする、私の別のブログ参照できます。

https://blog.csdn.net/qq_40065776/article/details/107824221

2.EasyPoiを紹介します

EasyPoiはSpringBootにも適切にパッケージ化されているため、SpringBootでの開発にEasyPoiをすばやく使用できます。

<!-- easypoi -->
<dependency>
    <groupId>cn.afterturn</groupId>
    <artifactId>easypoi-spring-boot-starter</artifactId>
    <version>4.2.0</version>
</dependency>

この依存関係を導入するだけで済みます。これはSpringBootの優れたサポートです。

3、ソースコードの解釈

1. @ Excelソースコードの解釈

ソースコードを参照することにより、cn.afterturn.easypoi.excel.annotation.Excelアノテーションから見つけることは難しくありません

/**
 * Copyright 2013-2015 JueYue ([email protected])
 *
 *  Licensed under the Apache License, Version 2.0 (the "License");
 *  you may not use this file except in compliance with the License.
 *  You may obtain a copy of the License at
 *
 *     http://www.apache.org/licenses/LICENSE-2.0
 *
 *  Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */
package cn.afterturn.easypoi.excel.annotation;

import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

/**
 * Excel 导出基本注释
 * @author JueYue
 *  2014年6月20日 下午10:25:12
 */
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.FIELD)
public @interface Excel {
    
    

    /**
     * 导出时,对应数据库的字段 主要是用户区分每个字段, 不能有annocation重名的 导出时的列名
     * 导出排序跟定义了annotation的字段的顺序有关 可以使用a_id,b_id来确实是否使用
     */
    public String name();

    /**
     * 展示到第几个可以使用a_id,b_id来确定不同排序
     */
    public String orderNum() default "0";

    /**
     * 值得替换  导出是{a_id,b_id} 导入反过来,所以只用写一个
     */
    public String[] replace() default {
    
    };
    /**
     *  字典名称
     */
    public String dict() default  "";
}

上記は@Excelアノテーションのコードスニペットです。アノテーションが2つの辞書置換方法をサポートしていることがわかります。

  • 1.置換。このメソッドは、次のような注釈パラメーターへの直接書き込みをサポートします。
@Excel(name = "性别", width = 15, replace = "男_1,女_2")
@TableField("sex")
private Integer sex;

男性には1、女性には2を使用するため、エクスポート時にデータのマジック値を自動的に置き換えることができますが、この方法では、注釈パラメータに多くのコードを記述する必要があり、辞書は多くの場合動的に変化し、そのような制限は大きすぎます

  • 2. dict、辞書モード、次のような辞書パラメーターで渡されます。
@Excel(name = "性别", width = 15, dict = "sex")
@TableField("sex")
private Integer sex;

ここでは、辞書のキーのみを渡すため、データをクエリしてExcelファイルに書き込むときに、データのマジック値を動的に置き換えて、データの読みやすさを向上させることができます。

2.IExcelDictHandlerソースコードの解釈

前のステップでは、カスタム辞書クエリのエクスポートがEasyPoiでサポートされていることをすでに知っていますが、どのように実装しますか?cn.afterturn.easypoi.handler.inter.IExcelDictHandlerインターフェイスでコードを読み取ると、コードは次のようになります。

package cn.afterturn.easypoi.handler.inter;

import java.util.List;
import java.util.Map;

/**
 * @author jueyue on 18-2-2.
 * @version 3.0.4
 */
public interface IExcelDictHandler {
    
    

    /**
     * 返回字典所有值
     * key: dictKey
     * value: dictValue
     * @param dict  字典Key
     * @return
     */
    default public List<Map> getList(String dict) {
    
    
        return null;
    }

    /**
     * 从值翻译到名称
     *
     * @param dict  字典Key
     * @param obj   对象
     * @param name  属性名称
     * @param value 属性值
     * @return
     */
    public String toName(String dict, Object obj, String name, Object value);

    /**
     * 从名称翻译到值
     *
     * @param dict  字典Key
     * @param obj   对象
     * @param name  属性名称
     * @param value 属性值
     * @return
     */
    public String toValue(String dict, Object obj, String name, Object value);
}

インターフェイスには次の3つのメソッドが用意されています。

  • 1. GetList、キーの下のすべての辞書データを辞書キーを介してクエリします。例:{"1": "男"、 "2": "女"} under sex
  • 2. toName、値から名前への辞書の翻訳関数、例:sex:1-> "男"、一般的にエクスポート時に使用されます
  • 3. toValueは、toNameとは異なり、名前から値に変換されます。例:sex: "男"-> 1、一般的にインポート時に使用されます

EasyPoiで辞書変換インターフェイスが提供されていることがわかったので、実装クラスを提供し、インターフェイスのメソッドを書き直すだけで済みます。IExcelDictHandlerImpl.javaはIExcelDictHandlerインターフェイスを実装します。コードは次のとおりです。

package com.zyxx.common.excel;

import cn.afterturn.easypoi.handler.inter.IExcelDictHandler;
import com.zyxx.sys.service.SysDictDetailService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;

import javax.annotation.PostConstruct;

/**
 * 支持字典参数设置
 * 举例: @Excel(name = "性别", width = 15, dicCode = "sex")
 * 1、导出的时候会根据字典配置,把值1,2翻译成:男、女;
 * 2、导入的时候,会把男、女翻译成1,2存进数据库;
 *
 * @Author lizhou
 */
@Slf4j
@Component
public class IExcelDictHandlerImpl implements IExcelDictHandler {
    
    

    @Autowired
    private SysDictDetailMapper testSysDictDetailMapper;
    private static SysDictDetailMapper sysDictDetailMapper;

    @PostConstruct
    public void init() {
    
    
        sysDictDetailMapper = this.testSysDictDetailMapper;
    }

    /**
     * 从值翻译到名称
     *
     * @param dict  字典Key
     * @param obj   对象
     * @param name  属性名称
     * @param value 属性值
     * @return
     */
    @Override
    public String toName(String dict, Object obj, String name, Object value) {
    
    
        return sysDictDetailMapper.getTextByDictAndValue(dict, String.valueOf(value));
    }

    /**
     * 从名称翻译到值
     *
     * @param dict  字典Key
     * @param obj   对象
     * @param name  属性名称
     * @param value 属性值
     * @return
     */
    @Override
    public String toValue(String dict, Object obj, String name, Object value) {
    
    
        return null;
    }
}
  • 1.ここでは、toName(値から名前への変換)メソッドのみを使用してエクスポートするため、1つのメソッドのみが記述されます。
  • 2. @ Componentアノテーションを使用してSpringコンテナにロードする必要があります
  • 3. @PostConstructこの注釈は、非静的なvoid()メソッドを装飾するために使用されます。@PostConstructで装飾されたメソッドは、サーバーがサーブレットをロードするときに実行され、サーバーによって1回だけ実行されます。PostConstructは、コンストラクターの後、init()メソッドの前に実行されます。

第四に、エクスポートを開始します

1.エンティティクラスを定義します

package com.zyxx.sys.entity;

import cn.afterturn.easypoi.excel.annotation.Excel;
import com.baomidou.mybatisplus.annotation.*;
import com.baomidou.mybatisplus.extension.activerecord.Model;
import com.zyxx.common.annotation.Dict;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.experimental.Accessors;

import java.io.Serializable;
import java.util.Date;

/**
 * <p>
 * 用户信息表
 * </p>
 *
 * @author lizhou
 */
@Data
@EqualsAndHashCode(callSuper = false)
@Accessors(chain = true)
@TableName("sys_user_info")
@ApiModel(value = "SysUserInfo对象", description = "用户信息表")
public class SysUserInfo extends Model<SysUserInfo> {
    
    


    @ApiModelProperty(value = "ID")
    @TableId(value = "id", type = IdType.AUTO)
    private Integer id;

    @Excel(name = "姓名", width = 15)
    @ApiModelProperty(value = "姓名")
    @TableField("name")
    private String name;

    @Excel(name = "电话", width = 15)
    @ApiModelProperty(value = "电话")
    @TableField("phone")
    private String phone;

    @Excel(name = "性别", width = 15, dict = "sex")
    @TableField("sex")
    @Dict(dictCode = "user_sex")
    private Integer sex;

    @Excel(name = "状态", width = 15, dict = "status")
    @TableField("status")
    private Integer status;
}

@Excelアノテーションは次のように説明されています。

  • 名前、ヘッダー名
  • 幅、列幅
  • dict、辞書キー

2.APIインターフェイスをエクスポートします

コントローラレイヤーはエクスポートAPIを提供します

@ApiOperation(value = "导出用户信息", notes = "导出用户信息")
@GetMapping(value = "/export")
public void exportXls(HttpServletResponse response) {
    
    
	// 查询数据
    List<SysUserInfo> list = sysUserInfoService.list(1, Integer.MAX_VALUE);
    // 导出数据,数据,数据类型,文件名称,表名,响应对象
    ExportExcelUtil.exportExcel(list, SysUserInfo.class, "用户信息表", "用户信息统计", response);
}

3.エクスポートツール

/**
* 导出excel
*
* @param list 数据集合
* @param pojoClass 数据类型
* @param fileName 文件名称
* @param title 表明
* @param response 响应对象
*/
public static void exportExcel(List<?> list, Class<?> pojoClass, String fileName, String title, HttpServletResponse response) {
    
    
   ExportParams exportParams = new ExportParams(title, null);
   // 自定义字典查询规则
   exportParams.setDictHandler(new IExcelDictHandlerImpl());
   Workbook workbook = ExcelExportUtil.exportExcel(exportParams, pojoClass, list);
   if (workbook != null) {
    
    
       try {
    
    
           response.setCharacterEncoding("UTF-8");
           response.setHeader("content-Type", "application/vnd.ms-excel");
           response.setHeader("Content-Disposition", "attachment;filename=" + URLEncoder.encode(fileName, "UTF-8") + ".xls");
           workbook.write(response.getOutputStream());
       } catch (IOException e) {
    
    
           e.printStackTrace();
       }
   }
}

exportParams.setDictHandler(new IExcelDictHandlerImpl());、カスタム辞書クエリルールを渡しました

5、テストエクスポート

データをエクスポートしてファイルをエクスポートするためのAPIインターフェイスを呼び出します。エクスポートの効果は次のとおりです。

ファイルのエクスポート

結果のエクスポート

6、まとめ

カスタム辞書のクエリとエクスポートの方法は、実際にはJeecgBootのAutopoiの方法と同じであることがわかります。その後、JeecgBootのAutopoiとhutoolの読み取りファイルExcelReaderが競合していることが発見されました。JeecgBootのAutopoiは廃止されました。EasyPoiは確かに強力です。エクセルオペレーション商品!

読み不足を見つけたら、メッセージを残してください!

おすすめ

転載: blog.csdn.net/qq_40065776/article/details/109537996