JXLS导出

【前提提要】

在项目中客户提出了导出的特定格式,所以 Hutool 工具就没那么方便了,这次使用了 JXLS 工具。为了便于理解,本篇文章直接使用实例来说明。

【实例】

1、首先引入 jxls 依赖

<!-- JXLS 账票导出 -->
<dependency>
    <groupId>org.jxls</groupId>
    <artifactId>jxls</artifactId>
    <version>2.10.0</version>
</dependency>

<dependency>
    <groupId>org.jxls</groupId>
    <artifactId>jxls-poi</artifactId>
    <version>2.10.0</version>
</dependency>

2、创建一个工具类

用于接收导出数据、写入文件及导出文件。

工具类 JXLSExcel.java

package com.example.hellospringboot.Tools;

import org.jxls.common.Context;
import org.jxls.transform.Transformer;
import org.jxls.transform.poi.PoiTransformer;
import org.jxls.util.JxlsHelper;
import org.springframework.core.io.Resource;
import org.springframework.stereotype.Component;

import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.util.Map;

/**
 * Excel 帐票输出
 * @author admin
 */
@Component
public class JXLSExcel {
    /**
     * Excel 账票模板出力
     *
     * @param outStream        输出流
     * @param templateResource 模板文件
     * @param data             帐票数据
     */
    public IOException createDocument(OutputStream outStream, Resource templateResource, Map<String, Object> data) {
        IOException e = null;
        try (InputStream input = templateResource.getInputStream()) {
            Context context = new Context();
            for (Map.Entry<String, Object> element : data.entrySet()) {
                context.putVar(element.getKey(), element.getValue());
            }
            Transformer transformer = PoiTransformer.createTransformer(input, outStream);
            transformer.setFullFormulaRecalculationOnOpening(true);
            JxlsHelper.getInstance().processTemplate(context,transformer);
        } catch (IOException exception) {
            e = exception;
        } catch (RuntimeException exception) {
            e = new IOException(exception);
        } finally {
            closeAndFlushOutput(outStream);
        }
        return e;
    }

    /**
     * 保存并关闭输出流
     *
     * @param outStream 输出流
     */
    private void closeAndFlushOutput(OutputStream outStream) {
        try {
            outStream.flush();
            outStream.close();
        } catch (IOException exception) {
            // ignore exception
        }
    }
}

3、创建一个导出文件的模板

  • 调整好表格样式
  • 定义导出数据的属性名
  • 通过表格的批注声明一些 jxls 配置

如图,

1 是声明出表格中最后一个表格的位置(g是列,4是行),要在第一个表格添加批注声明;

2 是声明了需要循环的数据和表格位置,items 声明循环的数据是 datas,var 声明循环到当前的 item 是 data,lastCell 声明了循环的范围,在需要表格循环的第一个表格位置添加批注声明;

3 是属于循环外的数据,所以要额外定义,所以这个表格需要传入的数据是 datas 和 sum 。

PS:添加批注的方式是 审阅 -> 新建批注

4、传入数据

PersonServiceImpl.java

/**
 * 导出
 * @param response
 * @param personQueryDto 查询条件
 * @throws IOException
*/
@Override
public void export(HttpServletResponse response, PersonQueryDto personQueryDto) throws IOException {
    // 这里可以根据查询条件查询数据,不是重点,暂不延伸
    // 注意属性名要与表格中的一一对应,对应不上的会显示空
    List<Person> list = personMapper.selectList(new QueryWrapper<>());

    response.setContentType("application/octet-stream;charset=utf-8");
    response.setHeader(org.springframework.http.HttpHeaders.CONTENT_DISPOSITION, ContentDisposition.builder("attachment").filename("SubMaterialTemplate.xlsx", StandardCharsets.UTF_8).build().toString());

    // 定义一个 map 用于传导出数据,注意 key 要用 datas 和 sum
    Map<String, Object> data = new HashMap<>(2);
    data.put("datas", list);
    data.put("sum", list.size());

    IOException exception = jxlsExcel.createDocument(response.getOutputStream(), templateExcel, data);
    if (exception != null) {
        //异常场合
        throw exception;
    }
}

