java导出excel

本文详细介绍了如何在Java中利用Hutool和ApachePOI库创建Excel模板,模拟数据对象,以及如何动态填充数据并设置特定单元格内容,包括导出文件的设置和注意事项。
摘要由CSDN通过智能技术生成

这篇文档手把手教你完成导出excel,有这个demo,其他excel导出都通用。

?模板下载如果要VIP,去我的主页-资源里面看下,我另外一个资料。

引入以下依赖

        <dependency>
            <groupId>cn.hutool</groupId>
            <artifactId>hutool-all</artifactId>
            <version>5.3.0</version>
        </dependency>

        <dependency>
            <groupId>cn.hutool</groupId>
            <artifactId>hutool-core</artifactId>
            <version>5.3.0</version>
        </dependency>

        <dependency>
            <groupId>org.apache.poi</groupId>
            <artifactId>poi-ooxml</artifactId>
            <version>4.1.2</version>
        </dependency>
        
        <dependency>
            <groupId>repository.org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <version>1.16.22</version>
        </dependency>

1、模板excel见附件。

2、以下为模拟数据对象:

package com.example.demo.excel;

import lombok.Data;

/**
 * 模拟数据对象
 * @Auth xiajun
 */
@Data
public class DataDemo {
    private String content;//工作内容
    private String allPers;//用工总人数
    private String ptNum;//普通用工数
    private String jgNum;//技工用工数
    private String price;//单价(元)
    private String money;//金额(元)
    private String notes;//备注
    public DataDemo(){

    }
    public DataDemo(String content, String allPers, String ptNum, String jgNum, String price, String money, String notes) {
        this.content = content;
        this.allPers = allPers;
        this.ptNum = ptNum;
        this.jgNum = jgNum;
        this.price = price;
        this.money = money;
        this.notes = notes;
    }
}

3、以下为excel导出逻辑

package com.example.demo.excel;

import cn.hutool.core.collection.CollUtil;
import cn.hutool.poi.excel.ExcelReader;
import cn.hutool.poi.excel.ExcelUtil;
import cn.hutool.poi.excel.ExcelWriter;
import cn.hutool.poi.excel.StyleSet;
import lombok.extern.slf4j.Slf4j;
import org.apache.poi.ss.usermodel.*;
import org.springframework.web.bind.annotation.*;

import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.net.URLEncoder;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.concurrent.atomic.AtomicInteger;

/**
 * java导出excel
 * @Auth xiajun
 */
@Slf4j
@RestController
@RequestMapping("mvc/cadre")
public class Test {
    @GetMapping(path = "/export")
    public void export(HttpServletResponse response) throws IOException {
        {
            //1、模拟数据
            List<DataDemo> datas = new ArrayList<>();

            //模拟数据
            for(int i =0 ;i < 4; i++){
                datas.add(new DataDemo("填坑"+i, "11"+i, "22"+i, "33"+i, "44"+i, "55"+i, "备注一下"+i));
            }

            //2、读取已存在的Excel文件
            ExcelWriter writer = ExcelUtil.getWriter("templates/mb.xlsx");

            //3、=====================设置列表前指定单元格数据============================
            //协作单位
            writer.getOrCreateCell(0, 2)
                    .setCellValue("协作单位:中国建筑集团");//setCellValue这个不改变原有单元格样式
            //时间
            writer.getOrCreateCell(5, 2)
                    .setCellValue("时间:2024-01-04");

            //4、=====================设置列表数据=================================
            int insertRowNum = 5; // 指定要插入新行的行号
            int numberOfNewRows = datas.size(); // 指定要插入的新行数量
            // 先将原有的行向下移动 numberOfNewRows 行,为新行腾出位置
            writer.getSheet().shiftRows(insertRowNum, writer.getSheet().getLastRowNum(), numberOfNewRows, true, true);

            AtomicInteger count = new AtomicInteger(0);
            for (int i = 0; i < datas.size(); i++) {
                writer.getOrCreateRow(insertRowNum + i + 1); // 获取或创建新行对象
                int number = count.incrementAndGet();//序号
                //x为第几列,y为第几行,按照你模板来设置
                writer.writeCellValue(0, insertRowNum, number);
                writer.writeCellValue(1, insertRowNum, datas.get(i).getContent());
                writer.writeCellValue(2, insertRowNum, datas.get(i).getAllPers());
                writer.writeCellValue(3, insertRowNum, datas.get(i).getPtNum());
                writer.writeCellValue(4, insertRowNum, datas.get(i).getJgNum());
                writer.writeCellValue(5, insertRowNum, datas.get(i).getPrice());
                writer.writeCellValue(6, insertRowNum, datas.get(i).getMoney());
                writer.writeCellValue(7, insertRowNum, datas.get(i).getNotes());
                insertRowNum++;//数据往下面排
            }
            //5、=====================设置列表后指定单元格数据============================
            //合计金额
            log.info("设置列表后的行:{}", insertRowNum);
            writer.getOrCreateCell(3, insertRowNum)
                    .setCellValue("100万元");
            //协作单位负责人
            writer.getOrCreateCell(0, insertRowNum+1)
                    .setCellValue("协作单位负责人:张三");
            //经办人
            writer.getOrCreateCell(3, insertRowNum+1)
                    .setCellValue("经办人:李四");
            //部门负责人
            writer.getOrCreateCell(5, insertRowNum+1)
                    .setCellValue("部门负责人:王五");

            //6、======================输出文件====================================
            // 设置content—type
            response.setContentType("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet;charset:utf-8");
            response.setHeader("Content-Disposition","attachment;filename=data.xlsx");

            // 设置标题
            //Content-disposition是MIME协议的扩展,MIME协议指示MIME用户代理如何显示附加的文件。
            ServletOutputStream outputStream = response.getOutputStream();

            //将Writer刷新到OutPut
            writer.flush(outputStream, true);
            outputStream.close();
        }
    }
}

4、导出效果

注意事项:如果你调整了代码设置数据,但是没生效,把target目录下的class文件删除重启哈就生效了。

============================好用记得点个赞哟!!!==========================

  • 7
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值