Java根据模板生成excel文件【Java】【EasyExcel】【xls】

Background

  • 前两天客户反应对数据导出的文件格式不太满意,然后给了我们模板,让我们按照模板导出数据。于是一通修改(excel数据量有限制他们也不管,之前我们给的csv格式)。
  • Java操作excel常用的有poi和阿里开源的easyexcel两种方式,poi太麻烦了这里用的easyexcel。
  • 根据模板生成文件还是比较简单的,因为我们不需要在代码中再设置各种格式、样式,模板设置好所有格式、样式以及占位符,只用写数据就行了,easyexcel使用个数据类非常方便。

1、简介

  • 如下图所示,template目录下是准备好的模板,export目录下是生成数据文件。我们这里以第一个模板theUser蒸汽历史数据.xls为例进行测试,theUser为占位符,生成的文件中会被替换成对应的用户名。
  • 我这里的代码逻辑是根据选取的用户、起始时间导出用户的历史数据,一个用户一个excel文件,所有用户数据文件在一个目录下,最后把这个目录再压缩成zip,最后用户点击导出的就是这个压缩文件。

在这里插入图片描述

2、模板格式

占位符这里分两种:

  • {字段名} :{theUser} 和 {reportDate}
  • {自定义名称.字段名}:数据类字段占位符,字段对应第二个图中的类HistoryData的字段,hisData在代码中定义。

在这里插入图片描述
在这里插入图片描述

3、代码

这里的数据都是模拟测试的,代码中使用了Hutool工具类。没有文件压缩等代码。我的另一篇博客已经介绍过了文件压缩的方法【Java导出MySQL数据成csv文件并压缩成zip】。

	public static void main(String[] args) {
        String reportDate = DateUtil.date().toString("yyyy年MM月dd日");
        // 模板文件
        String templateFile = "data/template/theUser蒸汽历史数据.xls";
        // 结果文件,省去了根据模板文件生成的步骤
        String resultFile = "data/export/明邦建材蒸汽历史数据.xls";
        // 根据模板文件生成目标文件
        ExcelWriter excelWriter = EasyExcel
                .write(resultFile)
                .withTemplate(templateFile)
                // 单独设置单元格格式
//                .registerWriteHandler(new CellStyleHandler())
                .build();
        WriteSheet writeSheet = EasyExcel.writerSheet().build();
        // 每次都会重新生成新的一行,而不是使用下面的空行
        FillConfig fillConfig = FillConfig.builder().forceNewRow(Boolean.TRUE).build();
        // 第一种占位符替换
        Map<String, Object> map = new HashMap<>();
        map.put("reportDate", reportDate);
        excelWriter.fill(map, writeSheet);
        // 第二种占位符替换,这里定义了 hisData
        excelWriter.fill(new FillWrapper("hisData", hisData()), fillConfig, writeSheet);
        excelWriter.finish();
    }

    private static List<HistoryData> hisData(){
        List<HistoryData> resList = new ArrayList<>();
        String today = DateUtil.now();
        String yesterday = DateUtil.yesterday().toString();
        HistoryData yesData = HistoryData.builder()
                .time(today)
                .temp(34.211)
                .press(1.222)
                .insFlow(34.211)
                .accFlow(233.125)
                .insHeat(20.532)
                .accHeat(112.562)
                .build();
        HistoryData nowData = HistoryData.builder()
                .time(yesterday)
                .temp(34.211)
                .press(1.222)
                .insFlow(34.211)
                .accFlow(233.125)
                .insHeat(20.532)
                .accHeat(112.562)
                .build();
        resList.add(yesData);
        resList.add(nowData);
        return resList;
    }

4、代码执行结果

在这里插入图片描述
在这里插入图片描述

5、单独设置单元格格式 CellStyleHandler

.registerWriteHandler(new CellStyleHandler()) 上面代码中的注释部分。

package com.cloudansys.hawkeye.modules.report.schedule;

import com.alibaba.excel.metadata.CellData;
import com.alibaba.excel.metadata.Head;
import com.alibaba.excel.write.handler.CellWriteHandler;
import com.alibaba.excel.write.metadata.holder.WriteSheetHolder;
import com.alibaba.excel.write.metadata.holder.WriteTableHolder;
import org.apache.poi.ss.usermodel.*;

import java.util.List;

public class CellStyleHandler implements CellWriteHandler {
    @Override
    public void beforeCellCreate(WriteSheetHolder writeSheetHolder, WriteTableHolder writeTableHolder, Row row, Head head, Integer integer, Integer integer1, Boolean aBoolean) {

    }

