springmvc导出excel(POI)
/**
* 导出excel表格
*/
@RequestMapping(value = "/doExportData", method = {RequestMethod.POST, RequestMethod.GET})
public void doExportUserData(HttpServletRequest request, HttpServletResponse response,ModelMap modelMap){
String enddate = (String) request.getParameter("enddate");
//查询数据列表
List<User> userList = aService.findByDate(enddate); // 生成提示信息,
response.setContentType("application/vnd.ms-excel"); try{
//拼凑文件名称:时间+随机数
String fileName = "" ;
String[] date2 = enddate.split("-");
for(int i=0;i<date2.length;i++){
fileName = fileName+date2[i];
}
//方法二:
//String fileName = enddate.replace("-", "");
fileName = fileName+Math.round(Math.random()*10000);//添加随机数
response.setHeader("content-disposition", "attachment;filename=" + fileName + ".xls");
// 产生工作簿对象
HSSFWorkbook workbook = new HSSFWorkbook();
//产生工作表对象
HSSFSheet sheet = workbook.createSheet("用户列表"); //设置sheet页名称
HSSFRow row = sheet.createRow(0);
HSSFCellStyle style = workbook.createCellStyle();
style.setAlignment(CellStyle.ALIGN_CENTER); // 创建一个居中格式
HSSFCell cell = row.createCell(0);
cell.setCellValue("部门名称");
cell.setCellStyle(style);
cell = row.createCell(1);
cell.setCellValue("工号");
cell.setCellStyle(style);
cell = row.createCell(2);
cell.setCellValue("姓名");
cell.setCellStyle(style);
cell = row.createCell(3);
cell.setCellValue("时间");
cell.setCellStyle(style); //循环数据
for (int i = 0; i < userList.size(); i++){
row = sheet.createRow(i + 1);
User user = userList.get(i);
//创建单元格,并设置值
row.createCell(0).setCellValue(user.getDeptName());
row.createCell(1).setCellValue(user.getUserid());
row.createCell(2).setCellValue(user.getName());
row.createCell(3).setCellValue(enddate);
}
//文件导出路径,项目中的exportfile文件下
String path = request.getSession().getServletContext()
.getRealPath("/");
String filePath =path+"exportfile\\"+fileName+".xls";
OutputStream os = new FileOutputStream(filePath);
workbook.write(os);
os.close(); //下载文件(只是导出到了相应的文件下面,下载中没有,不添加此方法,在谷歌浏览器中不能直接可以打开文件,提示保存文件名称不一致,打开是空的)
File templateFile = new File(filePath);
FileUtil.downloadFile(response, templateFile);
}catch (Exception e){
e.printStackTrace();
}
}
FileUtil.java 下载相关的工具类
import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import javax.servlet.http.HttpServletResponse;
import org.apache.commons.lang3.StringUtils; /**
* 文件工具类
*/
public class FileUtil { /**
* 下载文件
*
* @param response
* @param file
* @throws Exception
*/
public static void downloadFile(HttpServletResponse response, File file)
throws Exception { if (null == response || null == file)
return; InputStream is = null;
OutputStream os = null; if (file.exists()) {
// 2 文件名称
String fileName = getFileNameByCompleteFilePath(file.getName());
// 3 文件大小
String fileLength = String.valueOf(file.length());
// 4 下载文件名称
String realDownLoadFileName = new String(fileName.getBytes(),
"8859_1");
// 5 设置响应参数
response.reset();
response.setContentType("application/x-msdownload;");
response.setHeader("Content-disposition", "attachment; filename="
+ realDownLoadFileName);
response.setHeader("Content-Length", fileLength);
response.setHeader("Cache-Control",
"must-revalidate, post-check=0, pre-check=0");
response.setHeader("Pragma", "public");
response.setDateHeader("Expires",
System.currentTimeMillis() + 1000L);
try {
is = new BufferedInputStream(new FileInputStream(file));
os = new BufferedOutputStream(response.getOutputStream());
byte[] buffer = new byte[1024];
while (true) { int size = is.read(buffer, 0, 1024);
if (size == -1) { break;
}
os.write(buffer, 0, size);
} } catch (Exception e) {
e.printStackTrace();
} finally {
try {
if (is != null) {
is.close();
}
} catch (IOException e) { e.printStackTrace();
}
try {
if (os != null) {
os.close();
}
} catch (IOException e) { e.printStackTrace();
}
}
response.setStatus(HttpServletResponse.SC_OK);
try { response.flushBuffer(); } catch (IOException e) { }
} else {
// System.out.println("下载文件不存在,文件路径: " + file.getAbsolutePath());
// 如果文件不存在,则创建异常对象并向上抛出
throw new Exception();
}
} public static String getFileNameByCompleteFilePath(String path) { if (StringUtils.isBlank(path))
return "";
// 1 转化路径为本地串
path = toLocalPath(path);
// 2 处理
if (StringUtils.isNotBlank(path)) {
int index = path.lastIndexOf(File.separator);
return path = path.substring(index + 1);
}
return "";
} public static final String toLocalPath(String pathString) { if (StringUtils.isBlank(pathString))
return "";
pathString = replace(pathString, "/", File.separator);
pathString = replace(pathString, "\\", File.separator);
return pathString;
}
public static final String replace(String line, String oldString,
String newString) { // 递归算法
int i = 0;
if ((i = line.indexOf(oldString, i)) >= 0) {
char[] line2 = line.toCharArray();
char[] newString2 = newString.toCharArray();
int oLength = oldString.length();
StringBuffer buf = new StringBuffer(line2.length);
buf.append(line2, 0, i).append(newString2);
i += oLength;
int j = i;
while ((i = line.indexOf(oldString, i)) > 0) {
buf.append(line2, j, i - j).append(newString2);
i += oLength;
j = i;
}
buf.append(line2, j, line2.length - j);
return buf.toString();
}
return line;
} }
springmvc导出excel(POI)的更多相关文章
- springmvc 导出excel
1.pom.xml <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www ...
- Springmvc导出Excel(maven)
一.导入依赖 <dependency> <groupId>org.apache.poi</groupId> <artifactId>poi</ar ...
- Java中导入导出Excel -- POI技术
一.介绍: 当前B/S模式已成为应用开发的主流,而在企业办公系统中,常常有客户这样子要求:你要把我们的报表直接用Excel打开(电信系统.银行系统).或者是:我们已经习惯用Excel打印.这样在我们实 ...
- SpringMVC导出Excel
import java.math.BigDecimal; import java.net.URLEncoder; import java.text.SimpleDateFormat; import j ...
- springmvc导出excel并弹出下载框
https://my.oschina.net/aptx4869/blog/298507
- springMVC框架+POI组件导出Excel
目的:访问url(http://localhost:8080/POIOutputExcel/outputexcel.do)实现excel导出,效果图如下: 文件目录(配置文件就不多说了,跟前面的随笔一 ...
- poi合并单元格同时导出excel
poi合并单元格同时导出excel POI进行跨行需要用到对象HSSFSheet对象,现在就当我们程序已经定义了一个HSSFSheet对象sheet. 跨第1行第1个到第2个单元格的操作为 sheet ...
- POI导入和导出Excel总结
POI导入和导出Excel总结 POI使用总结 1.POI读取Excel 打开工作簿的方式有以下两种简单的应用,POI读取和输出工作簿文件都可以通过以下两种方式来声明: //通过输入流的方式打开本 ...
- 关于EasyPoi导出Excel
如果你觉得Easypoi不好用,喜欢用传统的poi,可以参考我的这篇博客:Springmvc导出Excel(maven) 当然了,万变不离其宗.Easypoi的底层原理还是poi.正如MyBatis ...
随机推荐
- ObjectARX反应器概述[转载]
何为反应器? AutoCAD中提供了类似MFC消息机制的通知方式.用于处理以下情况: 执行AutoCAD命令.修改系统变量.保存和退出图形编辑器或者切换当前工作布局空间等等. 反应器机制是观察者模式的 ...
- Codeforces 744C【DFS】
题意: 给你一幅图,然后有几个特殊点 和不特殊点,给你一些已经连了的边,在保证特殊点不能连的前提下,问最多还能添几条边,双向边 思路: 简单题,就是一个特殊点就是一个集合,然后搜一下,最后把还有没连的 ...
- C#基础知识回顾
值类型和引用类型 值类型存在栈上,结构,枚举,数值类型 引用类型存在堆上,数组,类,接口,委托 把值类型存到引用类型中就是封箱,耗时 引用类型中的值类型是存在堆上,不是栈上,但是作为参数传递时,还是会 ...
- StringUtils中常用方法leftPad(),rightPad(),center()
org.apache.commons.lang3的StringUtils 方法如下: public static String leftPadTime(Integer time){ return ...
- dumpe2fs: Bad magic number in super-block
今天使用tune2fs和dumpe2fs来查看文件系统信息,出现如下图所示错误提示: 解决方法: 1.原来tune2fs和dumpe2fs只能打开ext3/ext4等文件类型. dumpe2fs - ...
- PostgreSQL-9-别名与动态表复制
1.列别名 SELECT column_name AS alias_name FROM table_name conditions... ; alias_name: 它指定分配给列的临时名称 SEL ...
- [hdu1686] Oulipo【KMP】
传送门:http://acm.hdu.edu.cn/showproblem.php?pid=1686 保存KMP模版,代码里P是模版串,next[]就是为它建立的.T是文本串,就是一般比较长的.nex ...
- Gym - 101810H ACM International Collegiate Programming Contest (2018)
bryce1010模板 http://codeforces.com/gym/101810 #include <bits/stdc++.h> using namespace std; #de ...
- python库使用整理
1. 环境搭建 l Python安装包:www.python.org l Microsoft Visual C++ Compiler for Python l pip(get-pip.py):p ...
- Django 的简单ajax
需要通过ajax实现局部刷新 js代码 $('#guo-sou-ajax').click(function(){ #获取id为guo-sou-ajax点击后的信号 console.log($(this ...