1、背景说明

业务中有时候会碰到利用java 处理excel文件(生成、下载、上传),通常生成一个excel文件会把它写入到机器的一个临时路径,但有时候完全没必要把它存下来,只需要在内存中把这个文件转为输入流,至于后面怎么处理都行。

2、所需依赖包

Java中创建excel文件利用到了以下两个依赖包poi-3.14.jar、poi-ooxml-3.14.jar:

org.apache.poi

poi

3.14

org.apache.poi

poi-ooxml

3.14

3、excel文件处理方式

3.1、方式一:保存为本地文件

通常在创建XSSFWorkbook后,可以通过以下这种方式来存储该表格,即利用FileOutputStream把文件写入其中,这个FileOutputStream指定了文件系统存在的路径:

XSSFWorkbook wb = new XSSFWorkbook(); //创建工作薄

Sheet sheet = wb.createSheet("Sheet0"); //创建工作表,名称为test

// 获取文件路径

filePath = "d://"+filename+"tongji.xls";

//文件输出

try {

FileOutputStream out = new FileOutputStream(filepath);

// FileOutputStream out = new FileOutputStream("d://"+filename+"tongji.xls");

wb.write(out);

out.close();

result_return = true;

logger.info("ExcelService createExcelTable Result: "+ result_return);

} catch (IOException e) {

// TODO Auto-generated catch block

// e.printStackTrace();

result_return = false;

logger.error("ExcelService createExcelTable Error: "+ e);

}

3.2、方式二:保存为输入流

将XSSFWorkbook对象保存为输入流时,利用到了ByteArrayOutputStream来做缓存,先将文件写入其中,然后将其转为字节数组,最后利用ByteArrayInputStream转为输入流,供后续使用。

XSSFWorkbook wb = new XSSFWorkbook(); //创建工作薄

Sheet sheet = wb.createSheet("Sheet0"); //创建工作表,名称为test

ByteArrayInputStream in = null;

try {

ByteArrayOutputStream os = new ByteArrayOutputStream();

wb.write(os);

byte[] b = os.toByteArray();

in = new ByteArrayInputStream(b);

os.close();

} catch (IOException e) {

// TODO Auto-generated catch block

// e.printStackTrace();

logger.error("ExcelUtils getExcelFile error:{}",e.toString());

return null;

}

return in;

}

3.3、FileOutputStream与ByteArrayOutputStream之间的区别

要了解FileOutputStream与ByteArrayOutputStream之间的区别,需要查阅java API。

先来看看API中对FileOutputStream的描述:

FileOutputStream需要指定具体文件或者文件描述路径,才能完成数据写入,可以把它理解为一个管道,管道不能存数据。

再来看看API中对ByteArrayOutputStream的描述:

ByteArrayOutputStream定义了一个ByteArray的输出流,能够往里面写入数据,其实就是内存中的一个对象,同时实现了OutputStream。可以把它理解为一个自带管道的容器,容器能直接存数据。

4、上传OSS

接收到了excel文件的输入流后,利用OSS接口实现上传。

public static String uploadOSS(ByteArrayInputStream input,String issuenumber){

String url = null;

if(input != null){

String fileName = issuenumber + "_工单详情.xlsx";

try {

HttpPost httpPost = new HttpPost("http://127.0.0.1/api/attachment/oss");

httpPost.addHeader("key","12345");

httpPost.addHeader("user","xiaomen");

httpPost.addHeader("method","FeedbackSelect");

httpPost.addHeader("filename",new String(fileName.getBytes("UTF-8"),"ISO-8859-1"));

httpPost.addHeader("type","01");

InputStreamEntity reqEntity = new InputStreamEntity(input);

httpPost.setEntity(reqEntity);

HttpClient client = new DefaultHttpClient();

HttpResponse response = client.execute(httpPost);

HttpEntity responseEntity = response.getEntity();

if(responseEntity != null){

InputStream inputStream = responseEntity.getContent();

String data = convertStreamToString(inputStream);

logger.info("FileUpload2OSS uploadOSS data:{}",data);

JSONObject json = JSON.parseObject(data);

if(json.containsKey("statusCode")){

int statusCode = json.getIntValue("statusCode");

if(statusCode == 0){

JSONArray array = json.getJSONArray("responseData");

JSONObject j = array.getJSONObject(0);

url = j.getString("attachment");

}

}

}

input.close();

} catch (UnsupportedEncodingException e) {

// TODO Auto-generated catch block

// e.printStackTrace();

logger.error("FileUpload2OSS uploadOSS UnsupportedEncodingException:{}",e.toString());

return url;

} catch (ClientProtocolException e) {

// TODO Auto-generated catch block

// e.printStackTrace();

logger.error("FileUpload2OSS uploadOSS ClientProtocolException:{}",e.toString());

return url;

} catch (IOException e) {

// TODO Auto-generated catch block

// e.printStackTrace();

logger.error("FileUpload2OSS uploadOSS IOException:{}",e.toString());

return url;

}

}

return url;

}

