Base64转/解码Excel文件

news/2024/11/29 13:52:37/

需求:
1、将EXCEL文件进行Base64位转码
2、将Base64字符串解码并解析

1. 将Excel文件进行Base64转码

该方法应该适用于任何文件的转码

/***测试:将文件编码为base64字符串*/
public String base64Encode() throws Exception {// 将文件转化为输入流String filePath = "E:\\Temp\\card.xlsx";File file = new File(filePath);InputStream inputStream = new FileInputStream(file);// 将InputStream转化为byte[]// 如果使用byte[] byte = new byte[input.available()];这种方式会出现字节码全为0的情况,原因未知ByteArrayOutputStream bos = new ByteArrayOutputStream(1000);byte[] b = new byte[1000];int n;//每次从fis读1000个长度到b中,fis中读完就会返回-1while ((n = inputStream.read(b)) != -1){bos.write(b, 0, n);}inputStream.close();bos.close();byte[] bytes = bos.toByteArray();// 进行Base64转码String base64Str = Base64.getEncoder().encodeToString(bytes);return base64Str;
}

2. 进行Base64解码

/** * 将文件编码成的base64字符串解码为文件输入流*/
public InputStream decode2ExcelFromBase64(String base64Str) throws Exception {byte[] byteArray = null;try {// 解码为byte数组byteArray = Base64.getDecoder().decode(base64Str);}catch (Exception e){throw new Exception("解码失败");}// 将byte数组转化为输入流InputStream inputStream = new ByteArrayInputStream(byteArray);return inputStream;
}

3. POI解析Excel文件(输入流InputStream)

3.1 工作簿Workbook

由于Excel文件有不同的版本(2003及以前的版本后缀是.xls,2007及以后的版本后缀是.xlsx)而POI对这两个版本的处理方式不同(xls文件使用HSSFWorkbook,xlsx文件使用XSSFWorkbook),所以我们需要先判断Excel的版本

3.1.1 手动判断,然后调用不同的Workbook

WorkBook workbook = null;//判断输入的流是否是2007以上版本,如果是则对应文件后缀应该是xlsx
if(POIXMLDocument.hasOOXMLHeader(inputStream);){//以xlsx结尾的文件读取workbook = new XSSFWorkbook(inputStream);
}else {//以xls结尾的文件读取workbook = new HSSFWorkbook(inputStream);
}

但是POIXMLDocument.hasOOXMLHeader(inputStream)方法已经弃用,我们可以采用下面的方法

3.1.2 使用WorkbookFactory

// WorkbookFactory可以通过文件流直接生成合适的Workbook
Workbook workbook = WorkbookFactory.create(inputStream);

3.2 Sheet、Row

获取到Workbook后,我们就能获得其中的表sheet

//获得excel中第一个sheet
Sheet sheet = workbook.getSheetAt(0);

如果有多个sheet,我们可以通过sheet名称来获取

String sheetName = "sheet1";
Sheet sheet = workbook.getSheet(sheetName);

然后我们可以获得sheet中的每一行

// 获取指定行
Row row = sheet.getRow(0);// 获取总行数(最后一行的行号)
int totalRowNum = sheet.getLastRowNum();

3.2.1 空行判断

在处理xlsx文件的时候,会有一些空行(比如曾填写过数据然后删除),这些空行会被计入总行数中,但是一般情况下没有意义,还会引起异常(空行每个单元格的类型是Blank,调用取值方法时可能报空指针异常)

private boolean isBlankRow(Row row){boolean flag = true;// 获得行所含单元格的数量int lastCellNum = row.getLastCellNum();// 循环判断每个单元格,如果有数据则说明这一行不是没有意义可以略过的空行for(int i = 0; i < lastCellNum; i++){Cell cell = row.getCell(i);if(cell.getCellType() != CellType.BLANK.getCode()){flag = false;break;}}return flag;
}

3.2.2 获取单元格值

private String getCellValue(Row row, int index){String value = "";Cell cell = row.getCell(index);// 判断单元格的类型,如一些填写数字的单元格,只凭自己阅读单元格内容有时候// 会判断不出单元格的类型是字符串还是数字,而调错类型方法会引起异常if(cell.getCellType() == CellType.STRING.getCode()){value = cell.getStringCellValue();}else if(cell.getCellType() == CellType.NUMERIC.getCode()){value = String.valueOf((int) cell.getNumericCellValue());}// 省略Boolean类型的判断以及Blank类型的处理(具体根据实际业务)return value;}

注:本篇文章为解决问题时的一篇随笔,不代表问题的最优解,如有错误或更好的方法欢迎指正。


http://www.ppmy.cn/news/812453.html

相关文章

在线TSV转Excel(xls/xlsx)

在线TSV转Excel(xls/xlsx) 在线TSV转Excel(xls/xlsx) TSV To Excel Converter 可将 TSV 转换为 Excel&#xff0c;在线打开或导入 TSV 文件到 Excel 工作表中。 TSV To Excel Converter 可将 TSV 转换为 Excel&#xff0c;在线打开或导入 TSV 文件到 Excel 工作表中。 TSV To …

Go语言 解析Excel csv/xls/xlsx格式

Go语言 解析Excel csv/xls/xlsx格式 解析不同格式的excel&#xff0c;并统一返回值解析csv解析xls解析xlsx代码块 解析不同格式的excel&#xff0c;并统一返回值 解析csv 相关包&#xff1a;“encoding/csv” 解析xls 相关包&#xff1a;“github.com/extrame/xls” 解析x…

用ExcelVBA下载可转债历史数据

先看结果&#xff0c;视频演示送上&#xff1a;https://www.bilibili.com/video/BV1Q3411d7gt/ 制作思路的话&#xff0c;基本还是从“找数据源--设计表格结构--网抓实现---数据处理”这个逻辑来做。 数据源方面&#xff0c;东方财富这里还不错&#xff0c;http://quote.east…

EXCEL01:excel与数据格式

目录 1.数据缘何而来 1.1 了解excel 1.2 excel的存储格式 2.excel数据格式 2.1 单元格数据格式 2.1.1数字 2.1.2 日期 2.2 单元格格式 2.2.1 数值格式 2.2.2 文本格式 2.2.3 日期格式 2.3 转换单元格数据 3.练习 1.数据缘何而来 excel文件格式&#xff1a;xls或xlsx…

Kafka生产者概述

【Kafka】Kafka生产者概述 文章目录 【Kafka】Kafka生产者概述1. 生产者1.1 生产者消息发送流程1.1.1 发送原理1.1.2 生产者重要参数列表 1.2 异步发送 API1.2.1 普通异步发送1.2.2 带回调函数的异步发送 1.3 同步发送 Api 2. 生产者分区2.1 分区的好处2.2 分区策略2.3 自定义分…

Python微实践 - 布莱切利庄园的秘密

二战时期&#xff0c;英国数学家、计算机科学之父Alan Turing在布莱切利庄园成功破译了德军密码&#xff0c;为赢得世界反法西斯战争的胜利做出了重大贡献。为了表达对前辈先贤的敬意&#xff0c;本微实践取名为“布莱切利庄园的秘密”。 本文引用自作者编写的下述图书; 本文允…

JavaSE学习笔记 基于Socket的TCP网络编程

网络编程 1.网络编程的基本知识回顾1.1 C/S与B/S结构1.2 网络编程的三要素解析1.2.1 IP地址1.2.2 端口号1.2.3 网络协议 2.Socket通信简述3.基于TCP协议的网络编程3.1 基于TCP协议的网络通信程序结构3.2 案例&#xff1a;一个客户端与服务器单次通信3.3 案例&#xff1a;多个客…

web渗透a

Nmap namp 192.168.1.1 namp -A -T4 -V 192.168.1.1 -A &#xff1a;开启操作系统识别和版本识别功能 -T &#xff1a;0-6档&#xff0c;设置扫描的快慢 0最慢&#xff0c;6最快&#xff1b; //级别越高你&#xff0c;对网络宽带要求越高&#xff0c;另外扫描太快&#xf…