以前、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は確かに強力です。エクセルオペレーション商品!!!
読み不足を見つけたら、メッセージを残してください!!!