文件下载

本文主要介绍spring boot环境下,利用Apache POI操作Excel,实现Excel文件的在线下载。

首先,我们在这里介绍一下关于ApachePOI中关于HSSF,XSSF和SXSSF的区别。

HSSF是POI工程对Excel 97(-2007)文件操作的纯Java实现,使用的 .xls 做结尾的文件

XSSF是POI工程对Excel 2007以后版本 (.xlsx)文件操作的纯Java实现,使用 .xlsx 做结尾的文件

从POI 3.8版本开始,提供了一种基于XSSF的低内存占用的API----SXSSF

因为Excel版本的不断升级,就目前使用而言,一般使用较多的是XSSF,而网上大部分教程还停留在老版本(HSSF);SXSSF由于使用用户较少,还有不少不适用户使用习惯的坑未填,对用普通开发者来说较为复杂,所以只要不是对性能有较强要求的用户,不建议使用。接下来就主要介绍一下XSSF的使用:


  1. 首先根据需求创建模板文件,在模板文件中设置好要输出的列名(表头),注意要 和sql检索出来的列名一致
  2. 上代码
@Override
public void reportsExcelPrint(HttpServletResponse response) {
List<Map<String,Object>> reportList = null;
String projectName="";
//检索数据库数据--用来赋值Excel
reportList = projectMapper.selByValue(projectName);
//模板文件路径
String modalUrl="template/项目周报.xlsx";
//sheet名称
String sheetName="项目周报";
// 对应数据库列名--和模板设置的列一致
String[] colKeys={"weekNumber","projectName"};
exportFile(reportList,colKeys,modalUrl,sheetName,response);
}
private void exportFile(List<Map<String, Object>> reportList, String[] colKeys, String modalUrl, String sheetName, HttpServletResponse response) {
OutputStream out = null;
try {
Map<String, Object> results = new HashMap<>();
results.put("talentFlows", "");
// 拿到模板文件
InputStream in = getClass().getClassLoader().getResourceAsStream(modalUrl);
//新建workbook
tpWorkbook = new XSSFWorkbook(in);
//填入数据
sheet = tpWorkbook.getSheet(sheetName);
if (reportList != null) {
//设置表格数据
setCellData(reportList, colKeys);
}
//输出流
out = response.getOutputStream();
response.reset();
response.setHeader("content-disposition",
"attachment;filename=" + new String((sheetName).getBytes("gb2312"), "ISO8859-1") + ".xlsx");
response.setContentType("APPLICATION/msexcel");
//设置打印对象
XSSFPrintSetup printSetup = sheet.getPrintSetup();
//设置打印方向
printSetup.setLandscape(true);
// 新建一个Excel的工作空间
XSSFWorkbook workbook = new XSSFWorkbook();
// 把模板复制到新建的Excel
workbook = tpWorkbook;
// 输出Excel内容,生成Excel文件
workbook.write(out);
} catch (final IOException e) {
e.printStackTrace();
} finally {
try {
// 关闭输出流
response.flushBuffer();
if (out != null) {
out.flush();
out.close();
}
} catch (final IOException e) {
}
}
}
/**
* 创建表体数据
* @param data - 表体数据
*/
private void setCellData(List<Map<String, Object>> data, String[] colKeys) {
//创建表头
createHeader();
//创建合计项变量
zq_hs = 0;
int rowSize = 0;
// 创建数据
XSSFRow row = null;
XSSFCell cell = null;
int i = 3;//startRow:数据开始行
if (data != null && data.size() > 0) {
for (int m = 0; m < data.size(); m++) {
row = sheet.createRow(i);
if (i == 3) {//第一行
rowSize = i;
setCellValue(data, colKeys, row, cell, m);
} else {
if (data.get(m).get("blId") == data.get(m - 1).get("blId")) {//相同字段
setCellValue(data, colKeys, row, cell, m);
} else {//合计行
if (rowSize != (i - 1)) {//多于1条数据时合并单元格
CellRangeAddress cra = new CellRangeAddress(rowSize, i - 1, 2, 2); // 起始行, 终止行, 起始列, 终止列
sheet.addMergedRegion(cra);
RegionUtil.setBorderBottom(BorderStyle.THIN, cra, sheet);// 下边框
RegionUtil.setBorderRight(BorderStyle.THIN, cra, sheet); // 右边框
}
//合计行
createTailCellWeekly1(i, zq_hs);
zq_hs = 0;
i = i + 1;
rowSize = i;
row = sheet.createRow(i);
//下一个模块
setCellValue(data, colKeys, row, cell, m);
}
//项目总合计
if (m == (data.size() - 1)) {
if (rowSize != i) {//多于1条数据时合并单元格
CellRangeAddress cra = new CellRangeAddress(rowSize, i, 2, 2); // 起始行, 终止行, 起始列, 终止列
sheet.addMergedRegion(cra);
RegionUtil.setBorderBottom(BorderStyle.THIN, cra, sheet);// 下边框
RegionUtil.setBorderRight(BorderStyle.THIN, cra, sheet); // 右边框
}
zq_hsZ = zq_hsZ + zq_hs;
//合计行
i = i + 1;
createTailCellWeekly1(i, zq_hs);
}
}
if (data.size() == 1) {
//项目总计累加
zq_hsZ = zq_hsZ + zq_hs;/
i = i + 1;
//合计行
createTailCellWeekly1(i, zq_hs);
}
i++;//下一行
//行赋值完成后,对当前行操作
styleWeekly(row);
}
}
//创建表尾
createTailCellWeekly2(i - 1, zq_hsZ, zq_mjZ, hd_hsZ, hd_hs_dzwcZ, hd_mjZ, hd_mj_dzwcZ, azf_rwZ, azf_ykgZ, gd_rwZ, gd_ywc_weekZ);
}
//创建表头
private void createHeader(String year) {
// 创建数据
XSSFCell cell = null;
XSSFRow row0 = sheet.getRow(0);
row0.getCell(0).setCellValue(year + "项目计划表"); XSSFRow row1 = sheet.getRow(1);
cell = row1.getCell(10);
cell.setCellValue(year + "项目投资");
cell = row1.getCell(16);
cell.setCellValue(year + "项目oo");
}
/**
* @return void
* @Description //TODO 行赋值
* @Param [data, colKeys, backupType, row, cell, m]
*/
private void setCellValue(List<Map<String, Object>> data, String[] colKeys XSSFRow row, XSSFCell cell, int m) {
XSSFCellStyle cellStyleTongJi = tpWorkbook.createCellStyle();
XSSFFont font = tpWorkbook.createFont();
font.setFontHeightInPoints((short) 36);// 字体大小
cellStyleTongJi.setFont(font);
cellStyleTongJi.setBorderBottom(BorderStyle.THIN); // 下边框
cellStyleTongJi.setBorderRight(BorderStyle.THIN);// 右边框
cellStyleTongJi.setBorderLeft(BorderStyle.THIN);//下边框
cellStyleTongJi.setAlignment(HorizontalAlignment.CENTER_SELECTION);//水平对齐
cellStyleTongJi.setVerticalAlignment(VerticalAlignment.CENTER);//上下对齐
cellStyleTongJi.setWrapText(true);//自动换行 XSSFCellStyle cellStyleTongJi1 = tpWorkbook.createCellStyle();
cellStyleTongJi1.setFont(font);
cellStyleTongJi1.setBorderBottom(BorderStyle.THIN); // 下边框
cellStyleTongJi1.setBorderRight(BorderStyle.THIN);// 右边框
cellStyleTongJi1.setAlignment(HorizontalAlignment.LEFT);//水平对齐
cellStyleTongJi1.setVerticalAlignment(VerticalAlignment.CENTER);//上下对齐
cellStyleTongJi1.setWrapText(true);//自动换行 int j = 0;
for (String key : colKeys) {
Object colValue = data.get(m).get(key);
cell = row.createCell(j);
//后2列文字描述左对齐
if (key.equalsIgnoreCase("col1") || key.equalsIgnoreCase("col2")) {
cell.setCellStyle(cellStyleTongJi1);
} else {
cell.setCellStyle(cellStyleTongJi);
}
if (colValue != null) {
//单元格赋值
if (key.equalsIgnoreCase("col3")) {
cell.setCellValue(colValue.toString() + "地区");
} else if (key.equalsIgnoreCase("col4")) {
cell.setCellValue(new BigDecimal(colValue.toString()).stripTrailingZeros().toPlainString());//BigDecimal=>number
} else if (key.equalsIgnoreCase("col5") || key.equalsIgnoreCase("col6") || ) {
cell.setCellValue(new BigDecimal(colValue.toString()).stripTrailingZeros().toPlainString());//BigDecimal=>number
} else {
cell.setCellValue(colValue.toString());
}
//计算合计值
switch (key) {
case "planMoveCount":
zq_hs += Double.parseDouble(String.valueOf(colValue));
break;
case "planMoveArea":
zq_mj += Double.parseDouble(String.valueOf(colValue));
break;
case "mYearCount":
hd_hs += Double.parseDouble(String.valueOf(colValue));
break;
case "mWeekCount":
hd_hs_dzwc += Double.parseDouble(String.valueOf(colValue));
break;
}
} else {
cell.setCellValue("--");
}
j++;
}
}
/**
* @return void
* @Description //TODO 创建合计项
* @Param [size, zq_hs]
*/
private void createTailCellWeekly1(int size, double zq_hs) {
XSSFCellStyle cellStyleTongJi = tpWorkbook.createCellStyle();
XSSFFont font = tpWorkbook.createFont();
font.setBold(true);
font.setFontHeightInPoints((short) 36);// 字体大小
cellStyleTongJi.setFont(font);
cellStyleTongJi.setBorderBottom(BorderStyle.THIN); // 下边框
cellStyleTongJi.setBorderRight(BorderStyle.THIN);// 右边框
cellStyleTongJi.setBorderLeft(BorderStyle.THIN);//下边框
cellStyleTongJi.setAlignment(HorizontalAlignment.CENTER_SELECTION);//水平对齐
cellStyleTongJi.setVerticalAlignment(VerticalAlignment.CENTER);//上下对齐
cellStyleTongJi.setWrapText(true);//自动换行 //合计
XSSFRow rowTail1 = sheet.createRow(size);
rowTail1.setHeightInPoints((short) 100);
sheet.addMergedRegion(new CellRangeAddress(size, size, 0, 2)); XSSFCell cellTail1 = rowTail1.createCell(0);
cellTail1.setCellValue("合计");
cellTail1.setCellStyle(cellStyleTongJi); XSSFCell cellTail102 = rowTail1.createCell(1);
cellTail102.setCellValue("");
cellTail102.setCellStyle(cellStyleTongJi); XSSFCell cellTail103 = rowTail1.createCell(2);
cellTail103.setCellValue(zq_hs);
cellTail103.setCellStyle(cellStyleTongJi);
}
/**
* @return void
* @Description //TODO 导出完成后格式整理
* @Param [row]
*/
private void styleWeekly(XSSFRow row){
for(int k=16;k< 17;k++){
sheet.autoSizeColumn(k,true);//自适应列宽
if(row.getCell(k).toString()=="--"){
row.getCell(k).setCellValue("");
}
}
if(row.getCell(9).toString()!="--"){
if(row.getCell(3).toString()=="--"){
row.getCell(3).setCellValue(0);
}
}else{
if(row.getCell(3).toString()=="--"){
row.getCell(3).setCellValue("--");
}
}
}