5、总结

针对具体业务可以自由选择处理方式。如果无需存储文件至系统,则考虑第二种方式。

在我自己的业务中,使用了第二种方式,无需将生成的excel存在服务器即可完成上传线上OSS。

java区分不同的excel_Java处理excel两种不同的方式相关推荐

  1. Java中BorderLayout布局管理器的两种排列实现方式

    java中Frame类默认的布局管理器为BorderLayout,其主要是将Frame窗口分为东西南北中五个区域,每个区域仅限于放一个组件,如加入多个,前免得会被覆盖,解决方法为:可以在一个区域中加入 ...

  2. Java构造和解析Json数据的两种方法详解一

    在www.json.org上公布了很多JAVA下的json构造和解析工具,其中org.json和json-lib比较简单,两者使用上差不多但还是有些区别.下面首先介绍用json-lib构造和解析Jso ...

  3. 在java程序中定义的类有两种成员_java试题 急需答案 谢谢!!!

    三.填空(每小题2分,共10分)1.在Applet中,创建一个具有10行45列的多行文本区对象ta的语句为:2.创建一个标识有"关闭"字样的标签对象gb的语句为.3.方法是一种仅有 ...

  4. [转]DES加密 java与.net可以相互加密解密两种方法

    [转]原文地址:http://jumpman.javaeye.com/blog/605996 DES加密 java与.net可以相互加密解密两种方法 文章分类:Java编程 通过这个方法可以实现jav ...

  5. Java学习笔记:创建线程的两种方法

    Java学习笔记:创建线程的两种方法 一.预备工作 1.创建Maven项目ThreadDemo 2.在pom.xml里添加依赖 二.继承Thread类创建子线程

  6. Java中两种抛出异常的方式

    Java中两种抛出异常的方式 在Java中有两种抛出异常的方式,一种是throw,直接抛出异常,另一种是throws,间接抛出异常. 直接抛出异常是在方法中用关键字throw引发明确的异常.当thro ...

  7. Android系统从驱动到上层服务再到应用的两种服务架构方式

    Android系统从驱动到上层服务再到应用的两种服务架构方式 1)使用类似sensor service的方式: 此方式用于,service的接口不想暴露给上层activity直接使用的情形 例如sen ...

  8. Spring中IoC两种接口和两种依赖注入方式的比较

    spring是一个开源框架,是为了解决企业应用程序开发的复杂性而创建的,为J2EE应用程序开发提供集成的框架.简单来说,spring是一个轻量级的控制反转IOC和面向切面AOP的容器框架.spring ...

  9. android登录加密传输,android环境下两种md5加密方式(示例代码)

    在平时开发过程中,MD5加密是一个比較经常使用的算法,最常见的使用场景就是在帐号注冊时,用户输入的password经md5加密后,传输至server保存起来.尽管md5加密经经常使用.可是md5的加密 ...

最新文章

  1. FreeSWITCH IVR中lua调用并执行nodejs代码
  2. mina处理断包和粘包
  3. nike附近门店查询_门店配送的全国服务网络如何快速成功运营?
  4. 与阿里云容器服务 ACK 发行版的深度对话第一弹:如何借助 sealer 实现快速构建 部署
  5. 写一个ajax程序就是如此简单
  6. 机器学习(二)梯度下降
  7. python公式计算器_Python-计算器
  8. linux sqlite3使用界面,Linux 中 sqlite3 基本操作
  9. 简单RAM存储器分析
  10. 17计算机病毒,计算机病毒的病毒的分类川大《计算机文化基础0008》17秋在
  11. app支付宝接入流程图_支付宝资金预授权开通免押租赁系统,芝麻信用免押租赁app/小程序...
  12. Codeforces 633H Fibonacci-ish II【线段树】
  13. 终于在linux上用wine装上qq了
  14. linux 文件管理器,linux终端文件管理器ranger使用详解
  15. php 分页类 bootstrap,Thinkphp自带分页类样式转Bootstrap分页样式
  16. 为什么大数据与云计算密不可分?
  17. 财务自由到底是啥感觉啊...
  18. 交换机和路由器到底有什么区别???
  19. stc32G库函数(二)——定时器
  20. 力扣每日一题2022-05-04中等题:找出游戏的获胜者

热门文章

  1. 密码学基础知识(三)古典密码
  2. MFC C++ 获取外网IP地址
  3. python里graphics的使用_使用graphics.py实现2048小游戏
  4. 设计模式C++实现(2)——策略模式
  5. 12、Java Swing计算器界面的实现
  6. 计算字符串的实际长度
  7. P3385 【模板】负环
  8. “九韶杯”河科院程序设计协会第一届程序设计竞赛 【前六题解析】
  9. Python-Requests.post方法中,传参data与json的区别
  10. 三星笔试能带计算机吗,2021年三星笔试试题+经验谈