首页 > 其他分享 >使用hutool封装的Excel工具类

使用hutool封装的Excel工具类

时间:2023-08-16 18:32:09浏览次数:75  
标签:封装 Excel writer excel hutool headerAlias import response

好用的工具类

hutool工具类 hutool操作excel 这篇文章使用hutool的excel包封装项目中使用的excel工具类;

引入包

可以简单直接引入hutool-all,但是如果不用其他的话建议单独引入excel包
   <dependency>
            <groupId>cn.hutool</groupId>
            <artifactId>hutool-all</artifactId>
            <version>5.8.10</version>
        </dependency>

------ 单独引入excel,里面含有core
	<dependency>
			<groupId>cn.hutool</groupId>
			<artifactId>hutool-poi</artifactId>
			<version>5.8.10</version>
		</dependency>

-- 这个poi是必须引入的
		<dependency>
			<groupId>org.apache.poi</groupId>
			<artifactId>poi-ooxml</artifactId>
			<version>4.1.2</version>
		</dependency>


读取excel,我们通常两种方式,一种是读取url,一种是直接上传然后读取

直接上传

springmvc上传文件,举个例子,就是黑名单导入,就是读取第一列的手机号

 @RequestMapping("upload")
    public Response upload(@RequestParam("file") MultipartFile file,String source) throws IOException {
        Set<String> firstColumnList = MyExcelUtil.getMobileByStream(file.getInputStream());
        ...dosomething
        return Response.success();
    }

进行读取操作,我这边只读取第一列的数据,可以将读取数据转为对应的类:

 public static Set<String> getMobileByStream(InputStream in) {
        ExcelReader reader = ExcelUtil.getReader(in);
        List<List<Object>> dataList = reader.read();
        HashSet<String> firstColumnList = Sets.newHashSet();
        for (List<Object> row : dataList) {
            Object firstColumnValue = row.get(0);
            if (firstColumnValue != null) {
                String mobile = firstColumnValue.toString().trim();
                if (StringUtils.isNotBlank(mobile) && NumberUtil.isNumber(mobile)) {
                    firstColumnList.add(mobile);
                }
            }
        }
        return firstColumnList;
    }

通过url读取Excel

创建链接,通过上面读取流的方法读取:

 public static Set<String> getMobileByUrl(String url) {
        HttpGet httpGet = new HttpGet(url);
        CloseableHttpClient httpClient = HttpClients.createDefault();
        Set<String> mobiles = new HashSet<>();
        try {
            CloseableHttpResponse response = httpClient.execute(httpGet);
            HttpEntity entity = response.getEntity();
            if (entity != null) {
                mobiles = getMobileByStream(entity.getContent());
            }
        } catch (
                IOException e) {
            log.error("解析异常:", e);
            throw new RuntimeException(e);
        }
        return mobiles;
    }

导出excel,通过HttpServletResponse进行导出