java自定义excel的更多相关文章

  1. Java 自定义Excel数据排序

    通常,我们可以在Excel中对指定列数据执行升序或者降序排序,排序时可依据单元格中的数值.单元格颜色.字体颜色或图标等.在需要自定义排序情况下,我们也可以自行根据排序需要编辑数据排列顺序.本文,将通过 ...

  2. Java读写Excel之POI超入门

    转自:http://rensanning.iteye.com/blog/1538591 Apache POI 是用Java编写的免费开源的跨平台的 Java API,Apache POI提供API给J ...

  3. Java读写Excel之POI超入门(转)

    Apache POI 是用Java编写的免费开源的跨平台的 Java API,Apache POI提供API给Java程式对Microsoft Office格式档案读和写的功能.Apache POI ...

  4. Java实现Excel数据批量导入数据库

    Java实现Excel数据批量导入数据库 概述: 这个小工具类是工作中的一个小插曲哦,因为提数的时候需要跨数据库导数... 有的是需要从oracle导入mysql ,有的是从mysql导入oracle ...

  5. JAVA生成EXCEL模板

    JAVA生成excel模板,支持1.必填字段前加 红色 * 2.定义可选值下拉列表 valList3.定义名称并通过名称设置可选值 refName(名称在sheet2,sheet2自动隐藏)4.支持设 ...

  6. java操作excel 工具类

    java操作excel 可参考https://blog.csdn.net/xunwei0303/article/details/53213130 直接上代码: 一.java生成excel文件: pac ...

  7. java自定义注解类

    一.前言 今天阅读帆哥代码的时候,看到了之前没有见过的新东西, 比如java自定义注解类,如何获取注解,如何反射内部类,this$0是什么意思? 于是乎,学习并整理了一下. 二.代码示例 import ...

  8. java程序转换excel中科学记数法的数据为date类型

    今天出于某些原因从mongodb数据库中导出了一些数据,为了更直观的发送给其他人查阅,便使用mongoVUE的导出为excel功能.   但是导出后出现了一个问题,里边有一列存储时间的,存储的是lon ...

  9. java写入excel文件poi

    java写入excel文件 java写入excel文件poi,支持xlsx与xls,没有文件自动创建 package com.utils; import java.io.File; import ja ...

