首页 > 其他分享 >EasyExcel实现excel文件重复多次写入和导出&下载文件

EasyExcel实现excel文件重复多次写入和导出&下载文件

时间:2023-07-06 09:34:07浏览次数:47  
标签:文件 String ImageDemoData EasyExcel excel add new getImage

一、EasyExcel实现excel文件的导出

官方文档

导入依赖

<dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <version>1.18.24</version>
        </dependency>
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>easyexcel</artifactId>
            <version>3.1.1</version>
        </dependency>
    </dependencies>

创建excel对应的实体类

@Data
@AllArgsConstructor
@NoArgsConstructor
@EqualsAndHashCode
@ContentRowHeight(100)
@ColumnWidth(100 / 8)
public class ImageDemoData {

	@ExcelProperty(value = "图片数据,导出到excel文件,除了byte[]之外还可使用File InputStream String URL类型存储图片,具体可参考官方文档")
	private byte[] image;
	
	@ExcelProperty(value = "姓名")
	private String name;
	
	@ExcelProperty(value = "年龄")
	private Integer age;
}

excel文件重复多次写入(单个sheet) & 下载导出文件

@Slf4j
@RestController
public class TestController {

    @Value("/tmp/")
    private String path;

    @GetMapping("/test")
    public String test() {
        return "<h1>hello world</h1>";
    }

    public static String getTimeStr() {
        SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMddHHmmss");
        return sdf.format(new Date());
    }

    @GetMapping("/export")
    public void export(HttpServletRequest request, HttpServletResponse response) {
        String fileName = getTimeStr();
        String filePath = path + fileName + ".xlsx";
        File parentFolder = new File(path);
        if (!parentFolder.exists()) {
            parentFolder.mkdirs();
        }

        // 1. 导出excel文件
        // 多次查询分页数据,重复写入同一个excel
        try (ExcelWriter excelWriter = EasyExcel.write(filePath, ImageDemoData.class).build()) {
            // 这里注意 如果同一个sheet只要创建一次
            WriteSheet writeSheet = EasyExcel.writerSheet().build();
            // 去调用写入,这里我调用了五次,实际使用时根据数据库分页的总的页数来
            for (int pageNum = 1; pageNum <= 5; pageNum++) {
                // 模拟分页去数据库查询数据 实际可以去数据库查询每一页的数据
                List<ImageDemoData> list = findPage(pageNum);
				// 写入
                excelWriter.write(list, writeSheet);
            }
        }

        // 2. 下载excel文件
        response.setContentType("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet");
        response.setCharacterEncoding("utf-8");
        try {
            fileName = URLEncoder.encode(fileName, "UTF-8").replaceAll("\\+", "%20");
        } catch (UnsupportedEncodingException e) {
            log.error("导出excel文件名编码失败");
			e.printStackTrace();
        }
        response.setHeader("Content-Disposition", "attachment;filename*=utf-8''" + fileName + ".xlsx");

        try (BufferedInputStream bis = new BufferedInputStream(new FileInputStream(filePath))) {
            byte[] buff = new byte[1024];
            OutputStream os  = response.getOutputStream();
            int i;
            while ((i = bis.read(buff)) != -1) {
                os.write(buff, 0, i);
                os.flush();
            }
        } catch (IOException e) {
            log.error("导出excel文件失败");
			e.printStackTrace();
        }
    }

    private List<ImageDemoData> findPage(int pageNum) {
        return MyData.DB.get(pageNum);
    }
}

模拟DB的数据

这里直接使用内存数据,来模拟分页查询数据库这一操作

public class MyData {

    public static byte[] getImage() {
        // 注意:该路径是从当前磁盘根目录开始的
        String imagePath = "/" + "img.jpg";
        try {
            return FileUtils.readFileToByteArray(new File(imagePath));
        } catch (IOException e) {
            throw new RuntimeException(e);
        }
    }

    public static Map<Integer, List<ImageDemoData>> DB = new HashMap<Integer, List<ImageDemoData>>(){{
        put(1, new ArrayList<ImageDemoData>(){{
            add(new ImageDemoData(getImage(), "张三1", 22));
            add(new ImageDemoData(getImage(), "李四1", 22));
            add(new ImageDemoData(getImage(), "王五1", 22));
            add(new ImageDemoData(getImage(), "赵柳1", 22));
            add(new ImageDemoData(getImage(), "田七1", 22));
        }});
        put(2, new ArrayList<ImageDemoData>(){{
            add(new ImageDemoData(getImage(), "张三2", 24));
            add(new ImageDemoData(getImage(), "李四2", 24));
            add(new ImageDemoData(getImage(), "王五2", 24));
            add(new ImageDemoData(getImage(), "赵柳2", 24));
            add(new ImageDemoData(getImage(), "田七2", 24));
        }});
        put(3, new ArrayList<ImageDemoData>(){{
            add(new ImageDemoData(getImage(), "张三3", 26));
            add(new ImageDemoData(getImage(), "李四3", 26));
            add(new ImageDemoData(getImage(), "王五3", 26));
            add(new ImageDemoData(getImage(), "赵柳3", 26));
            add(new ImageDemoData(getImage(), "田七3", 26));
        }});
        put(4, new ArrayList<ImageDemoData>(){{
            add(new ImageDemoData(getImage(), "张三4", 28));
            add(new ImageDemoData(getImage(), "李四4", 28));
            add(new ImageDemoData(getImage(), "王五4", 28));
            add(new ImageDemoData(getImage(), "赵柳4", 28));
            add(new ImageDemoData(getImage(), "田七4", 28));
        }});
        put(5, new ArrayList<ImageDemoData>(){{
            add(new ImageDemoData(getImage(), "张三5", 30));
            add(new ImageDemoData(getImage(), "李四5", 30));
            add(new ImageDemoData(getImage(), "王五5", 30));
        }});
    }};
}

