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
相关产品推荐
相关产品推荐

