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

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

时间:2023-09-26 17:44:44浏览次数:45  
标签:文件 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 进行测试

可能遇到的问题 —— NullPointerException: FontConfiguration.getVersion

该问题是部署到服务器上遇到的,简单记录一下,具体原因和解决方案可参考以下两篇文章

二、下载文件

参考链接

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

 

标签:文件,String,ImageDemoData,EasyExcel,excel,add,new,getImage
From: https://www.cnblogs.com/fnlingnzb-learner/p/17730797.html

相关文章

  • nc命令,扫描端口,文件传输
    nc是netcat的简写,是一个强大的网络工具作用:实现任意tcp/udp端口的侦听,nc可以作为server以tcp或udp方式侦听指令端口端口扫描,nc可以作为client发起tcp或udp连接机器间传输文件机器间网络测速 使用示例:1.验证某ip 的80端口通不通nc -zv 192.168.66.680 返回......
  • [Go 夜读 第 148 期] Excelize 构建 WebAssembly 版本跨语言支持实践
    Excelize是Go语言编写的用于操作电子表格文档的基础库,支持XLAM/XLSM/XLSX/XLTM/XLTX等多种文档格式,高度兼容带有样式、图片(表)、透视表、切片器等复杂组件的文档,并提供流式读写支持,用于处理包含大规模数据的工作簿。可应用于各类报表平台、云计算、边缘计算等系统......
  • 实现一个大文件上传和断点续传
    本文将从零搭建前端和服务端,实现一个大文件上传和断点续传的demo前言本文将从零搭建前端和服务端,实现一个大文件上传和断点续传的demo前端:vueelement-ui服务端:nodejs文章有误解的地方,欢迎指出,将在第一时间改正,有更好的实现方式希望留下你的评论大文件上传整体思路前端......
  • 在用文件误删除恢复
    当一个文件在被打开,获取其他程序使用着,你不小心删除了的时候,不要慌,还有恢复的可能,也很简单如某系统日志被删除,或者某系统文件 执行命令  :  lsof|grepdeleted  查看带deleted字样的进程文件中有没有你删除的文件名,有的话,如图,执行了cp命令后,去到那个目录下查看......
  • centos7中恢复误删除文件foremost 工具
     它是将你所需要搜集的文件类型的文件全部都搜出来恢复,放到你指定的目录下,供你选择 可去阿里源搜索软件,找一个合适的rpm包装上,没什么依赖。  就只需要一条命令就可以了,然后去你指定的目录看结果。......
  • centos6误删文件恢复
     测试结果是在centos6上使用效果比较好,centos7上不给力,也不知道是否是虚拟机的缘故 当不小心误删除某文件或者目录的时候,     恢复的结果就存放在执行命令的目录下生成的目录下RECOVERED_FILES里当对还在挂载中的分区进行恢复时,会提示是否继续,选择y即可......
  • 超星读书下载的pdz文件如何转为pdf文件详细教程(亲测有效)
    前言:你还在为超星读书下载的pdz格式书籍而烦恼吗?还在为不知道怎么将pdz格式转为pdf格式而气愤吗?请看以下教程。流程:使用超星阅读器将pdz文件转换为.xps或.oxps文件利用第三方软件将.xps或.oxps文件转换为pdf文件踩坑提醒(可跳过直接看步骤一):主要是第二步中需要找到支持.xp......
  • linux系统安装软件时报错缺少libnsl.so.1文件解决方法
    linux系统安装软件时报错缺少libnsl.so.1文件解决方法1-当ISO文件或者在网上可以找到对应版本的libnsl库文件时,可采用以下命令安装:yuminstalllibnsl//系统ISO文件中存在libnsl库文件rpm-ivhlibnsl(下载的对应版本文件)//网上可以找到对应版本的libnsl库文件,并......
  • 找一种外发文件加密传输产品,需要考虑哪些问题?
    文件数据分布广泛,包括桌面及移动端、应用服务器、文件服务器、NAS、邮件系统、多云架构、组织内部和外部供应链。多年来,企业由于自身的安全防护机制不严谨,引发的数据安全事件频发。数据安全事件带来的社会影响日趋显著,经常导致严重的经济损失。全球42%的企业在过去一年中至少经历......
  • springboot大文件上传、分片上传、断点续传、秒传的实现
    对于大文件的处理,无论是用户端还是服务端,如果一次性进行读取发送、接收都是不可取,很容易导致内存问题。所以对于大文件上传,采用切块分段上传,从上传的效率来看,利用多线程并发上传能够达到最大效率。 本文是基于springboot+vue实现的文件上传,本文主要介绍服务端实现文件上传的......