第一个参数为数据,每一条一条的数据,第二个参数就是response,第三个参数是请求别名,key就是data参数的值,value是对应的标题

 /**
     * 导出为excel
     *
     * @param data
     * @param response
     * @param headerAlias
     */
    public static void exportGeneral(Collection<?> data, HttpServletResponse response, Map<String, String> headerAlias) {
        BigExcelWriter writer = ExcelUtil.getBigWriter();
        if (Objects.isNull(headerAlias) || headerAlias.isEmpty()) {
            writer.setOnlyAlias(false);
        } else {
            writer.setOnlyAlias(true);
            writer.setHeaderAlias(headerAlias);
        }
        writer.write(data, true);
        response.setContentType("application/vnd.ms-excel;charset=utf-8");
        response.setHeader("Content-Disposition", "attachment;filename=" + RandomUtil.randomString(5) + ".xlsx");
        try {
            ServletOutputStream out = response.getOutputStream();
            writer.flush(out, true);
            writer.close();
            IoUtil.close(out);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

总的工具类

package com.study.springbootplus.util;

import cn.hutool.core.io.IoUtil;
import cn.hutool.core.util.NumberUtil;
import cn.hutool.core.util.RandomUtil;
import cn.hutool.poi.excel.BigExcelWriter;
import cn.hutool.poi.excel.ExcelReader;
import cn.hutool.poi.excel.ExcelUtil;
import com.google.common.collect.Sets;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang.StringUtils;
import org.apache.http.HttpEntity;
import org.apache.http.client.methods.CloseableHttpResponse;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.HttpClients;

import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.InputStream;
import java.util.*;

/**
 * @ClassName ExcelUtil
 * @Author yida
 * @Date 2022-12-22 13:46
 * @Description ExcelUtil
 */
@Slf4j
public class MyExcelUtil {

    public static Set<String> getMobileByUrl(String url) {
        HttpGet httpGet = new HttpGet(url);
        CloseableHttpClient httpClient = HttpClients.createDefault();
        Set<String> mobiles = new HashSet<>();
        try {
            CloseableHttpResponse response = httpClient.execute(httpGet);
            HttpEntity entity = response.getEntity();
            if (entity != null) {
                mobiles = getMobileByStream(entity.getContent());
            }
        } catch (
                IOException e) {
            log.error("解析异常:", e);
            throw new RuntimeException(e);
        }
        return mobiles;
    }

    /**
     * 只接受excel,第一列为手机号的流
     *
     * @param in
     * @return
     */
    public static Set<String> getMobileByStream(InputStream in) {
        ExcelReader reader = ExcelUtil.getReader(in);
        List<List<Object>> dataList = reader.read();
        HashSet<String> firstColumnList = Sets.newHashSet();
        for (List<Object> row : dataList) {
            Object firstColumnValue = row.get(0);
            if (firstColumnValue != null) {
                String mobile = firstColumnValue.toString().trim();
                if (StringUtils.isNotBlank(mobile) && NumberUtil.isNumber(mobile)) {
                    firstColumnList.add(mobile);
                }
            }
        }
        return firstColumnList;
    }

    /**
     * 导出为excel
     *
     * @param data
     * @param response
     * @param headerAlias
     */
    public static void exportGeneral(Collection<?> data, HttpServletResponse response, Map<String, String> headerAlias) {
        BigExcelWriter writer = ExcelUtil.getBigWriter();
        if (Objects.isNull(headerAlias) || headerAlias.isEmpty()) {
            writer.setOnlyAlias(false);
        } else {
            writer.setOnlyAlias(true);
            writer.setHeaderAlias(headerAlias);
        }
        writer.write(data, true);
        response.setContentType("application/vnd.ms-excel;charset=utf-8");
        response.setHeader("Content-Disposition", "attachment;filename=" + RandomUtil.randomString(5) + ".xlsx");
        try {
            ServletOutputStream out = response.getOutputStream();
            writer.flush(out, true);
            writer.close();
            IoUtil.close(out);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

}




标签:封装,Excel,writer,excel,hutool,headerAlias,import,response
From: https://blog.51cto.com/yida/7112249

相关文章

  • excel 输出demo(outputstream 转inputstr)
    protectedvoidresponseExcel(HSSFWorkbookworkbook)throwsIOException{ByteArrayOutputStreamos=newByteArrayOutputStream();try{workbook.write(os);}catch(IOExceptione){e.printStackTrace();}byte[]content......
  • 使用hutool给excel单元格标黄和添加批注
    packagecom.yc.cloud.excel.util;importcn.hutool.poi.excel.ExcelWriter;importlombok.extern.slf4j.Slf4j;importorg.apache.poi.hssf.usermodel.HSSFClientAnchor;importorg.apache.poi.hssf.usermodel.HSSFRichTextString;importorg.apache.poi.ss.usermodel.......
  • teamcenter rac 开发 卡死 问题 导出excel 文件时
    解决方法:我对比了,芬尼的这个功能,发现那边在tc配置了查看器的属性,首航这边没配置,然后芬妮没有这个bug,代码也是相同的,所以我交实施配置了查看器的属性就可以了 ......
  • 表格JS实现在线Excel的附件上传与下载
    摘要:本文由葡萄城技术团队于博客园原创并首发。转载请注明出处:葡萄城官网,葡萄城为开发者提供专业的开发工具、解决方案和服务,赋能开发者。前言在本地使用Excel时,经常会有需要在Excel中添加一些附件文件的需求,例如在Excel中附带一些Word,CAD图等等。同样的,类比到Web端,现在很多人......
  • Python日志收集封装分享
    1、什么是日志日志跟踪软件运行时事件的方法(跟踪器)2、日志作用问题地位信息查询数据分析3、内置模块logginglogging的四大组件:1、日志器Logger--->入口2、处理器Handler---》执行者决定日志在不同端进行输出(日志文件控制台)3、格式器Formatter---》日志输入的内......
  • Spring Boot下实现Excel导入导出
    摘要:本文由葡萄城技术团队于51CTO原创并首发。转载请注明出处:[葡萄城官网],葡萄城为开发者提供专业的开发工具、解决方案和服务,赋能开发者。前言SpringBoot是由Pivotal团队提供的全新框架,其设计目的是用来简化新Spring应用的初始搭建以及开发过程。该框架使用了特定的方式来进行......
  • axios封装
    importaxiosfrom'axios';consthttp_url="https://xxx.xxx.com"//get请求exportfunctiongetRequest(url,sendData){returnnewPromise((resolve,reject)=>{axios.get(http_url+url,{params:sendData}).then(res=&......
  • JavaScript 如何封装一些常见的函数来提高工作效率
    前言为什么要封装函数JavaScript封装函数的主要目的是为了保护代码的安全性和可维护性。封装可以隐藏实现细节:将函数内部的实现细节封装起来,只暴露给外部必要的接口,可以使代码更加安全,防止意外修改或者滥用。封装可以提高代码的可维护性:将功能模块封装成函数,可以使代码更加模......
  • 记录 FFmpeg开发常用功能封装
    说明记录下个人在开发中使用到的FFmpeg常用功能,避免相同功能代码的重复编写,使用时直接复制提升效率。由于音视频处理的场景众多,无法编写完全通用的方法接口,可能需根据实际场景进行一定的修改,本文章中的代码也将持续更新优化。代码这里提供ffmpegheader.h,ffmpegheader.cpp。配......
  • com.alibaba.excel.exception.ExcelWriteDataConvertException: Can not find 'Conver
    这个异常是由于使用阿里巴巴的EasyExcel库时,没有找到映射为Map类型的数据转换器所导致的。在使用EasyExcel进行Excel文件读写时,需要指定正确的数据转换器以实现对象与Excel单元格的相互转换。对于Map类型的数据,EasyExcel需要知道如何将Map转换为Excel中的单元格数据,因此需要自定义......