java区分不同的excel_Java处理excel两种不同的方式
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两种不同的方式相关推荐
- Java中BorderLayout布局管理器的两种排列实现方式
java中Frame类默认的布局管理器为BorderLayout,其主要是将Frame窗口分为东西南北中五个区域,每个区域仅限于放一个组件,如加入多个,前免得会被覆盖,解决方法为:可以在一个区域中加入 ...
- Java构造和解析Json数据的两种方法详解一
在www.json.org上公布了很多JAVA下的json构造和解析工具,其中org.json和json-lib比较简单,两者使用上差不多但还是有些区别.下面首先介绍用json-lib构造和解析Jso ...
- 在java程序中定义的类有两种成员_java试题 急需答案 谢谢!!!
三.填空(每小题2分,共10分)1.在Applet中,创建一个具有10行45列的多行文本区对象ta的语句为:2.创建一个标识有"关闭"字样的标签对象gb的语句为.3.方法是一种仅有 ...
- [转]DES加密 java与.net可以相互加密解密两种方法
[转]原文地址:http://jumpman.javaeye.com/blog/605996 DES加密 java与.net可以相互加密解密两种方法 文章分类:Java编程 通过这个方法可以实现jav ...
- Java学习笔记:创建线程的两种方法
Java学习笔记:创建线程的两种方法 一.预备工作 1.创建Maven项目ThreadDemo 2.在pom.xml里添加依赖 二.继承Thread类创建子线程
- Java中两种抛出异常的方式
Java中两种抛出异常的方式 在Java中有两种抛出异常的方式,一种是throw,直接抛出异常,另一种是throws,间接抛出异常. 直接抛出异常是在方法中用关键字throw引发明确的异常.当thro ...
- Android系统从驱动到上层服务再到应用的两种服务架构方式
Android系统从驱动到上层服务再到应用的两种服务架构方式 1)使用类似sensor service的方式: 此方式用于,service的接口不想暴露给上层activity直接使用的情形 例如sen ...
- Spring中IoC两种接口和两种依赖注入方式的比较
spring是一个开源框架,是为了解决企业应用程序开发的复杂性而创建的,为J2EE应用程序开发提供集成的框架.简单来说,spring是一个轻量级的控制反转IOC和面向切面AOP的容器框架.spring ...
- android登录加密传输,android环境下两种md5加密方式(示例代码)
在平时开发过程中,MD5加密是一个比較经常使用的算法,最常见的使用场景就是在帐号注冊时,用户输入的password经md5加密后,传输至server保存起来.尽管md5加密经经常使用.可是md5的加密 ...
最新文章
- FreeSWITCH IVR中lua调用并执行nodejs代码
- mina处理断包和粘包
- nike附近门店查询_门店配送的全国服务网络如何快速成功运营?
- 与阿里云容器服务 ACK 发行版的深度对话第一弹:如何借助 sealer 实现快速构建 部署
- 写一个ajax程序就是如此简单
- 机器学习(二)梯度下降
- python公式计算器_Python-计算器
- linux sqlite3使用界面,Linux 中 sqlite3 基本操作
- 简单RAM存储器分析
- 17计算机病毒,计算机病毒的病毒的分类川大《计算机文化基础0008》17秋在
- app支付宝接入流程图_支付宝资金预授权开通免押租赁系统,芝麻信用免押租赁app/小程序...
- Codeforces 633H Fibonacci-ish II【线段树】
- 终于在linux上用wine装上qq了
- linux 文件管理器,linux终端文件管理器ranger使用详解
- php 分页类 bootstrap,Thinkphp自带分页类样式转Bootstrap分页样式
- 为什么大数据与云计算密不可分?
- 财务自由到底是啥感觉啊...
- 交换机和路由器到底有什么区别???
- stc32G库函数(二)——定时器
- 力扣每日一题2022-05-04中等题:找出游戏的获胜者
热门文章
- 密码学基础知识(三)古典密码
- MFC C++ 获取外网IP地址
- python里graphics的使用_使用graphics.py实现2048小游戏
- 设计模式C++实现(2)——策略模式
- 12、Java Swing计算器界面的实现
- 计算字符串的实际长度
- P3385 【模板】负环
- “九韶杯”河科院程序设计协会第一届程序设计竞赛 【前六题解析】
- Python-Requests.post方法中,传参data与json的区别
- 三星笔试能带计算机吗,2021年三星笔试试题+经验谈