基于Hutool的Excel处理工具类

博客主要提及了Maven,还给出了工具类代码,涉及信息技术领域的开发工具相关内容。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

maven

		<!-- excel解析包 -->
        <!--处理2003 excel-->
        <dependency>
            <groupId>org.apache.poi</groupId>
            <artifactId>poi</artifactId>
            <version>4.0.0</version>
        </dependency>
        <!--处理2007 excel-->
        <dependency>
            <groupId>org.apache.poi</groupId>
            <artifactId>poi-ooxml</artifactId>
            <version>4.0.0</version>
        </dependency>
        
		<dependency>
            <groupId>cn.hutool</groupId>
            <artifactId>hutool-all</artifactId>
            <version>5.6.5</version>
        </dependency>

工具类代码

package com.demo.util;

import java.io.IOException;
import java.io.InputStream;
import java.lang.reflect.Field;
import java.net.URLEncoder;
import java.util.List;
import java.util.Objects;

import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServletResponse;

import cn.hutool.core.collection.CollUtil;
import cn.hutool.core.io.IoUtil;
import cn.hutool.core.util.StrUtil;
import cn.hutool.poi.excel.ExcelReader;
import cn.hutool.poi.excel.ExcelUtil;
import cn.hutool.poi.excel.ExcelWriter;
import com.demo.annotation.ExcelColumn;
import com.google.common.base.Joiner;
import org.apache.poi.ss.usermodel.BorderStyle;
import org.apache.poi.ss.usermodel.CellStyle;
import org.apache.poi.ss.usermodel.HorizontalAlignment;
import org.apache.poi.ss.util.CellRangeAddressList;

/**
 * excel处理工具类
 *
 * @author matao
 * @version ExcelUtils.java, v 0.1 2022年10月27日 11:37 matao
 */
public class ExcelUtils<T> {

    private static final int ZERO = 0;
    private static final String COMMA = ",";

    /**
     * 导出excel模板,excel表格设置下拉列表
     *
     * @param inputStream          文件流
     * @param fileName             文件名称
     * @param response             HttpServletResponse
     * @param cellRangeAddressList poi表格处理
     * @param selectList           下拉列表
     * @throws IOException
     */
    public void downloadFile(InputStream inputStream, String fileName, HttpServletResponse response,
        CellRangeAddressList cellRangeAddressList, List<String> selectList) throws IOException {
        if (Objects.isNull(inputStream) || StrUtil.isEmpty(fileName)) {
            return;
        }

        // 通过文件流获取excel写入器
        ExcelReader reader = ExcelUtil.getReader(inputStream);

        // 获取Excel写出器
        ExcelWriter writer = reader.getWriter();
        if (!Objects.isNull(cellRangeAddressList) && CollUtil.isNotEmpty(selectList)) {
            writer.addSelect(cellRangeAddressList, Joiner.on(COMMA).join(selectList));
        }
        responseWrite(fileName, response, writer);
    }

    /**
     * 导出写入数据的excel
     *
     * @param inputStream 本地文件流
     * @param fileName    文件名称
     * @param response    HttpServletResponse
     * @param data        写入到excel的数据集
     * @param passRowNum  跳到制定行数
     * @throws IOException
     */
    public void downloadFile(InputStream inputStream, String fileName, HttpServletResponse response, List<T> data,
        Integer passRowNum) throws IOException {
        if (CollUtil.isEmpty(data)) {
            return;
        }

        // 通过文件流获取excel写入器
        ExcelReader reader = ExcelUtil.getReader(inputStream);

        // 获取Excel写出器
        ExcelWriter writer = reader.getWriter();

        // 设置单元格样式无边框
        CellStyle cellStyle = writer.getCellStyle();
        cellStyle.setAlignment(HorizontalAlignment.LEFT);
        cellStyle.setBorderBottom(BorderStyle.NONE);
        cellStyle.setBorderLeft(BorderStyle.NONE);
        cellStyle.setBorderRight(BorderStyle.NONE);
        cellStyle.setBorderTop(BorderStyle.NONE);

        // 通过反射增加标题别名,对应数据,方便写入
        Object o = data.get(ZERO);
        Class<?> clazz = o.getClass();
        for (Field field : clazz.getDeclaredFields()) {
            field.setAccessible(true);
            ExcelColumn excelColumn = field.getAnnotation(ExcelColumn.class);
            if (!Objects.isNull(excelColumn)) {
                writer.addHeaderAlias(excelColumn.fieldName(), excelColumn.fieldDesc());
            }
        }

        // 设置跳过制定行数
        if (!Objects.isNull(passRowNum)) {
            writer.passRows(passRowNum);
        }

        // 写入数据到excel
        writer.write(data, false);
        responseWrite(fileName, response, writer);
    }

    /**
     * 读取excel
     *
     * @param inputStream  文件流
     * @param bean         excel数据对应到实体
     * @param headRow      表头所在行
     * @param startReadRow 开始读取到行
     * @return
     */
    public List<T> uploadFile(InputStream inputStream, Class<T> bean, Integer headRow, Integer startReadRow) {
        // 通过文件流获取excel写入器
        ExcelReader reader = ExcelUtil.getReader(inputStream);

        // 通过反射增加标题别名,对应数据,方便读取
        for (Field field : bean.getDeclaredFields()) {
            field.setAccessible(true);
            ExcelColumn excelColumn = field.getAnnotation(ExcelColumn.class);
            if (!Objects.isNull(excelColumn)) {
                reader.addHeaderAlias(excelColumn.fieldDesc(), excelColumn.fieldName());
            }
        }

        return reader.read(headRow, startReadRow, bean);
    }

    /**
     * 返回文件到客户端
     *
     * @param fileName 文件名称
     * @param response HttpServletResponse
     * @param writer   Excel 写入器
     * @throws IOException
     */
    private void responseWrite(String fileName, HttpServletResponse response, ExcelWriter writer) throws IOException {
        // response为HttpServletResponse对象
        response.setContentType("application/vnd.ms-excel;charset=utf-8");
        // fileName是弹出下载对话框的文件名,如果是中文需要自行编码
        response.setHeader("Content-Disposition", "attachment;filename=" + URLEncoder.encode(fileName, "UTF-8"));
        response.setHeader("Pragma", URLEncoder.encode(fileName, "UTF-8"));
        ServletOutputStream out = response.getOutputStream();

        writer.flush(out, true);
        // 关闭writer,释放内存
        writer.close();
        // 此处记得关闭输出Servlet流
        IoUtil.close(out);
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值