Java导出Excel文件的两种方法
将数据以Excel表格的形式导出:
首先下载poi的jar包,导入项目中,或者使用maven仓库管理,在pom文件添加:
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi</artifactId>
<version>3.9</version>
</dependency>
前端代码:
页面上定义下载/导出按钮,点击按钮时下载/导出,如:
<button class="" id="exportDate" onclick="exportDate()">下载/导出</button>
function exportDate(){
var url=""; //路径
window.open(url);
}
后端代码:
Controller层:
@RequestMapping(value="/exportDate",method=RequestMethod.GET)
public void exportDate(需要接受的参数/条件,HttpServletResponse response) throws Exception{
//如涉及权限/级别/条件等,先进行判断;
//根据条件等查询要导出的数据
List<Object> list = 查询要导出的数据;
//可先判断要导出的数据的数量来确定使用HSSFWorkbook工具类或者SXSSFWorkbook工具类
if(list.size()>60000){
list = list.subList(0,60000);
}
//将数据放入HSSFWorkbook对象中
HSSFWorkbook wb = xxxService.getWb(list);
//大数据量时使用SXSSFWorkbook工具类
//SXSSFWorkbook wb = xxxService.getWb(list);
//定义导出的表名
String fileName = URLEncoder.encode("表名"+".xls","UTF-8");
ByteArrayOutputStream os = new ByteArrayOutputStream();
wb.write(os);
if(os.size() > 0){
response.setContentType("application/octet-stream");
response.addHeader("Content-Disposition","attachment;filename="+fileName);
response.addHeader("Content-Length",""+os.size());
IOUtils.write(os.toByteArray(),response.getOutputStream());
response.getOutputStream().flush();
}
os.close();
}
获取HSSFWorkbook/SXSSFWorkbook工具类对象的方法,可写在service层
一、HSSFWorkbook工具类(导出.xls格式文件)
HSSFWorkbook对象,最多支持65535行,适用一般数据量少导出
//适用公共方法获取表单元格标题
public HSSFWorkbook getWb(List<Object> list) throws Exception{
//创建对象
HSSFWorkbook wb = new HSSFWorkbook();
//创建一个sheet
HSSFSheet sheet = wb.createSheet("sheet名");
//添加表头
HSSFRow row = sheet.createRow((int)0);
//单元格样式
HSSFCellStyle style = wb.createCellStyle();
style.setAlignment(HSSFCellStyle.ALIGN_CENTER);
HSSFCell cell = row.createCell(0);
//创建公共工具类对象
Utils util = new Utils();
//调用方法获得标题
Map<String,String> map = util.getBeanComment("实体类路径");
int i=0;
for (String key : map.keySet()) {
cell = row.createCell(i);
cell.setCellValue(map.get(key));
cell.setCellStyle(style);
i++;
}
i=0;
for (Object obj:list) {
row = sheet.createRow((int) i + 1);
int j=0;
for (String key : map.keySet()) {
cell=row.createCell(j);
cell.setCellValue(BeanUtils.getProperty(obj,key));
j++;
}
i ++ ;
}
return wb;
}
二、SXSSFWorkbook工具类(导出.xlsx格式文件,适用于数据量大的文件导出)
SXSSFWorkbook对象,只支持.xlsx格式。它就是用来解决大数据量以及超大数据量的导入导出操作的,
单个sheet表就支持近104万条数据了。要是导出104万以上的数据,这时我们必须拆分到多个工作表来实现。
//以数组的方式手动定义表单元格标题和对应值
public SXSSFWorkbook getWb(String sheetName,String[] title,String[][] values){
//内存中只创建100个临时对象,超过100个将释放不用对象
SXSSFWorkbook wb = new SXSSFWorkbook(100);
//工作表对象
Sheet sheet = null;
//行对象
Row row = null;
//列对象
Cell cell = null;
int rowNo = 0;
int pageRowNo = 0;
//表单样式风格
CellStyle style = wb.createCellStyle();
style.setAlignment(CellStyle.ALIGN_CENTER);
if(values != null && values.length>0){
for(int j=0;j<values.length;j++){
//超过一百万行后换一个工作薄,单个sheet最多1048576行
if(rowNo%1000000 == 0){
sheet = wb.createSheet("第"+(rowNo/1000000+1)+"个工作薄");
sheet = wb.getSheetAt(rowNo/1000000);
pageRowNo = 0;
}
rowNo++;
//创建标题
if(pageRowNO == 0){
row = sheet.createRow(0);
for(int i=0;i<title.length;i++){
cell = row.createCell(i);
cell.setCellValue(title[i]);
cell.setCellStyle(style);
if(i==title.length-1){
sheet.setDefaultColumnWidth(20);
}
}
}else{
//创建行
row = sheet.createRow(pageRowNo);
for(int k=0;k<values[j].length;k++){
// 创建列
cell = row.createCell(k);
if(k == 0){
//对列进行赋值
cell.setCellValue(Long.parseLong(values[j][k]));
}else{
if(numType(values[j][k])){
cell.setCellValue(Double.parseDouble(values[j][k]));
}else{
cell.setCellValue(String.valueOf(values[j][k]));
}
}
cell.setCellStyle(style);
}
}
pageRowNo++;
}
}
return wb;
}
如果用一中公共工具类的getBeanComment()方法,如下:
public Map<String,String> getBeanComment(String bean){
Map<String,String> map = new HashMap<>();
try{
Class clz = Class.forName(bean);
Field[] strsSub = clz.getDeclaredFields();
Class clzSuper = Class.forName(bean).getSuperclass();
List<Field> strs = new ArrayList<>();
for(Field filed : strsSub){
strs.add(filed);
}
if(null != clzSuper){
Field[] StrsSuper = clzSuper.getDeclaredFields();
for(Field field : StrsSuper){
strs.add(field);
}
}
//StringBuffer sb = new StringBuffer();
for(Field field : strs){
Comment comment = field.getAnnotation(Comment.class);
if(null == comment){
continue;
}
String name = field.getName();
if("id".equals(name)){
continue;
}
if(StringUtils.isNotBlank(comment.value())){
map.put(name, comment.value());
}
}
return map;
}catch(ClassNotFoundException e) {
e.printStackTrace();
return null;
}
}
注:
可参考:https://blog.csdn.net/runzhisheng114/article/details/75303750;
https://blog.csdn.net/u014621859/article/details/54944059;
Java导出Excel文件的两种方法的更多相关文章
- .NET CORE 2.1 导出excel文件的两种方法
最近在做 MVC 项目的时候遇到项目的导出,下面总结下两种导出到excel 的方法 第一种方法: 将文件写到本地,然后返回这个File 或者返回这个 File 的绝对地址 其中 _hostingE ...
- web导出excel文件的几种方法
总的来说,两种方法:服务器端生成和浏览器端生成. 服务器端生成就是:根据用户请求,获取相应的数据,使用poi/jxl, jacob/jawin+excel,或是用数据拼html的table或是cvs纯 ...
- Java读取Excel文件的几种方法
Java读取 Excel 文件的常用开源免费方法有以下几种: 1. JDBC-ODBC Excel Driver 2. jxl.jar 3. jcom.jar 4. poi.jar 简单介绍: 百度文 ...
- [转载]Java操作Excel文件的两种方案
微软在桌面系统上的成功,令我们不得不大量使用它的办公产品,如:Word,Excel.时至今日,它的源代码仍然不公开已封锁了我们的进一步应用和开发.在我们实际开发企业办公系统的过程中,常常有客户这样子要 ...
- mysql导出excel文件的几种方法
方法一 用mysql的命令和shell select * into outfile './bestlovesky.xls' from bestlovesky where 1 order by id d ...
- 读取Excel文件的两种方法
第一种方法:传统方法,采用OleDB读取EXCEL文件, 优点:写法简单,缺点:服务器必须安有此组件才能用,不推荐使用 private DataSet GetConnect_DataSet2(stri ...
- 读取Excel文件的两种方法比较 以及用NPOI写入Excel
1. 采用NPOI方式,只需引用NPOI.dll,但目前最高只能到2.4.0版. 缺点:只支持.xls,不支持.xlsx格式.github上的2.4.1版支持.xlsx,但总提示缺ICSharpCod ...
- Oracle导出DMP文件的两种方法
本文转载自:http://www.cnblogs.com/o-andy-o/archive/2013/06/05/3118611.html 导出: 方法一:利用PL/SQL Developer工具 ...
- java读取excel文件的两种方式
方式一: 借用 package com.ij34.util; /** * @author Admin * @date 创建时间:2017年8月29日 下午2:07:59 * @version 1.0 ...
随机推荐
- python第八周:socket网络编程
1.socket网络编程 1.1概念: 网络套接字是跨计算机网络的连接的端点.今天,计算机之间的大多数通信都基于互联网协议;因此大多数网络套接字都是Internet套接字.更准确地说,套接字是一个句柄 ...
- maven知识总结
使用maven中的命令运行web项目 以上为web项目的目录结构 必须是maven项目 启动命令行 使用 mvn tomcat:run 敲击回车 访问红框中的地址: 关闭命令行 那么项目就 ...
- Linux文字分段裁剪命令cut(转)
Linux cut命令用于显示每行从开头算起num1到num2的文字. 语法 cut [-bn] [file] cut [-c] [file] cut [-df] [file] 使用说明: cut命令 ...
- UVA 10173
bitch bitch bitch... TLE,WA一大坨,我是在拿生命来JUDGE啊.. 不得不说,UVA上的数据根本不是随机的,而是有预谋的. for(int i=2;i<n;i++){ ...
- 在java中,怎样跳出当前的多重循环?
</pre>直接用break ;详细举比例如以下:<p></p><p></p><p></p><pre name ...
- java中的移位操作
java中的移位操作仅仅对; a = a << 2; System.out.println(a); System.out.println(Integer.toBinaryString(a) ...
- linux下Oracle11g RAC搭建(七)
linux下Oracle11g RAC搭建(七) 六.安装Grid 启动GRID安装界面 方式一:redhat下调整分辨率 [root@node1 ~]# xhost + //授权 [ro ...
- java.lang.NoClassDefFoundError: org/json/JSONException
问题: 解决办法:
- c14---排序,查找
// // main.c // 冒泡排序 // // Created by xiaomage on 15/6/10. // Copyright (c) 2015年 xiaomage. All righ ...
- 0x54 树形DP
树形DP我只知道千万别写森林转二叉树慢的要死 没有上司的舞会 水!裸! #include<cstdio> #include<cstring> #include<cstdl ...