【原创】POI 生成Excel文件并下载
ι 版权声明:本文为博主原创文章,未经博主允许不得转载。
效果图:

实现
1.在pom中添加依赖:
<!-- https://mvnrepository.com/artifact/org.apache.poi/poi -->
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi</artifactId>
<version>3.17</version>
</dependency>
2.ExcelUtil工具类:
package com.feicuiedu.survey.util; import org.apache.poi.hssf.usermodel.*;
import org.apache.poi.hssf.util.HSSFColor;
import org.apache.poi.ss.usermodel.FillPatternType;
import org.apache.poi.ss.usermodel.HorizontalAlignment;
import org.apache.poi.ss.usermodel.VerticalAlignment;
import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServletResponse;
import java.io.*;
import java.util.List;
import java.util.Map; /**
* Created by Bella on 2018/2/5.
*/
public class ExcelUtil {
/**
* 创建excel文档,
* list 数据
* @param keys list中map的key数组集合
* @param columnNames excel的列名
* */
public static HSSFWorkbook createWorkBook(List<Map<String, Object>> list, String []keys, String columnNames[]) {
// 创建excel工作簿
HSSFWorkbook wb = new HSSFWorkbook();
// 创建第一个sheet页,并命名
HSSFSheet sheet = wb.createSheet(list.get(0).get("sheetName").toString());
// 设置列宽
for(int i=0;i<keys.length;i++){
//最后一列为附件URL地址,列宽设置大一些
if(i==(keys.length-1)){
sheet.setColumnWidth((short) i, (short) (200*120));
}else{
sheet.setColumnWidth((short) i, (short) (50*60));
}
} // 创建第一行,并设置其单元格格式
HSSFRow row = sheet.createRow((short) 0);
row.setHeight((short)500);
// 单元格格式(用于列名)
HSSFCellStyle cs = wb.createCellStyle();
HSSFFont f = wb.createFont();
f.setFontName("宋体");
f.setFontHeightInPoints((short) 10);
f.setBold(true);
cs.setFont(f);
cs.setAlignment(HorizontalAlignment.CENTER);// 水平居中
cs.setVerticalAlignment(VerticalAlignment.CENTER);// 垂直居中
cs.setLocked(true);
cs.setWrapText(true);//自动换行
//设置列名
for(int i=0;i<columnNames.length;i++){
HSSFCell cell = row.createCell(i);
cell.setCellValue(columnNames[i]);
cell.setCellStyle(cs);
} //设置首行外,每行每列的值(Row和Cell都从0开始)
for (short i = 1; i < list.size(); i++) {
HSSFRow row1 = sheet.createRow((short) i);
String flag = "";
//在Row行创建单元格
for(short j=0;j<keys.length;j++){
HSSFCell cell = row1.createCell(j);
cell.setCellValue(list.get(i).get(keys[j]) == null?" ": list.get(i).get(keys[j]).toString());
if(list.get(i).get(keys[j])!=null){
if("优".equals(list.get(i).get(keys[j]).toString())){
flag = "优";
}else if("差".equals(list.get(i).get(keys[j]).toString())) {
flag = "差";
}
}
}
//设置该行样式
HSSFFont f2 = wb.createFont();
f2.setFontName("宋体");
f2.setFontHeightInPoints((short) 10);
if("优".equals(flag)){
HSSFCellStyle cellStyle = wb.createCellStyle();
cellStyle.setFont(f2);
cellStyle.setAlignment(HorizontalAlignment.CENTER);// 左右居中
cellStyle.setVerticalAlignment(VerticalAlignment.CENTER);// 上下居中
cellStyle.setLocked(true);
cellStyle.setWrapText(true);//自动换行
cellStyle.setFillForegroundColor(HSSFColor.HSSFColorPredefined.YELLOW.getIndex());// 设置背景色
cellStyle.setFillPattern(FillPatternType.SOLID_FOREGROUND);
//依次为每个单元格设置样式
for(int m=0;m<keys.length;m++){
HSSFCell hssfCell = row1.getCell(m);
hssfCell.setCellStyle(cellStyle);
}
}else if("差".equals(flag)){
HSSFCellStyle cellStyle2 = wb.createCellStyle();
cellStyle2.setFont(f2);
cellStyle2.setAlignment(HorizontalAlignment.CENTER);// 左右居中
cellStyle2.setVerticalAlignment(VerticalAlignment.CENTER);// 上下居中
cellStyle2.setLocked(true);
cellStyle2.setWrapText(true);//自动换行
cellStyle2.setFillForegroundColor(HSSFColor.HSSFColorPredefined.RED.getIndex());// 设置背景色
cellStyle2.setFillPattern(FillPatternType.SOLID_FOREGROUND);
for(int m=0;m<keys.length;m++){
HSSFCell hssfCell = row1.getCell(m);
hssfCell.setCellStyle(cellStyle2);
}
}else{
HSSFCellStyle cs2 = wb.createCellStyle();
cs2.setFont(f2);
cs2.setAlignment(HorizontalAlignment.CENTER);// 左右居中
cs2.setVerticalAlignment(VerticalAlignment.CENTER);// 上下居中
cs2.setLocked(true);
cs2.setWrapText(true);//自动换行
for(int m=0;m<keys.length;m++){
HSSFCell hssfCell = row1.getCell(m);
hssfCell.setCellStyle(cs2);
}
}
}
return wb;
} //生成并下载Excel
public static void downloadWorkBook(List<Map<String,Object>> list,
String keys[],
String columnNames[],
String fileName,
HttpServletResponse response) throws IOException{
ByteArrayOutputStream os = new ByteArrayOutputStream();
try {
ExcelUtil.createWorkBook(list,keys,columnNames).write(os);
} catch (IOException e) {
e.printStackTrace();
}
byte[] content = os.toByteArray();
InputStream is = new ByteArrayInputStream(content);
// 设置response参数
response.reset();
response.setContentType("application/vnd.ms-excel;charset=utf-8");
response.setHeader("Content-Disposition", "attachment;filename="+ new String((fileName + ".xls").getBytes(), "iso-8859-1"));
ServletOutputStream out = response.getOutputStream();
BufferedInputStream bis = null;
BufferedOutputStream bos = null;
try {
bis = new BufferedInputStream(is);
bos = new BufferedOutputStream(out);
byte[] buff = new byte[2048];
int bytesRead;
while (-1 != (bytesRead = bis.read(buff, 0, buff.length))) {
bos.write(buff, 0, bytesRead);
}
} catch (final IOException e) {
throw e;
} finally {
if (bis != null)
bis.close();
if (bos != null)
bos.close();
}
}
}
3.service 接口:
String export(HttpServletResponse response,
Integer regionid,
Integer schoolid,
Integer majorid,
String beginDate,
String endDate);
4.service 接口实现类:
/**
* 导出Excel表
* @param regionid 大区id
* @param schoolid 校区id
* @param majorid 专业id
* @param beginDate 开始日期
* @param endDate 结束日期
* @return
*/
public String export(HttpServletResponse response,
Integer regionid,
Integer schoolid,
Integer majorid,
String beginDate,
String endDate){
try {
List<ProjectAuditListVo> projectAuditListVoList = projectAuditMapper.query(0,regionid,schoolid,majorid,null,beginDate,endDate,null,null);
String fileName="项目审核表";
List<Map<String,Object>> list=createExcelRecord(projectAuditListVoList);
String columnNames[] = {"大区","校区","专业","面授教师","在线教师","班级",
"项目所处阶段","作品人次","项目提交日期","项目得分",
"得分等级","原因","项目评价","附件"};//列名
String keys[] = {"regionName","schoolName","majorName","teacherName","onlineTeacherName",
"className","stage","workNum", "submitTime","score","rank","reason","evaluate","attachment",};//map中的key
ExcelUtil.downloadWorkBook(list,keys,columnNames,fileName,response);
} catch (IOException e) {
e.printStackTrace();
}
return "excel";
} /**
* 创建Excel表中的记录
* @param projectAuditListVoList
* @return
*/
private List<Map<String, Object>> createExcelRecord(List<ProjectAuditListVo> projectAuditListVoList){
List<Map<String, Object>> listmap = new ArrayList<Map<String, Object>>();
try {
Map<String, Object> map = new HashMap<String, Object>();
map.put("sheetName", "sheet1");
listmap.add(map);
for (int j = 0; j < projectAuditListVoList.size(); j++) {
ProjectAuditListVo projectAuditListVo=projectAuditListVoList.get(j);
Map<String, Object> mapValue = new HashMap<String, Object>();
mapValue.put("regionName",projectAuditListVo.getRegionName());
mapValue.put("schoolName",projectAuditListVo.getSchoolName());
mapValue.put("majorName",projectAuditListVo.getMajorName());
mapValue.put("teacherName",projectAuditListVo.getTeacherName());
mapValue.put("onlineTeacherName",projectAuditListVo.getOnlineTeacherName());
mapValue.put("className",projectAuditListVo.getClassName());
mapValue.put("stage",projectAuditListVo.getStage());
mapValue.put("workNum",projectAuditListVo.getWorkNum());
mapValue.put("submitTime", DateTimeUtil.dateToStr(projectAuditListVo.getSubmitTime(),"yyyy-MM-dd"));
mapValue.put("score",projectAuditListVo.getScore());
mapValue.put("rank",projectAuditListVo.getRank());
mapValue.put("reason",projectAuditListVo.getReason());
mapValue.put("evaluate",projectAuditListVo.getEvaluate());
String attachmentURL = projectAuditListVo.getAttachment()==null?"无":FileUtil.getUploadPath()+projectAuditListVo.getAttachment();
mapValue.put("attachment",attachmentURL);
listmap.add(mapValue);
}
} catch (Exception e) {
e.printStackTrace();
}
return listmap;
}
其中,
List<ProjectAuditListVo> projectAuditListVoList = projectAuditMapper.query(0,regionid,schoolid,majorid,null,beginDate,endDate,null,null);
为调用dao 层方法,获取 Excel中数据源。此处,dao层方法省略
5.controller层:
@RequestMapping(value = "/export",produces = {"application/vnd.ms-excel;charset=UTF-8"})
@ResponseBody
public String export(HttpServletResponse response,
@RequestParam(value = "regionid",required = false) Integer regionid,
@RequestParam(value = "schoolid",required = false) Integer schoolid,
@RequestParam(value = "majorid",required = false) Integer majorid,
@RequestParam(value = "beginDate",required = false) String beginDate,
@RequestParam(value = "endDate",required = false) String endDate){
return iProjectAuditService.export(response,regionid,schoolid,majorid,beginDate,endDate);
}
6.访问export接口,则会自动下载生成的Excel文件至本地。Excel文件效果图如上图所示。
【原创】POI 生成Excel文件并下载的更多相关文章
- java利用poi生成excel文件后下载本地
1.该功能需要poi的jar包,链接: http://pan.baidu.com/s/1migAtNq 密码: 38fx. 2.首先新建一个实体类,用以存放单个数据 public class Test ...
- POI生成EXCEL文件
POI生成EXCEL文件 一.背景 根据指定格式的JSON文件生成对应的excel文件,需求如下 支持多sheet 支持单元格合并 支持插入图片 支持单元格样式可定制 需要 标题(title),表头( ...
- Java 利用 poi 生成 Excel文件的通用例子
在用java 写数据库应用的时候, 通常会生成各种报表,而这些报表可能会被导出为各种格式的文件,比如Excel文档,pdf 文档等等. 今天先做了一个生成Excel 文档的例子,主要解决以下问题: 生 ...
- POI生成EXCEL文件(字体、样式、单元格合并、计算公式)
创建一个封装类: package com.jason.excel; import java.io.FileNotFoundException; import java.io.FileOutputStr ...
- java实现点击查询数据生成excel文件并下载
须先导入关键maven包 <dependency> <groupId>org.apache.poi</groupId> <artifactId>poi& ...
- java生成Excel文件,下载
pom引入poi的maven依赖 <dependency> <groupId>org.apache.poi</groupId> <artifactId> ...
- python通过xlwt模块直接在网页上生成excel文件并下载
urls: from django.conf.urls import url, include from . import views urlpatterns = [ ... url(r'^domai ...
- 使用POI生成Excel文件,可以自动调整excel列宽
//autoSizeColumn()方法自动调整excel列宽 importjava.io.FileOutputStream; importorg.apache.poi.hssf.usermodel. ...
- Jquery的一键上传组件OCUpload及POI解析Excel文件
第一步:将js文件引入页面 <script type="text/javascript" src="${pageContext.request.contextPat ...
随机推荐
- 声音变调算法PitchShift(模拟汤姆猫) 附完整C++算法实现代码
上周看到一个变调算法,挺有意思的,原本计划尝试用来润色TTS合成效果的. 实测感觉还需要进一步改进,待有空再思考改进方案. 算法细节原文,移步链接: http://blogs.zynaptiq.com ...
- 运用C语言将图片转换成16进制的字符串(base64)
最近在写手机端的性能测试脚本的时候,发现手机在上传图片数据时,先将图片转换成一堆16进制的字符,将字符传输过去,服务器再将字符解码成图片 我们在loadrunner中测试时,就需要用C语言将图片编码. ...
- POJ 1741 Tree(树的点分治,入门题)
Tree Time Limit: 1000MS Memory Limit: 30000K Total Submissions: 21357 Accepted: 7006 Description ...
- bzoj 1705;poj 3612:[Usaco2007 Nov]Telephone Wire 架设电话线
Description 最近,Farmer John的奶牛们越来越不满于牛棚里一塌糊涂的电话服务 于是,她们要求FJ把那些老旧的电话线换成性能更好的新电话线. 新的电话线架设在已有的N(2 <= ...
- hihoCoder #1053 : 居民迁移(贪心,二分搜索,google在线技术笔试模拟)
#1053 : 居民迁移 时间限制:3000ms 单点时限:1000ms 内存限制:256MB 描述 公元2411年,人类开始在地球以外的行星建立居住点.在第1326号殖民星上,N个居住点分布在一条直 ...
- [51nod1407]与与与与
有n个整数,问从他们中取出若干个数字相与之后结果是0的有多少组. 答案比较大,输出对于 1,000,000,007 (1e9+7)取模后的结果. Input 第一行输入一个整数n.(1<=n&l ...
- noip2015 提高组 解题报告
完美退役...说好的不卡常呢QAQ day1: T1:模拟题?..考察选手将题目描述翻译成代码的能力233 //其实真相是考验rp..论代码雷同的危害233 T2:简单图论,每个点出度为1所以是基环内 ...
- D. Longest Subsequence
D. Longest Subsequence time limit per test 2 seconds memory limit per test 256 megabytes input stand ...
- Mysql隔离级别,锁与MVCC
关键词:事务,ACID,隔离级别,MVCC,共享锁,排它锁 阅读本文前请先阅读http://hedengcheng.com/?p=771 http://www.hollischuang.com/arc ...
- java构建学生管理系统(一)
用java搭建学生管理系统,重要还是对数据库的操作,诸如增删改查等. 1.基本的功能: 老师完成对学生信息的查看和修改,完成对班级的信息的概览. 学生可以看自己的成绩和对自己信息的修改. 学生和老师有 ...