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

Java如何将.xlsx格式Base64字符串或字节数组转换为可读字符串

解决方案

前置依赖

使用Apache POI处理xlsx格式,这是Java生态最成熟的Excel处理工具,已经封装好了xlsx压缩包解压、XML解析的逻辑,不需要自己手动处理底层格式。
Maven依赖配置如下:

<dependencies>
    <dependency>
        <groupId>org.apache.poi</groupId>
        <artifactId>poi</artifactId>
        <version>5.2.5</version>
    </dependency>
    <dependency>
        <groupId>org.apache.poi</groupId>
        <artifactId>poi-ooxml</artifactId>
        <version>5.2.5</version>
    </dependency>
</dependencies>

具体实现步骤

  • 第一步:将Gmail API返回的Base64字符串解码为byte数组
  • 第二步:将byte数组转为XSSFWorkbook对象,读取工作表内容
  • 第三步:遍历行/单元格,按CSV格式拼接为可读字符串,可直接跳过头部多余的格式行

完整代码示例

import org.apache.poi.ss.usermodel.Cell;
import org.apache.poi.ss.usermodel.DataFormatter;
import org.apache.poi.ss.usermodel.Row;
import org.apache.poi.xssf.usermodel.XSSFSheet;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;
import java.util.Base64;

public class XlsxParser {
    // 传入Gmail返回的xlsx附件Base64字符串,返回类CSV格式的可读字符串
    public static String xlsxBase64ToCsvStr(String base64Content, int skipHeaderRows) throws Exception {
        // 1. Base64解码为byte数组
        byte[] xlsxBytes = Base64.getDecoder().decode(base64Content);
        // 2. 加载为xlsx工作簿对象
        try (XSSFWorkbook workbook = new XSSFWorkbook(xlsxBytes)) {
            // 取第一个工作表,如有多个可按需调整索引
            XSSFSheet sheet = workbook.getSheetAt(0);
            DataFormatter dataFormatter = new DataFormatter();
            StringBuilder csvSb = new StringBuilder();
            // 3. 遍历行,skipHeaderRows为要跳过的头部多余格式行数量
            for (int i = skipHeaderRows; i <= sheet.getLastRowNum(); i++) {
                Row row = sheet.getRow(i);
                if (row == null) continue;
                // 遍历单元格,按逗号拼接
                for (int j = 0; j < row.getLastCellNum(); j++) {
                    Cell cell = row.getCell(j);
                    // 自动将数字、日期等格式转为对应字符串
                    String cellValue = dataFormatter.formatCellValue(cell);
                    csvSb.append(cellValue);
                    if (j != row.getLastCellNum() - 1) {
                        csvSb.append(",");
                    }
                }
                csvSb.append("\n");
            }
            return csvSb.toString();
        }
    }

    // 直接传入byte数组的重载方法
    public static String xlsxBytesToCsvStr(byte[] xlsxBytes, int skipHeaderRows) throws Exception {
        try (XSSFWorkbook workbook = new XSSFWorkbook(xlsxBytes)) {
            XSSFSheet sheet = workbook.getSheetAt(0);
            DataFormatter dataFormatter = new DataFormatter();
            StringBuilder csvSb = new StringBuilder();
            for (int i = skipHeaderRows; i <= sheet.getLastRowNum(); i++) {
                Row row = sheet.getRow(i);
                if (row == null) continue;
                for (int j = 0; j < row.getLastCellNum(); j++) {
                    Cell cell = row.getCell(j);
                    String cellValue = dataFormatter.formatCellValue(cell);
                    csvSb.append(cellValue);
                    if (j != row.getLastCellNum() - 1) csvSb.append(",");
                }
                csvSb.append("\n");
            }
            return csvSb.toString();
        }
    }
}

注意事项

  • 直接将xlsx的byte数组转字符串会出现乱码,因为xlsx本质是zip压缩包,内部XML结构需要先解压解析,Apache POI已经封装了这部分底层逻辑
  • 方法中的skipHeaderRows参数可根据实际情况调整,比如xlsx前3行是额外格式内容,就传3,从第4行开始读取类CSV的有效内容
  • 如果单元格内容本身包含逗号,可按需调整拼接的分隔符,比如改用制表符\t,或者给单元格内容加双引号包裹

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.23 22:57:02