PS:因为我的例子是在前台下载出文件,所以是以上写法。在 JXLS 官方文档中是在后台文件下指定下载,只要将传入的 OutputStream 重新定义一下即可。

/**
 * 导出
 * @param response
 * @param personQueryDto 查询条件
 * @throws IOException
*/
@Override
public void export(HttpServletResponse response, PersonQueryDto personQueryDto) throws IOException {
    // 这里可以根据查询条件查询数据,不是重点,暂不延伸
    // 注意属性名要与表格中的一一对应,对应不上的会显示空
    List<Person> list = personMapper.selectList(new QueryWrapper<>());


    // 定义一个 map 用于传导出数据,注意 key 要用 datas 和 sum
    Map<String, Object> data = new HashMap<>(2);
    data.put("datas", list);
    data.put("sum", list.size());

    // 指定下载到 target 下,文件名为人员导出
    OutputStream os = new FileOutputStream("target/人员导出.xlsx");
    IOException exception = jxlsExcel.createDocument(os, templateExcel, data);
    if (exception != null) {
        //异常场合
        throw exception;
    }
}

5、PersonController.java

/**
 * 导出
 */
@PostMapping(value = "/export")
public void export(@RequestBody @Validated PersonQueryDto personQueryDto, HttpServletResponse response) throws IOException {
    personService.export(response, personQueryDto);
}

6、前台下载

jxlsExport () {
    this.$axios.post('/person/export', {}, {
        responseType: 'arraybuffer'
    }).then((res) => {
        this.fileSaveAs(res, '人员一览表.xlsx')
    })
},
/**
 * 文件另存为
 * @param res 文件下载服务器响应response
 * @param fileName 存储的文件名
*/
fileSaveAs (res, fileName) {
    const doc = document
    const url = window.URL.createObjectURL(new Blob([res]))
    const link = doc.createElement('a')
    link.style.display = 'none'
    link.href = url
    link.setAttribute('download', fileName)
    doc.body.appendChild(link)
    link.click()
    doc.body.removeChild(link)
}

7、下载效果

下载到前台的效果:

下载到后台的效果:

两种方式下载的文件内容是相同的。

【官网地址】

官网:JXLS - (sourceforge.net)

有问题欢迎留言~

jxls是一个用于在Java应用程序中生成和导出Excel文档的开源框架。该框架支持多种数据源,包括列表、Map和JavaBean。jxls也支持导出带有附件的Excel文档。 要在jxls导出带有附件的Excel文档,首先需要为模板文件添加一个附件。可以在模板文件中插入一个超链接或按钮,点击该链接或按钮会下载或打开附件。添加附件的步骤如下: 1. 将附件文件保存到任意位置。 2. 在Excel模板中插入一个超链接或按钮。 3. 在超链接或按钮的目标属性中指定附件的URL地址。例如:file://C:/附件.txt。 4. 在代码中使用jxls框架导出Excel文档时,将附件文件作为参数传递给框架。 下面是一个简单的示例代码,演示如何在jxls导出带有附件的Excel文档: ```java // 模板文件路径 String templatePath = "template.xls"; // 导出文件路径 String outputPath = "output.xls"; // 附件文件路径 String attachmentPath = "attachment.txt"; Map<String, Object> data = new HashMap<String, Object>(); // 设置导出数据 // 创建jxls导出器 Transformer transformer = TransformerFactory.createTransformer( new File(templatePath), new FileOutputStream(outputPath)); // 添加附件 transformer.addTool(new UrlTool(attachmentPath, "__attachment__")); // 将数据导出到Excel文档 Workbook workbook = transformer.transform(); workbook.write(new FileOutputStream(outputPath)); ``` 在上面的代码中,我们通过调用UrlTool的构造函数将附件文件添加到导出器中。UrlTool是jxls框架中的一个工具类,用于添加超链接或按钮。__attachment__是一个占位符,将在模板中用于定位附件。在模板Excel中,用${__attachment__}代表这个占位符。最终,我们将数据导出到Excel文档,并将Excel文档写入输出流中。 总之,jxls支持导出带有附件的Excel文档。通过在模板文件中添加超链接或按钮,并在代码中将附件文件添加到导出器中,我们可以轻松地实现导出带有附件的Excel文档。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值