    @Override
    public void afterCellCreate(WriteSheetHolder writeSheetHolder, WriteTableHolder writeTableHolder, Cell cell, Head head, Integer integer, Boolean aBoolean) {

    }

    @Override
    public void afterCellDataConverted(WriteSheetHolder writeSheetHolder, WriteTableHolder writeTableHolder, CellData cellData, Cell cell, Head head, Integer integer, Boolean aBoolean) {

    }

    @Override
    public void afterCellDispose(WriteSheetHolder writeSheetHolder, WriteTableHolder writeTableHolder, List<CellData> list, Cell cell, Head head, Integer integer, Boolean aBoolean) {
        Workbook workbook = writeSheetHolder.getSheet().getWorkbook();
        CellStyle cellStyle = workbook.createCellStyle();
        Font font = workbook.createFont();
        font.setFontName("Times New Roman");
        cellStyle.setFont(font);
        cell.setCellStyle(cellStyle);
    }
}
根据excel模板动态导出数据库数据 package text; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.UUID; import javax.servlet.ServletContext; import net.sf.jxls.transformer.XLSTransformer; import org.apache.struts2.ServletActionContext; import com.opensymphony.xwork2.ActionSupport; public class TextAction extends ActionSupport { /** */ private static final long serialVersionUID = 1L; private String filename; @SuppressWarnings("rawtypes") public String export() throws Exception { String templateFile = "18.xls"; // String sql = "select * from t_ry order by rybm"; // exportAndDownload(templateFile, DataBase.retrieve(sql)); List datas = new ArrayList(); @SuppressWarnings("unchecked") HashMap map = new HashMap(); map.put("name", "1111"); datas.add(map); exportAndDownload(templateFile, datas); return SUCCESS; } @SuppressWarnings({ "rawtypes", "unchecked" }) public void exportAndDownload(String templateFile, List datas) { try { filename = UUID.randomUUID() + templateFile; // FacesContext context = FacesContext.getCurrentInstance(); // ServletContext servletContext = (ServletContext) // context.getExternalContext().getContext(); ServletContext servletContext = ServletActionContext .getServletContext(); String path = servletContext.getRealPath("\\ExcelFile"); String srcFilePath = path + "\\template\\" + templateFile; String destFilePath = path + "\\download\\" + filename; Map beanParams = new HashMap(); beanParams.put("results", datas); XLSTransformer transfer = new XLSTransformer(); transfer.transformXLS(srcFilePath, beanParams, destFilePath); // Browser.execClientScript("window.location.href='../ExcelFile/downloadfile.jsp?filename=" // + destFile + "';"); } catch (Exception e) { e.printStackTrace(); } } public String getFilename() { return filename; } public void setFilename(String filename) { this.filename = filename; } }
好的,您想了解如何使用Java版的alibaba.excel.EasyExcel库中的read方法来读取xls文件,对吗?那么下面是一个简单的示例代码,您可以参考一下: ```java import java.io.File; import java.util.List; import com.alibaba.excel.EasyExcel; import com.alibaba.excel.context.AnalysisContext; import com.alibaba.excel.event.AnalysisEventListener; public class ReadExcel { public static void main(String[] args) { // 设置文件路径 String filePath = "example.xls"; // 创建监听器 MyListener listener = new MyListener(); // 使用EasyExcel的read方法读取xls文件 EasyExcel.read(filePath, listener).sheet().doRead(); // 输出读取到的数据 List<List<String>> data = listener.getData(); System.out.println(data); } } // 自定义监听器 class MyListener extends AnalysisEventListener<List<String>> { private List<List<String>> data = new ArrayList<>(); @Override public void invoke(List<String> rowData, AnalysisContext context) { data.add(rowData); } @Override public void doAfterAllAnalysed(AnalysisContext context) {} public List<List<String>> getData() { return data; } } ``` 需要注意的是,alibaba.excel.EasyExcel库中的read方法可以读取xlsxlsx格式的文件。如果您还没有在项目中引入该库,可以在`pom.xml`文件中添加以下依赖: ```xml <dependency> <groupId>com.alibaba</groupId> <artifactId>easyexcel</artifactId> <version>2.2.9</version> </dependency> ``` 希望这个示例代码可以帮助到您。如果您还有其他问题,请继续提问。
评论 25
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

WaiSaa

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值