myexcel的使用

参考:

(1)api文档:https://www.bookstack.cn/read/MyExcel-2.x/624d8ce73162300b.md

(2)源代码: https://github.com/liaochong/myexcel/issues

我:

(1)maven依赖

XML 复制代码
<dependency>
     <!--excel-->
     <groupId>com.github.liaochong</groupId>
     <artifactId>myexcel</artifactId>
     <version>3.7.1</version>
</dependency>

(2)myexcel工具类

java 复制代码
import com.github.liaochong.myexcel.core.DefaultExcelBuilder;
import com.github.liaochong.myexcel.core.DefaultExcelReader;
import com.github.liaochong.myexcel.utils.AttachmentExportUtil;
import org.apache.poi.ss.usermodel.Workbook;

import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.InputStream;
import java.util.ArrayList;
import java.util.List;
import java.util.function.Consumer;


/**
 * MyExcel:导入工具
 */
public class MyExcelUtils
{
    // 默认导入
    public static <T> List<T> defaultImport(InputStream stream, Class<T> clazz){
        List<T> list = new ArrayList<T>() {{
            try {
                DefaultExcelReader
                        .of(clazz)
                        .sheet(0)
                        .rowFilter(row -> row.getRowNum() > 0) // 如无需过滤,可省略该操作,0代表第一行
                        .readThen(stream ,(Consumer<T>)d -> add(d));
            } catch (Exception e) {
                if(e.getLocalizedMessage().contains("Duplicate key")){
                    throw new RuntimeException("图片定位重复,单元格图片不可以越线");
                }
                if(e.getLocalizedMessage().contains("Java heap space")){
                    throw new RuntimeException("excel文件太大,堆内存不够用");
                }
                throw new RuntimeException(e);
            }
        }};
        return list;
    }

    // 默认导出
    public static void defaultExport(HttpServletResponse response, List list, Class<?> clazz, String fileName) throws IOException
    {
        Workbook workbook = DefaultExcelBuilder.of(clazz).build(list);
        AttachmentExportUtil.export(workbook, (fileName == null || "".equals(fileName.trim())) ? "文件" : fileName, response);
    }
}

(3)实体类映射模板

java 复制代码
@Data
@ExcelModel(sheetName = "商品导入模板", rowHeight = 50,style={"vertical-align:center"}, dateTimeFormat="yyyy-MM-dd HH:mm", dateFormat="yyyy-MM-dd", decimalFormat="#")
@EqualsAndHashCode(callSuper = false)
public class ProductExcelModel {

    @ExcelColumn(index = 0, title = "商品名称")
    private String title;

    @ExcelColumn(index = 1, title = "商品图片")
    private InputStream image;


    @IgnoreColumn
    private String result; // 导入反馈错误信息

}

(4)导出excel模板

java 复制代码
public void loadTemplate(HttpServletResponse response){
        List<ProductExcelModel> list = new ArrayList<>();
        ProductExcelModel model = new ProductExcelModel();
        model.setTitle("产品名称");
        model.setImage(new FileInputStream("xx.jpg"));
        list.add(model);
        ExcelExportBuilder.defaultExcelExport(response, list, ProductExcelModel.class, "商品导入模板");
    }

(5)解析excel文件内容

java 复制代码
    public ResultInfo parseExcel(MultipartFile file) throws Exception{
        List<ProductExcelModel> list = ExcelImportBuilder.defaultImport(file.getInputStream(), ProductExcelModel.class);
        for(ProductExcelModel model:list){
            String result = "";
            if(StringUtils.isBlank(model.getTitle())){
                result = result + "\n商品名称不能为空";
            }
            if(null == model.getImage()){
                result = result + "\n商品图片不能为空";
            }
            model.setResult(result);
        }
        return ResultInfo.valueOf(list);
    }
相关推荐
苍煜40 分钟前
Maven构建流程详解:如何正确管理微服务间的依赖关系-当依赖的模块更新后,我应该如何重新构建主项目
java·微服务·maven
冼紫菜43 分钟前
[特殊字符]CentOS 7.6 安装 JDK 11(适配国内服务器环境)
java·linux·服务器·后端·centos
isyangli_blog1 小时前
(1-4)Java Object类、Final、注解、设计模式、抽象类、接口、内部类
java·开发语言
秋野酱2 小时前
Spring Boot 项目的计算机专业论文参考文献
java·spring boot·后端
士别三日&&当刮目相看2 小时前
数据结构*优先级队列(堆)
java·数据结构
香饽饽~、2 小时前
【第二篇】 初步解析Spring Boot
java·spring boot·后端
坎布里奇3 小时前
java -jar命令运行 jar包时如何运行外部依赖jar包
java·pycharm·jar
冷yan~3 小时前
GitHub文档加载器设计与实现
java·人工智能·spring·ai·github·ai编程
CodeBlossom3 小时前
java加强 -stream流
java·windows·python