随机推荐

  1. 删除Linux系统多余的引导

    问题: 电脑中安装了多个Linux系统,需要删除不用的Linux系统的引导 解决方法: open terminal: su -     切换root用户 cd /boot/ ls ... grub  ...

  2. ElasticSearch1:基本概念

    ElasticSearch的基本概念 es基本概念: Elasticsearch是面向文档型数据库,一条数据在这里就是一个文档,用JSON作为文档序列化的格式 NRT:Nearly Real Time ...

  3. ansible-playbook的YAML语法学习

    YAML:可以将你打算对多机器的批量操作放到一个文件中,顺序执行,可以根据机器做到根据机器信息判断执行,其他命令执行结果判断执行. YAML有着严格的层级要求,稍微有个缩进问题就会无法运行,所以学习过 ...

  4. 搭建Django项目虚拟环境(Windows系统下)

    一.安装virtualenv 我们可以使用正式的Python环境中的pip进行安装.进入cmd界面,运行“ pip install virtualenv ”,完成安装后,可以运行“ where vir ...

  5. LC 974. Subarray Sums Divisible by K

    Given an array A of integers, return the number of (contiguous, non-empty) subarrays that have a sum ...

  6. Python3+RobotFramewok 用户自定义库的开发(四)

    在介绍这个之前,可以先看下python的目录Python\Lib\site-packages下面的文件夹,你会发现这个目录下面有DatabaseLibrary.RequestsLibrary.Sele ...

  7. 002-tomcat目录简介、应用部署【自动部署 ② 控制台部署 ③ 自定义部署】

    一.目录及功能 主目录下有bin,conf,lib,logs,temp,webapps,work 7个文件夹 1.1.bin目录[重要] bin目录主要是用来存放tomcat的命令,主要有两大类,一类 ...

  8. unix进程通信方式总结(中)(转)

    在上一篇博客http://blog.csdn.net/caoyan_12727/article/details/52049417已经总结了<<uinx环境高级编程>>进程通信前 ...

  9. memcached源码分析-----item过期失效处理以及LRU爬虫

    memcached源码分析-----item过期失效处理以及LRU爬虫,memcached-----item 转载请注明出处:http://blog.csdn.net/luotuo44/article ...

  10. axios中的qs介绍

    首先qs是一个npm仓库所管理的包,可通过npm install qs命令进行安装. 地址: https://www.npmjs.com/package/qs qs.parse().qs.string ...