在项目中要求查询数据库并且用base64文件流的格式返回excel表格,自己试了好几种方法,最后找到的答案。
错误方式:用HSSFWorkbook直接生成相对应的文件,然后用base64转化,这种解析出来的文件是打不开的
String encode="data:application/vnd.ms-excel;base64,";
HSSFWorkbook wb = ExcelUtil.export(fileName, files, activityStatisticsVos);
byte[] bytes = wb.getBytes();
Base64.Encoder baseEncoder = Base64.getEncoder();
encode+= baseEncoder.encodeToString(bytes);
正确方式:
先创建文件,然后用FileOutputStream将HSSFWorkbook写入file文件中,然后将文件读出来,并且用base64进行加密成base64字符串。
生成文件:
File file=new File("test.xlsx");
HSSFWorkbook wb = ExcelUtil.export(fileName, files, activityStatisticsVos);
FileOutputStream fileOutputStream=new FileOutputStream(file);
wb.write(fileOutputStream);
文件生成base64字符串
BASE64Encoder encoder = new BASE64Encoder();
FileInputStream fin = null;
BufferedInputStream bin = null;
ByteArrayOutputStream baos = null;
BufferedOutputStream bout = null;
try {
fin = new FileInputStream(document);
bin = new BufferedInputStream(fin);
baos = new ByteArrayOutputStream();
bout = new BufferedOutputStream(baos);
byte[] buffer = new byte[1024];
int len = bin.read(buffer);
while (len != -1) {
bout.write(buffer, 0, len);
len = bin.read(buffer);
}
//刷新此输出流并强制写出所有缓冲的输出字节
bout.flush();
byte[] bytes = baos.toByteArray();
return encoder.encodeBuffer(bytes).trim();
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} finally {
try {
fin.close();
bin.close();
bout.close();
} catch (IOException e) {
e.printStackTrace();
}
}
return null;