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

