You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Spring Boot中基于jxl将字节数组转为多Sheet的XLS文件并返回Base64

基于jxl实现多字节数组转多工作表Excel并返回Base64

依赖准备

如果是Maven项目,先在pom.xml中引入jxl依赖:

<dependency>
    <groupId>net.sourceforge.jexcelapi</groupId>
    <artifactId>jxl</artifactId>
    <version>2.6.12</version>
</dependency>

核心实现代码

以下是封装好的工具方法,支持将多个字节数组分别写入不同工作表,最终输出Base64字符串:

import jxl.Workbook;
import jxl.read.biff.BiffException;
import jxl.write.WritableSheet;
import jxl.write.WritableWorkbook;
import jxl.write.WriteException;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.util.Base64;
import java.util.List;

public class ExcelBase64Utils {

    public static String multiBytesToExcelBase64(List<byte[]> excelByteList, List<String> sheetNames) throws IOException, BiffException, WriteException {
        // 校验参数:字节数组集合和工作表名集合长度需一致
        if (excelByteList == null || sheetNames == null || excelByteList.size() != sheetNames.size()) {
            throw new IllegalArgumentException("字节数组集合与工作表名集合长度不匹配");
        }

        try (ByteArrayOutputStream outputStream = new ByteArrayOutputStream(20000000);
             WritableWorkbook targetWorkbook = Workbook.createWorkbook(outputStream)) {

            int sheetIndex = 0;
            for (byte[] excelBytes : excelByteList) {
                // 将单个字节数组转为输入流,读取源Excel
                try (ByteArrayInputStream inputStream = new ByteArrayInputStream(excelBytes)) {
                    Workbook sourceWorkbook = Workbook.getWorkbook(inputStream);
                    // 获取源Excel的第一个工作表(假设每个字节数组对应一个单工作表Excel)
                    jxl.Sheet sourceSheet = sourceWorkbook.getSheet(0);
                    // 在目标Workbook中创建新工作表
                    WritableSheet targetSheet = targetWorkbook.createSheet(sheetNames.get(sheetIndex), sheetIndex);
                    // 复制源工作表内容到目标工作表
                    copySheet(sourceSheet, targetSheet);
                    sourceWorkbook.close();
                    sheetIndex++;
                }
            }

            // 写入并关闭Workbook
            targetWorkbook.write();
            targetWorkbook.close();

            // 将字节数组编码为Base64字符串
            return Base64.getEncoder().encodeToString(outputStream.toByteArray());
        }
    }

    // 复制工作表内容的工具方法
    private static void copySheet(jxl.Sheet sourceSheet, WritableSheet targetSheet) throws WriteException {
        int rows = sourceSheet.getRows();
        int cols = sourceSheet.getColumns();

        // 复制单元格内容和格式
        for (int i = 0; i < rows; i++) {
            for (int j = 0; j < cols; j++) {
                targetSheet.addCell(new jxl.write.Label(j, i, sourceSheet.getCell(j, i).getContents()));
                // 如果需要保留单元格格式,可额外处理:targetSheet.getCell(j,i).setCellFormat(sourceSheet.getCell(j,i).getCellFormat())
            }
        }
    }
}

使用示例

在业务代码中调用工具方法:

// 假设你有多个Excel字节数组(比如从其他接口获取的Base64解码后的数据)
byte[] excelByte1 = Base64.getDecoder().decode(reportService.fetchReportExcel("report1"));
byte[] excelByte2 = Base64.getDecoder().decode(reportService.fetchReportExcel("report2"));

// 准备工作表名列表
List<String> sheetNames = List.of("报表1", "报表2");
List<byte[]> excelByteList = List.of(excelByte1, excelByte2);

// 转换为多工作表Excel的Base64字符串
String multiSheetExcelBase64 = ExcelBase64Utils.multiBytesToExcelBase64(excelByteList, sheetNames);

注意事项

  • jxl库仅支持XLS格式的Excel文件,无法处理XLSX格式,若需支持XLSX建议切换到POI库。
  • 处理大文件时,需注意内存占用,若字节数组过大,可能需要调整ByteArrayOutputStream的初始容量或考虑流式处理。
  • 必须确保每个输入的字节数组是有效的XLS文件,否则会抛出BiffException。
  • 所有IO流和Workbook资源都已通过try-with-resources自动关闭,避免资源泄漏。

内容的提问来源于stack exchange,提问作者mehnet ali

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.20 14:57:28