测试

运行SpringBoot启动类,访问 http://localhost:8080/export 进行测试

二、下载文件

参考链接

此处作者不再赘述直接上链接,想尝试其他不同写法的可参考这篇文章

标签:文件,String,ImageDemoData,EasyExcel,excel,add,new,getImage
From: https://www.cnblogs.com/blank-ys/p/17531207.html

相关文章

  • WordPress主题,当前页面使用了哪个template模板文件?
    对于页面与模板的对应情况一般都是能确定的,不过新朋友一时不熟悉可能还是需要花一点时间。其实,可以有一个小技巧,可以快速确定当前页面对应的模板文件。想要实现上面的效果,只需将下面代码加入主题的 functions.php 文件。functionzhuige_admin_bar_init(){//Ifnota......
  • win10 用 everything 搜索磁盘上所有软链接,硬链接文件
    方法一:Toviewreparsetargets(filesandfolders)andhardlinktargets(files):InEverything1.5,rightclicktheresultlistcolumnheaderandclickAddcolumns....Searchfor:reparseSelectReparseTargetandclickOK.rightclicktheresultlistcolu......
  • axios请求下载Excel文件流
    注意求类型:responseType:'blob'axios({url:url,method:'post',data:data,responseType:'blob'}).then(res=>{letblob=newBlob([res.data])leturl=window.URL.createObjectURL(bl......
  • oracle的tnsname.ora(网络服务名配置文件)
    #tnsnames.oraNetworkConfigurationFile:E:\oracle\oracleBaseMenu\oracleMainMenu\network\admin\tnsnames.ora#GeneratedbyOracleconfigurationtools.#sqlplususername/password@service_name普通用户登录#sqlplususername/password@service_nameassys......
  • linux 怎么定时去执行一个 .sh 文件
    在Linux中,你可以使用crontab来定时执行一个.sh文件。Crontab是一个定时任务管理工具,它允许你在指定的时间间隔内运行命令或脚本。下面是一些使用crontab定时执行.sh文件的步骤:打开终端或SSH连接到你的Linux服务器。输入以下命令以编辑crontab文件:crontab-......
  • python excel 模块优劣
    '''xlrd库:从excel中读取数据,支持xls、xlsxxlwt库:对excel进行修改操作,不支持对xlsx格式的修改xlutils库:在xlw和xlrd中,对一个已存在的文件进行修改openpyxl:主要针对xlsx格式的excel进行读取和编辑xlwings:对xlsx、xls、xlsm格式文件进行读写、格式修改等操作xlsxwriter:用来生......
  • 十、添加资源文件和使用样式
    1、添加资源文件(.qrc文件)1.1创建项目并打开项目1.2Ctrl+n创建新文件,选择“QT”文件下边的“QtResourceFile”。 1.3输入文件名和选择保存路径1.4将需要添加的资源文件复制到项目目录下1.5导入资源文件到Qt项目中1.5.1 为资源文件添加前缀(类似于文件夹) 1.5.2......
  • 流式细胞文件(.fcs)结构简介
    FCS一个完整的数据集主要有以下几部分:头段(必须)从数据集的第一个字节开始,文件的第一个数据集是从文件的第一个字节开始,最小长度为58个字节。以ASCII码解析。记录内容包括文件版本号(0~5共6字节)、文本段开始字节位(10~17共8字节)、文本段结束字节位(18~25共8字节)、数据段开始字节......
  • 关于调试gmsh源码过程中产生的gmsh.dll和gmsh.pdb文件无法匹配,进而导致无法载入pdb文
    省流版由于ALL_BUILD会将对应于gmsh.exe的调试文件gmsh.pdb附在对应于gmsh.dll的调试文件gmsh.pdb文件,进而导致gmsh.pdb无法和gmsh.dll文件进行版本匹配,进而导致无法载入,进而导致无法调试gmsh源码;解决办法:将对应于gmsh.exe的gmsh.pdb改为其他任意命名即可;或者仅仅生成gms......
  • springboot 加载自定义的属性配置文件 或者xml文件
    1、properties user.propertiesname=zhangshanage=18  2、xml Pen1.xml<?xmlversion="1.0"encoding="utf-8"?><!DOCTYPEpropertiesSYSTEM"http://java.sun.com/dtd/properties.dtd"><properties><......