Easy Excel动态表头的实现

步骤:

1.查找官方API文档理解实现

2.实现融入到代码里面

一:Easy Excel动态头实时生成头写入

动态头实时生成头写入

二:实现

目的:实现表头为,第一列是固定列,第二列为动态生成的时间段的每一天的日期

步骤:

1.查询数据

2.创建表头

3.填充数据

例子:

package com.test.cn.sales.service.impl;

import com.alibaba.excel.EasyExcel;

import java.io.File;
import java.time.LocalDate;
import java.time.format.DateTimeFormatter;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;

public class DynamicExcelExport {
    public static void main(String[] args) {
        //1.模拟从数据库中获取数据
        List<String> keywords = getKeywordsFromDatabase();
        List<SalesData> salesDataList = getSalesDataFromDatabase();

        //2.创建表头
        List<String> dates = generateDateRange("2023-12-30", "2024-02-02");// 根据开始和结束时间动态生成日期
        List<List<String>> head = new ArrayList<>();
        head.add(new ArrayList<>(Arrays.asList("关键字"))); // 第一列固定为关键字
        dates.forEach(o -> head.add(new ArrayList<>(Arrays.asList(o))));

        //3.填充数据
        List<List<Object>> data = fillData(keywords, salesDataList, dates);

        String outputPath = "E:\\output.xlsx"; // 输出路径修改为 E 盘
        EasyExcel.write(new File(outputPath)).head(head).sheet("Sheet1")
                .doWrite(data);
        System.out.println("Excel 文件导出成功!输出路径:" + outputPath);
    }

    private static List<String> getKeywordsFromDatabase() {
        // 模拟从数据库中获取关键字
        return new ArrayList<>(Arrays.asList("关键字1", "关键字2", "关键字3"));
    }

    private static List<SalesData> getSalesDataFromDatabase() {
        // 模拟从数据库中获取销售数据
        List<SalesData> salesDataList = new ArrayList<>();
        salesDataList.add(new SalesData("关键字1", 100.00, "2023-12-30"));
        salesDataList.add(new SalesData("关键字2", 200.00, "2024-02-02"));
        salesDataList.add(new SalesData("关键字3", 300.00, "2024-02-01"));
        return salesDataList;
    }


    private static List<List<Object>> fillData(List<String> keywords, List<SalesData> salesDataList, List<String> dates) {
        // 填充数据
        List<List<Object>> data = new ArrayList<>();
        for (String keyword : keywords) {
            List<Object> rowData = new ArrayList<>();
            rowData.add(keyword); // 添加关键字
            for (String date : dates) {
                Double sales = getSalesForKeywordAndDate(keyword, date, salesDataList);
                rowData.add(sales != null ? sales : 0); // 添加销量数据
            }
            data.add(rowData);
        }
        return data;
    }

    private static Double getSalesForKeywordAndDate(String keyword, String date, List<SalesData> salesDataList) {
        // 根据关键字和日期从销售数据列表中获取销量数据
        for (SalesData salesData : salesDataList) {
            if (salesData.getKeyword().equals(keyword) && salesData.getDate().toString().equals(date)) {
                return salesData.getSales();
            }
        }
        return null;
    }

    /**
     * 时间段生成
     *
     * @param startDateStr 开始时间
     * @param endDateStr   结束时间
     * @return list
     */
    public static List<String> generateDateRange(String startDateStr, String endDateStr) {
        List<String> dateRange = new ArrayList<>();
        DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd");
        LocalDate startDate = LocalDate.parse(startDateStr, formatter);
        LocalDate endDate = LocalDate.parse(endDateStr, formatter);

        while (!startDate.isAfter(endDate)) {
            dateRange.add(startDate.format(formatter));
            startDate = startDate.plusDays(1);
        }
        return dateRange;
    }
}

class SalesData {
    private String keyword;

    private Double sales;

    private String date;

    public SalesData(String keyword, Double sales, String date) {
        this.keyword = keyword;
        this.sales = sales;
        this.date = date;
    }

    public String getKeyword() {
        return keyword;
    }

    public void setKeyword(String keyword) {
        this.keyword = keyword;
    }

    public Double getSales() {
        return sales;
    }

    public void setSales(Double sales) {
        this.sales = sales;
    }

    public String getDate() {
        return date;
    }

    public void setDate(String date) {
        this.date = date;
    }
}

导出效果:

  • 10
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,下面是Spring Boot使用Easy Excel实现Excel导入的步骤: 1. 添加Easy Excel依赖 在pom.xml文件中添加Easy Excel的依赖: ``` <dependency> <groupId>com.alibaba</groupId> <artifactId>easyexcel</artifactId> <version>2.3.0</version> </dependency> ``` 2. 创建Excel实体类 创建一个实体类,用于映射Excel中的数据,例如: ``` @Data public class User { @ExcelProperty(value = "姓名", index = 0) private String name; @ExcelProperty(value = "年龄", index = 1) private Integer age; @ExcelProperty(value = "性别", index = 2) private String gender; } ``` 3. 编写Excel读取器 创建一个ExcelReader类,用于读取Excel文件中的数据: ``` @Component public class ExcelReader { public List<User> readExcel(MultipartFile file) throws IOException { InputStream inputStream = file.getInputStream(); ExcelReader excelReader = EasyExcel.read(inputStream, User.class, new ExcelListener()).build(); ReadSheet readSheet = EasyExcel.readSheet(0).build(); excelReader.read(readSheet); excelReader.finish(); return ExcelListener.getData(); } } ``` 其中,ExcelListener是一个继承了AnalysisEventListener的类,用于读取Excel中的数据并保存到一个List中: ``` public class ExcelListener extends AnalysisEventListener<User> { private static List<User> dataList = new ArrayList<>(); @Override public void invoke(User user, AnalysisContext analysisContext) { dataList.add(user); } @Override public void doAfterAllAnalysed(AnalysisContext analysisContext) { } public static List<User> getData() { return dataList; } } ``` 4. 创建Controller接口 创建一个Controller接口,用于接收上传的Excel文件,调用ExcelReader读取Excel文件中的数据,并返回读取到的数据: ``` @RestController @RequestMapping("/excel") public class ExcelController { @Autowired private ExcelReader excelReader; @PostMapping("/import") public List<User> importExcel(@RequestParam("file") MultipartFile file) throws IOException { return excelReader.readExcel(file); } } ``` 5. 测试导入Excel 启动Spring Boot应用程序,使用Postman等工具发送POST请求,上传Excel文件并测试导入功能。 以上就是使用Spring Boot和Easy Excel实现Excel导入的步骤,希望对你有所帮助。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值