添加链接
link之家
链接快照平台
  • 输入网页链接,自动生成快照
  • 标签化管理网页链接
相关文章推荐
留胡子的扁豆  ·  sql ...·  3 天前    · 
要出家的小熊猫  ·  Java ...·  昨天    · 
飘逸的海龟  ·  关于java的BufferedImage ...·  1 年前    · 
威武的火车  ·  尝试从REST ...·  1 年前    · 
小胡子的大葱  ·  LeetCode 346. ...·  1 年前    · 
import com.alibaba.excel.EasyExcel; import com.alibaba.excel.EasyExcelFactory; import com.alibaba.excel.event.AnalysisEventListener; import com.alibaba.excel.write.handler.WriteHandler; import org.apache.poi.ss.formula.functions.T; import javax.servlet.http.HttpServletResponse; import java.io.File; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; import java.net.URLEncoder; import java.util.List; import java.util.Map; import java.util.Set; * Author: yangjie * Datetime: 2022年11月16日 10:57 * Description: 注:如果方法中无以下参数,则使用默认值 * Integer sheetNo 默认0读取第一张sheet * Integer headRowNum 默认1不读取首行,从第二行开始读取 * 返回值return:List>: Integer:列数 String:列数对应的value public class EasyExcelUtil { * 同步无模型读(默认读取sheet0,从第2行开始读) * @param filePath excel文件的绝对路径 public static List> syncRead(String filePath) { return EasyExcelFactory.read(filePath).sheet().doReadSync(); * 同步无模型读(自定义读取sheetX,从第2行开始读) * @param filePath excel文件的绝对路径 * @param sheetNo sheet页号,从0开始 public static List> syncRead(String filePath, Integer sheetNo) { return EasyExcelFactory.read(filePath).sheet(sheetNo).doReadSync(); * 同步无模型读(指定sheet和表头占的行数) * @param filePath * @param sheetNo sheet页号,从0开始 * @param headRowNum 表头占的行数,从0开始(如果要连表头一起读出来则传0) public static List> syncRead(String filePath, Integer sheetNo, Integer headRowNum) { return EasyExcelFactory.read(filePath).sheet(sheetNo).headRowNumber(headRowNum).doReadSync(); * 同步无模型读(指定sheet和表头占的行数) * @param inputStream * @param sheetNo sheet页号,从0开始 * @param headRowNum 表头占的行数,从0开始(如果要连表头一起读出来则传0) public static List> syncRead(InputStream inputStream, Integer sheetNo, Integer headRowNum) { return EasyExcelFactory.read(inputStream).sheet(sheetNo).headRowNumber(headRowNum).doReadSync(); * 同步无模型读(指定sheet和表头占的行数) * @param file * @param sheetNo sheet页号,从0开始 * @param headRowNum 表头占的行数,从0开始(如果要连表头一起读出来则传0) public static List> syncRead(File file, Integer sheetNo, Integer headRowNum) { return EasyExcelFactory.read(file).sheet(sheetNo).headRowNumber(headRowNum).doReadSync(); //====================================================无JAVA模型读取excel数据=============================================================== //====================================================将excel数据同步到JAVA模型属性里=============================================================== * 同步按模型读(默认读取sheet0,从第2行开始读) * @param filePath * @param clazz 模型的类类型(excel数据会按该类型转换成对象) public static List syncReadModel(String filePath, Class clazz) { return EasyExcelFactory.read(filePath).sheet().head(clazz).doReadSync(); * 同步按模型读(默认表头占一行,从第2行开始读) * @param filePath * @param clazz 模型的类类型(excel数据会按该类型转换成对象) * @param sheetNo sheet页号,从0开始 public static List syncReadModel(String filePath, Class clazz, Integer sheetNo) { return EasyExcelFactory.read(filePath).sheet(sheetNo).head(clazz).doReadSync(); * 同步按模型读(指定sheet和表头占的行数) * @param inputStream * @param clazz 模型的类类型(excel数据会按该类型转换成对象) * @param sheetNo sheet页号,从0开始 * @param headRowNum 表头占的行数,从0开始(如果要连表头一起读出来则传0) public static List syncReadModel(InputStream inputStream, Class clazz, Integer sheetNo, Integer headRowNum) { return EasyExcelFactory.read(inputStream).sheet(sheetNo).headRowNumber(headRowNum).head(clazz).doReadSync(); * 同步按模型读(指定sheet和表头占的行数) * @param file * @param clazz 模型的类类型(excel数据会按该类型转换成对象) * @param sheetNo sheet页号,从0开始 * @param headRowNum 表头占的行数,从0开始(如果要连表头一起读出来则传0) public static List syncReadModel(File file, Class clazz, Integer sheetNo, Integer headRowNum) { return EasyExcelFactory.read(file).sheet(sheetNo).headRowNumber(headRowNum).head(clazz).doReadSync(); * 同步按模型读(指定sheet和表头占的行数) * @param filePath * @param clazz 模型的类类型(excel数据会按该类型转换成对象) * @param sheetNo sheet页号,从0开始 * @param headRowNum 表头占的行数,从0开始(如果要连表头一起读出来则传0) public static List syncReadModel(String filePath, Class clazz, Integer sheetNo, Integer headRowNum) { return EasyExcelFactory.read(filePath).sheet(sheetNo).headRowNumber(headRowNum).head(clazz).doReadSync(); * 异步无模型读(默认读取sheet0,从第2行开始读) * @param excelListener 监听器,在监听器中可以处理行数据LinkedHashMap,表头数据,异常处理等 * @param filePath 表头占的行数,从0开始(如果要连表头一起读出来则传0) public static void asyncRead(String filePath, AnalysisEventListener excelListener) { EasyExcelFactory.read(filePath, excelListener).sheet().doRead(); * 异步无模型读(默认表头占一行,从第2行开始读) * @param filePath 表头占的行数,从0开始(如果要连表头一起读出来则传0) * @param excelListener 监听器,在监听器中可以处理行数据LinkedHashMap,表头数据,异常处理等 * @param sheetNo sheet页号,从0开始 public static void asyncRead(String filePath, AnalysisEventListener excelListener, Integer sheetNo) { EasyExcelFactory.read(filePath, excelListener).sheet(sheetNo).doRead(); * 异步无模型读(指定sheet和表头占的行数) * @param inputStream * @param excelListener 监听器,在监听器中可以处理行数据LinkedHashMap,表头数据,异常处理等 * @param sheetNo sheet页号,从0开始 * @param headRowNum 表头占的行数,从0开始(如果要连表头一起读出来则传0) public static void asyncRead(InputStream inputStream, AnalysisEventListener excelListener, Integer sheetNo, Integer headRowNum) { EasyExcelFactory.read(inputStream, excelListener).sheet(sheetNo).headRowNumber(headRowNum).doRead(); * 异步无模型读(指定sheet和表头占的行数) * @param file * @param excelListener 监听器,在监听器中可以处理行数据LinkedHashMap,表头数据,异常处理等 * @param sheetNo sheet页号,从0开始 * @param headRowNum 表头占的行数,从0开始(如果要连表头一起读出来则传0) public static void asyncRead(File file, AnalysisEventListener excelListener, Integer sheetNo, Integer headRowNum) { EasyExcelFactory.read(file, excelListener).sheet(sheetNo).headRowNumber(headRowNum).doRead(); * 异步无模型读(指定sheet和表头占的行数) * @param filePath * @param excelListener 监听器,在监听器中可以处理行数据LinkedHashMap,表头数据,异常处理等 * @param sheetNo sheet页号,从0开始 * @param headRowNum 表头占的行数,从0开始(如果要连表头一起读出来则传0) * @return public static void asyncRead(String filePath, AnalysisEventListener excelListener, Integer sheetNo, Integer headRowNum) { EasyExcelFactory.read(filePath, excelListener).sheet(sheetNo).headRowNumber(headRowNum).doRead(); * 异步按模型读取(默认读取sheet0,从第2行开始读) * @param filePath * @param excelListener 监听器,在监听器中可以处理行数据LinkedHashMap,表头数据,异常处理等 * @param clazz 模型的类类型(excel数据会按该类型转换成对象) public static void asyncReadModel(String filePath, AnalysisEventListener excelListener, Class clazz) { EasyExcelFactory.read(filePath, clazz, excelListener).sheet().doRead(); * 异步按模型读取(默认表头占一行,从第2行开始读) * @param filePath * @param excelListener 监听器,在监听器中可以处理行数据LinkedHashMap,表头数据,异常处理等 * @param clazz 模型的类类型(excel数据会按该类型转换成对象) * @param sheetNo sheet页号,从0开始 public static void asyncReadModel(String filePath, AnalysisEventListener excelListener, Class clazz, Integer sheetNo) { EasyExcelFactory.read(filePath, clazz, excelListener).sheet(sheetNo).doRead(); * 异步按模型读取 * @param inputStream * @param excelListener 监听器,在监听器中可以处理行数据LinkedHashMap,表头数据,异常处理等 * @param clazz 模型的类类型(excel数据会按该类型转换成对象) * @param sheetNo sheet页号,从0开始 * @param headRowNum 表头占的行数,从0开始(如果要连表头一起读出来则传0) public static void asyncReadModel(InputStream inputStream, AnalysisEventListener excelListener, Class clazz, Integer sheetNo, Integer headRowNum) { EasyExcelFactory.read(inputStream, clazz, excelListener).sheet(sheetNo).headRowNumber(headRowNum).doRead(); * 异步按模型读取 * @param file * @param excelListener 监听器,在监听器中可以处理行数据LinkedHashMap,表头数据,异常处理等 * @param clazz 模型的类类型(excel数据会按该类型转换成对象) * @param sheetNo sheet页号,从0开始 * @param headRowNum 表头占的行数,从0开始(如果要连表头一起读出来则传0) public static void asyncReadModel(File file, AnalysisEventListener excelListener, Class clazz, Integer sheetNo, Integer headRowNum) { EasyExcelFactory.read(file, clazz, excelListener).sheet(sheetNo).headRowNumber(headRowNum).doRead(); * 异步按模型读取 * @param filePath * @param excelListener 监听器,在监听器中可以处理行数据LinkedHashMap,表头数据,异常处理等 * @param clazz 模型的类类型(excel数据会按该类型转换成对象) * @param sheetNo sheet页号,从0开始 * @param headRowNum 表头占的行数,从0开始(如果要连表头一起读出来则传0) public static void asyncReadModel(String filePath, AnalysisEventListener excelListener, Class clazz, Integer sheetNo, Integer headRowNum) { EasyExcelFactory.read(filePath, clazz, excelListener).sheet(sheetNo).headRowNumber(headRowNum).doRead(); * 无模板写文件 * @param filePath * @param head 表头数据 * @param data 表内容数据 public static void write(String filePath, List> head, List> data) { EasyExcel.write(filePath).head(head).sheet().doWrite(data); * 无模板写文件 * @param filePath * @param head 表头数据 * @param data 表内容数据 * @param sheetNo sheet页号,从0开始 * @param sheetName sheet名称 public static void write(String filePath, List> head, List> data, Integer sheetNo, String sheetName) { EasyExcel.write(filePath).head(head).sheet(sheetNo, sheetName).doWrite(data); * 根据excel模板文件写入文件 * @param filePath * @param templateFileName * @param headClazz * @param data public static void writeTemplate(String filePath, String templateFileName, Class headClazz, List data) { EasyExcel.write(filePath, headClazz).withTemplate(templateFileName).sheet().doWrite(data); * 根据excel模板文件写入文件 * @param filePath * @param templateFileName * @param data public static void writeTemplate(String filePath, String templateFileName, List data) { EasyExcel.write(filePath).withTemplate(templateFileName).sheet().doWrite(data); * 按模板写文件 * @param filePath * @param headClazz 表头模板 * @param data 数据 public static void write(String filePath, Class headClazz, List data) { EasyExcel.write(filePath, headClazz).sheet().doWrite(data); * 按模板写文件 * @param filePath * @param headClazz 表头模板 * @param data 数据 * @param sheetNo sheet页号,从0开始 * @param sheetName sheet名称 public static void write(String filePath, Class headClazz, List data, Integer sheetNo, String sheetName) { EasyExcel.write(filePath, headClazz).sheet(sheetNo, sheetName).doWrite(data); * 按模板写文件 * @param filePath * @param headClazz 表头模板 * @param data 数据 * @param writeHandler 自定义的处理器,比如设置table样式,设置超链接、单元格下拉框等等功能都可以通过这个实现(需要注册多个则自己通过链式去调用) * @param sheetNo sheet页号,从0开始 * @param sheetName sheet名称 public static void write(String filePath, Class headClazz, List data, WriteHandler writeHandler, Integer sheetNo, String sheetName) { EasyExcel.write(filePath, headClazz).registerWriteHandler(writeHandler).sheet(sheetNo, sheetName).doWrite(data); * 按模板写文件(包含某些字段) * @param filePath * @param headClazz 表头模板 * @param data 数据 * @param includeCols 包含字段集合,根据字段名称显示 * @param sheetNo sheet页号,从0开始 * @param sheetName sheet名称 public static void writeInclude(String filePath, Class headClazz, List data, Set includeCols, Integer sheetNo, String sheetName) { EasyExcel.write(filePath, headClazz).includeColumnFiledNames(includeCols).sheet(sheetNo, sheetName).doWrite(data); * 按模板写文件(排除某些字段) * @param filePath * @param headClazz 表头模板 * @param data 数据 * @param excludeCols 过滤排除的字段,根据字段名称过滤 * @param sheetNo sheet页号,从0开始 * @param sheetName sheet名称 public static void writeExclude(String filePath, Class headClazz, List data, Set excludeCols, Integer sheetNo, String sheetName) { EasyExcel.write(filePath, headClazz).excludeColumnFiledNames(excludeCols).sheet(sheetNo, sheetName).doWrite(data); * 多个sheet页的数据链式写入 * ExcelUtil.writeWithSheets(outputStream) * .writeModel(ExcelModel.class, excelModelList, "sheetName1") * .write(headData, data,"sheetName2") * .finish(); * @param outputStream public static EasyExcelWriterFactory writeWithSheets(OutputStream outputStream) { EasyExcelWriterFactory excelWriter = new EasyExcelWriterFactory(outputStream); return excelWriter; * 多个sheet页的数据链式写入 * ExcelUtil.writeWithSheets(file) * .writeModel(ExcelModel.class, excelModelList, "sheetName1") * .write(headData, data,"sheetName2") * .finish(); * @param file public static EasyExcelWriterFactory writeWithSheets(File file) { EasyExcelWriterFactory excelWriter = new EasyExcelWriterFactory(file); return excelWriter; * 多个sheet页的数据链式写入 * ExcelUtil.writeWithSheets(filePath) * .writeModel(ExcelModel.class, excelModelList, "sheetName1") * .write(headData, data,"sheetName2") * .finish(); * @param filePath public static EasyExcelWriterFactory writeWithSheets(String filePath) { EasyExcelWriterFactory excelWriter = new EasyExcelWriterFactory(filePath); return excelWriter; * 多个sheet页的数据链式写入(失败了会返回一个有部分数据的Excel) * ExcelUtil.writeWithSheets(response, exportFileName) * .writeModel(ExcelModel.class, excelModelList, "sheetName1") * .write(headData, data,"sheetName2") * .finish(); * @param response * @param exportFileName 导出的文件名称 public static EasyExcelWriterFactory writeWithSheetsWeb(HttpServletResponse response, String exportFileName) throws IOException { response.setContentType("application/vnd.ms-excel"); response.setCharacterEncoding("utf-8"); // 这里URLEncoder.encode可以防止中文乱码 String fileName = URLEncoder.encode(exportFileName, "UTF-8"); response.setHeader("Content-disposition", "attachment;filename=" + fileName + ".xlsx"); EasyExcelWriterFactory excelWriter = new EasyExcelWriterFactory(response.getOutputStream()); return excelWriter;

3.引入自定义写入类,此类是原作者封装一个类方便使用链式调用的方式方便添加多sheet(这里下面生成时会用到这个链式调用)

package com.yangjie.testDemo1.util;
import com.alibaba.excel.EasyExcel;
import com.alibaba.excel.ExcelWriter;
import java.io.File;
import java.io.OutputStream;
import java.util.List;
 * Author:         YangJie
 * Datetime:       2022年11月16日 10:59
 * Description:    链式添加sheet表
public class EasyExcelWriterFactory {
    private int sheetNo = 0;
    private ExcelWriter excelWriter = null;
    public EasyExcelWriterFactory(OutputStream outputStream) {
        excelWriter = EasyExcel.write(outputStream).build();
    public EasyExcelWriterFactory(File file) {
        excelWriter = EasyExcel.write(file).build();
    public EasyExcelWriterFactory(String filePath) {
        excelWriter = EasyExcel.write(filePath).build();
     * 链式模板表头写入
     * @param headClazz 表头格式
     * @param data      数据 List<ExcelModel> 或者List<List<Object>>
     * @return
    public EasyExcelWriterFactory writeModel(Class headClazz, List data, String sheetName) {
        excelWriter.write(data, EasyExcel.writerSheet(this.sheetNo++, sheetName).head(headClazz).build());
        return this;
     * 链式自定义表头写入
     * @param head
     * @param data      数据 List<ExcelModel> 或者List<List<Object>>
     * @param sheetName
     * @return
    public EasyExcelWriterFactory write(List<List<String>> head, List data, String sheetName) {
        excelWriter.write(data, EasyExcel.writerSheet(this.sheetNo++, sheetName).head(head).build());
        return this;
     * 使用此类结束后,一定要关闭流
    public void finish() {
        excelWriter.finish();

4.下载ExcelUtil 工具类

package com.yangjie.testDemo1.util;
import lombok.extern.slf4j.Slf4j;
import javax.servlet.http.HttpServletResponse;
import java.io.*;
import java.net.URLEncoder;
 * @className com.yq.common.utils.ExcelUtil
 * @author: yangjie
 * @description: ExcelUtil
@Slf4j
public class ExcelUtil {
     * 下载Excel
     * @param response 请求response
     * @param fileName 下载文件名称 xxx.xlsx
     * @param filePath 下载文件路径 D://xxx/xxx
    public static void downExcel(HttpServletResponse response, String fileName, String filePath) {
        // path是指想要下载的文件的路径
        File file = new File(filePath);
        ExcelUtil.downExcel(response,fileName,file);
     * 下载Excel
     * @param response 请求response
     * @param fileName 下载文件名称 xxx.xlsx
     * @param file 下载文件流
    public static void downExcel(HttpServletResponse response, String fileName, File file) {
        FileInputStream fileInputStream = null;
        InputStream fis = null;
        OutputStream outputStream = null;
        try {
            // 将文件写入输入流
            fileInputStream = new FileInputStream(file);
            fis = new BufferedInputStream(fileInputStream);
            byte[] buffer = new byte[fis.available()];
            fis.read(buffer);
            fis.close();
            // 清空response
            response.reset();
            // 设置response的Header
            // 解决跨域问题,这句话是关键,对任意的域都可以,如果需要安全,可以设置成安前的域名
            response.addHeader("Access-Control-Allow-Origin", "*");
            response.addHeader("Access-Control-Allow-Methods", "GET, POST, PUT, DELETE");
            response.setHeader("FileName", URLEncoder.encode(fileName, "UTF-8"));
            response.setHeader("Access-Control-Expose-Headers", "FileName");
            response.setCharacterEncoding("UTF-8");
            //Content-Disposition的作用:告知浏览器以何种方式显示响应返回的文件,用浏览器打开还是以附件的形式下载到本地保存
            //attachment表示以附件方式下载   inline表示在线打开   "Content-Disposition: inline; filename=文件名.mp3"
            // filename表示文件的默认名称,因为网络传输只支持URL编码的相关支付,因此需要将文件名URL编码后进行传输,前端收到后需要反编码才能获取到真正的名称
            response.addHeader("Content-Disposition", "attachment;filename=" + URLEncoder.encode(fileName, "UTF-8"));
            // 告知浏览器文件的大小
            response.addHeader("Content-Length", "" + file.length());
            outputStream = new BufferedOutputStream(response.getOutputStream());
            response.setContentType("application/octet-stream");
            outputStream.write(buffer);
            outputStream.flush();
        } catch (IOException e) {
            e.printStackTrace();
            log.error("文件下载异常,{}", e);
        } finally {
            if (fileInputStream != null) {
                try {
                    fileInputStream.close();
                } catch (IOException e) {
                    e.printStackTrace();
            if (fis != null) {
                try {
                    fis.close();
                } catch (IOException e) {
                    e.printStackTrace();
            if (outputStream != null) {
                try {
                    outputStream.close();
                } catch (IOException e) {
                    e.printStackTrace();

5.创建实体类(这里的

@ExcelProperty(value = "品种", index = 0)
value对应 Excel中最上方显示名称 index:代表在第几列
package com.yangjie.testDemo1.entity;
import com.alibaba.excel.annotation.ExcelProperty;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.io.Serializable;
import java.math.BigDecimal;
 * @author YangJie
 * @date 2022年11月16日 13:49
@Data
@AllArgsConstructor
@NoArgsConstructor
public class ExportMyRequirementsInformationVo implements Serializable {
    private static final long serialVersionUID = -2986024804753822180L;
    @ExcelProperty(value = "品种", index = 0)
    private String spuName;
    @ExcelProperty(value = "企业名称", index = 1)
    private String customerEnterpriseName;
    @ExcelProperty(value = "需求量 (吨)", index = 2)
    private BigDecimal requirementWeight;
    @ExcelProperty(value = "品种需求占比", index = 3)
    private String proportionOfDemand;
    @ExcelProperty(value = "品牌偏好", index = 4)
    private String brand;
    @ExcelProperty(value = "竞争对手", index = 5)
    private String competitorName;

6:写入和下载文件  访问该请求地址浏览器可直接下载

(这里造的数据和输出的不一样是 因为我偷懒了)

* 导出我的需求信息 * @author YangJie * @date 2022/11/16 14:25 @GetMapping("/exportMyRequirementsInformation") public void exportMyRequirementsInformation(HttpServletResponse response) { List<ExportMyRequirementsInformationVo> exportMyRequirementsInformationVoList = new ArrayList<>(); //造数据 for (int i = 0; i < 10; i++) { ExportMyRequirementsInformationVo exportMyRequirementsInformationVo = new ExportMyRequirementsInformationVo(); exportMyRequirementsInformationVo.setRequirementWeight(BigDecimal.ONE); exportMyRequirementsInformationVo.setBrand("数据" + i); exportMyRequirementsInformationVo.setCompetitorName("Name" + i); exportMyRequirementsInformationVo.setSpuName("产品" + i); exportMyRequirementsInformationVoList.add(exportMyRequirementsInformationVo); //文件名称 注意这里一定要拼接文件格式 不然文件下载下来会是txt文件 String fileName = "我的Excel" + ".xlsx"; //文件存储路径 String tempPath = "/Users/yangjie/Desktop/testDemo/src/main/resources" + "/"; //导出/写入 文件路径 String filePath = tempPath + fileName; EasyExcelWriterFactory res = EasyExcelUtil.writeWithSheets(filePath) .writeModel(ExportMyRequirementsInformationVo.class, exportMyRequirementsInformationVoList, "我的需求信息"); res.finish(); ExcelUtil.downExcel(response,fileName,filePath);

解决: 想要实现循环 多sheet问题

1.因为在 EasyExcelWriterFactory 中我们封装了链式调用

我们就可以用循环的形式来添加多个sheet

1.1 因为第一个sheet和后面的格式不一样 可以单独为第一个sheet设置一个实体类

        EasyExcelWriterFactory res = null;
        for (Long spuId : spuIdSet) {
            if (res == null) {
               //判断循环当前是否是第一个sheet 如果是就用单独创建的类
                res = EasyExcelUtil.writeWithSheets(filePath)
                        .writeModel(ExportSummaryOfRequirementsVo.class, exportSummaryOfRequirementsVoList, "需求总览");
            List<ExampleExportRequirementStatisticsVo> exampleExportRequirementStatisticsVoResultList =
                    exampleExportRequirementStatisticsVoMap.get(spuId);
//因为这边需求是用产品名称来为sheet命名 
            String spuName = exampleExportRequirementStatisticsVoResultList.get(0).getSpuName();
//循环中 链式调用创建多sheet
            res = res.writeModel(ExampleExportRequirementStatisticsVo.class, exampleExportRequirementStatisticsVoResultList, spuName);
        res.finish();
ExcelUtil.downExcel(response,statisticalFileName,filePath);
1、Java导出动态数据Excel文件,具体示例可以参考:https://img-blog.csdnimg.cn/1cc86ee5dffa48669e2b97283585fad2.png 2、项目使用SpringBoot,Ali3.0.5版本的easyexcel框架。 3、资源内有具体的使用说明和易碰到的问题及解决方案,有博主个人联系方式,欢迎来交流。 使用说明: 1、下载资源后请先看readme文档,README.md中有项目的介绍和具体的使用流程说明和易碰到的问题及解决方案。 2、若各位项目需求与本资源的样式相符度低,例如业务有渲染单元格颜色的,或者要求字体加粗,或者写入到多个Sheet页,或者设置列宽、行高,或者合并单元格,或者自动列宽,或者插入批注,或者读取Excel数据,又或者日期、数字或者自定义格式转换等等的需求时,可以参考本资源里面的《导出Excel教程.docx》里面给的需求思路。 1、关于读取Excel和写入Excel的注解示例可以参考:https://download.csdn.net/download/gongjin28_csdn/85324 编写 controller 这个方法时get请求,浏览器直接请求这个地址就会自动触发下载,前端也可以通过流的方式接收接口返回,然后处理文件下载,方法如下首先在请求拦截器中添加如下判断添加接口 api 请求 调用实现 点击按钮调用接口触发下载
最近看了阿里的开源项目EasyExcel,发现它是个很强大的工具,但是官方介绍中大部分都是使用对象,变量增加注解的方式,下面主要是在代码中实现相关样式的调整 本文介绍一下SpringBoot中,简单通过List生成excel下载的方法,大家可以直接CV大法。还可以实现通过自己写样式策略来自由调整行高、自由合并。 一、将List直接导出Excel下载 1.controller内接口写法: @PostMapping("export") public void export(@RequestBo
项目要求从数据库中查询出相关数据后,通过表格展示给用户,如果用户需要,可以点击导出按钮,导出数据为csv格式。 开发环境:JDK7、Tomcat7、SpringBoot 网页中的表格 下载后的表格 1、数据库查询数据 2、创建临时csv文件 3、输出csv流文件,提供给浏览器下载 4、删除临时文件 测试地址:127.0.0.1:8080/export pom文件添加以下依赖 <dependency>
在Spring Boot中使用EasyExcel导出动态数据Excel文件的代码如下: 1. 首先,我们需要导入`easyexcel`的依赖。在`pom.xml`文件中添加以下依赖: ```xml <dependency> <groupId>com.alibaba</groupId> <artifactId>easyexcel</artifactId> <version>2.3.0</version> </dependency> 2. 创建一个Excel工具类,用于导出Excel文件。假设我们已经有一个名为`ExcelUtil`的工具类。 ```java import com.alibaba.excel.EasyExcel; import org.springframework.stereotype.Component; import javax.servlet.http.HttpServletResponse; import java.io.IOException; import java.io.InputStream; import java.net.URLEncoder; import java.util.List; @Component public class ExcelUtil { public void export(HttpServletResponse response, List<Object> data) throws IOException { // 设置响应头信息 response.setContentType("application/vnd.ms-excel"); response.setCharacterEncoding("utf-8"); String fileName = URLEncoder.encode("导出文件", "UTF-8"); response.setHeader("Content-disposition", "attachment;filename=" + fileName + ".xlsx"); // 导出Excel文件 EasyExcel.write(response.getOutputStream(), Object.class).sheet("Sheet1").doWrite(data); public void exportTemplate(HttpServletResponse response) throws IOException { // 设置响应头信息 response.setContentType("application/vnd.ms-excel"); response.setCharacterEncoding("utf-8"); String fileName = URLEncoder.encode("模板文件", "UTF-8"); response.setHeader("Content-disposition", "attachment;filename=" + fileName + ".xlsx"); // 导出模板文件 InputStream inputStream = getClass().getClassLoader().getResourceAsStream("template.xlsx"); EasyExcel.write(response.getOutputStream()).withTemplate(inputStream).sheet().doWrite(null); 3. 创建一个Controller类,用于处理导出Excel的请求。 ```java import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; import javax.servlet.http.HttpServletResponse; import java.io.IOException; import java.util.ArrayList; import java.util.List; @RestController @RequestMapping("/excel") public class ExcelController { @Autowired private ExcelUtil excelUtil; @GetMapping("/export") public void exportExcel(HttpServletResponse response) throws IOException { // 模拟动态数据,实际场景中可以根据业务需求获取数据 List<Object> data = new ArrayList<>(); data.add("数据1"); data.add("数据2"); data.add("数据3"); // 导出Excel文件 excelUtil.export(response, data); @GetMapping("/template") public void exportTemplate(HttpServletResponse response) throws IOException { // 导出Excel模板文件 excelUtil.exportTemplate(response); 以上代码演示了使用Spring Boot和EasyExcel导出动态数据Excel文件的过程。在Controller中,我们可以根据实际业务需求获取数据,并调用`ExcelUtil`中的方法实现导出操作。同时,我们也提供了导出Excel模板文件的方法,以方便用户进行数据录入。
安装flutter时遇到:has been compiled by a more recent version of the Java Runtime (class file version 55.0 安装flutter时遇到:has been compiled by a more recent version of the Java Runtime (class file version 55.0 weixin_43623277: 安装flutter时遇到:has been compiled by a more recent version of the Java Runtime (class file version 55.0 abtechwhs: 我也是真不懂,它这个东西下面那俩选项有的时候还不好使,幸好安卓开发工具虽然是jetbrain内核但是不收钱 安装flutter时遇到:has been compiled by a more recent version of the Java Runtime (class file version 55.0 abtechwhs: Java使用EasyExcel导出数据到Excel文件,以及调用接口下载文件 Bbl300Ey: 你可以把需要导出的字段传入,Excel 实体类中,写好判断导出哪些字段,再创建一个变量放在index中使用 Java使用EasyExcel导出数据到Excel文件,以及调用接口下载文件 可釦--稀饭: 那如果 他要自定义导出的字段 怎么处理 安装flutter时遇到:has been compiled by a more recent version of the Java Runtime (class file version 55.0 mysql模糊查询text字段时 查询效率极慢(优化) jrebel and xrebel 激活了用不了,Event Log :Auto build completed with errors