之前的导出都很乱,直接写在代码中,等到下回还使用导出功能时又不知如何下手,今天用模板模式重写了一个导出功能,方便以后使用:

package com.sf.addrCheck.util.export.poi;

import com.sf.addrCheck.ebo.QbUserAdmin;
import com.sf.addrCheck.util.export.ExcelUtil;
import org.apache.poi.hssf.usermodel.*;
import org.osgi.resource.Requirement;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody; import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.OutputStream;
import java.io.UnsupportedEncodingException;
import java.util.*; /**
* poi-excel导出模板
*/
public abstract class PoiExport { /**
* 导出的数据
*/
private List list; /**
* 标题
*/
private String[] title; /**
* 文件名
*/
private String fileName = "export_" + System.currentTimeMillis()+".xlsx"; /**
* 表格名
*/
private String sheetName = "sheet1"; public PoiExport(List list, String[] title) {
this.list = list;
this.title = title;
} public String getFileName() {
return fileName;
} public void setFileName(String fileName) {
this.fileName = fileName + ".xlsx";
} public String getSheetName() {
return sheetName;
} public void setSheetName(String sheetName) {
this.sheetName = sheetName;
} private HSSFWorkbook getHSSFWorkbook(String sheetName, String[] title, String[][] values, HSSFWorkbook wb) { // 第一步,创建一个HSSFWorkbook,对应一个Excel文件
if (wb == null) {
wb = new HSSFWorkbook();
} // 第二步,在workbook中添加一个sheet,对应Excel文件中的sheet
HSSFSheet sheet = wb.createSheet(sheetName); // 第三步,在sheet中添加表头第0行,注意老版本poi对Excel的行数列数有限制
HSSFRow row = sheet.createRow(0); // 第四步,创建单元格,并设置值表头 设置表头居中
HSSFCellStyle style = wb.createCellStyle();
style.setAlignment(HSSFCellStyle.ALIGN_CENTER); // 创建一个居中格式 // 声明列对象
HSSFCell cell = null; // 创建标题
for (int i = 0; i < title.length; i++) {
cell = row.createCell(i);
cell.setCellValue(title[i]);
cell.setCellStyle(style);
} // 创建内容
for (int i = 0; i < values.length; i++) {
row = sheet.createRow(i + 1);
for (int j = 0; j < values[i].length; j++) {
// 将内容按顺序赋给对应的列对象
row.createCell(j).setCellValue(values[i][j]);
}
}
return wb;
} /**
* 需要重写的方法:用来填充二元数组dataTable
*
* <p>这里主要实现把list中的每个数据设置到dataTable中,list中Obj的属性对应dataTable中的列,list的index对应dataTable中的行</p>
*
* @param dataTable 代表数据表,第一位表示行数,第二位表示列数
* @param i 行数
* @return
*/
public abstract void fillingData(String[][] dataTable, int i, List list); public void export(HttpServletResponse response) throws Exception { String[][] dataTable = new String[list.size()+1][title.length];
for (int i = 0; i < list.size(); i++) {
this.fillingData(dataTable,i, this.list);
}
//创建HSSFWorkbook
HSSFWorkbook wb = this.getHSSFWorkbook(sheetName, title, dataTable, null);
//响应到客户端
try {
this.setResponseHeader(response, fileName);
OutputStream os = response.getOutputStream();
wb.write(os);
os.flush();
os.close();
} catch (Exception e) {
e.printStackTrace();
}
} //发送响应流方法
private void setResponseHeader(HttpServletResponse response, String fileName) {
try {
try {
fileName = new String(fileName.getBytes(),"ISO8859-1");
} catch (UnsupportedEncodingException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
response.setContentType("application/octet-stream;charset=ISO8859-1");
response.setHeader("Content-Disposition", "attachment;filename="+ fileName);
response.addHeader("Pargam", "no-cache");
response.addHeader("Cache-Control", "no-cache");
} catch (Exception ex) {
ex.printStackTrace();
}
} /**
* 使用例子
*/
public static void main(String[] args) {
List<QbUserAdmin> list = new ArrayList<>();
QbUserAdmin qbUserAdmin = new QbUserAdmin();
qbUserAdmin.setLoginName("admin");
qbUserAdmin.setRole("1");
String[] titles = {"loginName", "role"};
new PoiExport(Collections.singletonList(list), titles) {
@Override
public void fillingData(String[][] content, int i, List list) {
QbUserAdmin qbUserAdmin1 = (QbUserAdmin)list.get(i);
content[i][0] = qbUserAdmin1.getLoginName();
content[i][1] = qbUserAdmin1.getRole();
}
}.export(response); //这里的main没有response,需要在web应用中使用
} }

模板模式创建一个poi导出功能的更多相关文章

  1. Vue.js+vue-element搭建属于自己的后台管理模板:创建一个项目(四)

    Vue.js+vue-element搭建属于自己的后台管理模板:创建一个项目(四) 前言 本章主要讲解通过Vue CLI 脚手架构建工具创建一个项目,在学习Vue CLI之前我们需要先了解下webpa ...

  2. 【译】采用MVC模式创建一个简单的javascript App

    原文标题:Build A Simple Javascript App The MVC Way 作者:joshcrawmer4 翻译人:huansky 初次翻译,翻译的不好,还请见谅 JavaScrip ...

  3. OpenCms JSP 模板开发——创建一个简单的JSP模板

    OpenCms中的JSP模板就是一个普通的JSP页面,在特定的位置使用标签来包含内容,在这个的例子中,我们将要开发一个简单JSP模板,这个模板只是在内容(如<html>.<body& ...

  4. freemarker根据模板生成word文件实现导出功能

    一.准备工作 1.创建一个03的word文档,动态的数据用占位符标志占位(如testname).然后另存为word2003的xml文件. 2.格式化xml文件,占位符的位置用${testname}代替 ...

  5. Confluence 6 从一个模板中创建一个空间

    Confluence 已经存储了一系列的模板,这些模板被称为 空间蓝图(space blueprints),这模板具有一些自定义的主页,边栏或者可能有蓝图页面或一些示例内容来帮助你开始使用 Confl ...

  6. 采用MVC模式创建一个简单的javascript App

    初次翻译,翻译的不好,还请见谅 JavaScript中最好的一部分之一,也可能是最糟糕的. 在HTML文档的头部添加一个开始和结束脚本标记,并在其中引入一些意大利面条式的代码,毫无疑问这是一种过分简单 ...

  7. 使用 puppeteer 创建一个自动化导出 PDF 的服务

    最近在基于 RAP2 做内网的一个 API 管理平台,涉及到与外部人员进行协议交换,需要提供 PDF 文档. 在设置完成 CSS 后已经可以使用浏览器的打印功能实现导出 PDF,但全手动,总是觉得不爽 ...

  8. Javascript 代理模式模拟一个文件同步功能

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  9. (转)-编写第一个ROS(创建工作空间workspace和功能包package)

    原文网址:http://www.cnblogs.com/liuamin/p/5704281.html 刚接触ROS,学着写了第一个程序,怕以后忘记,就将其步骤记录下来.. 首先你必须保证你电脑已安装配 ...

随机推荐

  1. Python列表操作与深浅拷贝(6)——列表索引、查询、修改、扩展

    列表list定义 L1 = [] L2 = [1,2,'abc'] L3 = list() L4 = list(range(5)) L5 = [1,'abc',True,None,[4,5,'abc' ...

  2. 201871010132--张潇潇--《面向对象程序设计(java)》第十六周学习总结

      博文正文开头格式:(2分) 项目 内容 这个作业属于哪个课程 https://www.cnblogs.com/nwnu-daizh 这个作业的要求在哪里 https://www.cnblogs.c ...

  3. 代码审计-strcmp比较字符串

    <?php $flag = "flag{xxxxx}"; if (isset($_GET['a'])) { if (strcmp($_GET['a'], $flag) == ...

  4. socket服务

    1.socket_server import socket import threading server = socket.socket(socket.AF_INET, socket.SOCK_ST ...

  5. 多线程中fork与mutex

    在多线程程序中fork出一个新进程,发现新的进程无法正常工作.因为:在使用fork时会将原来进程中的所有内存数据复制一份保存在子进程中.但是在拷贝的时候,但是线程是无法被拷贝的.如果在原来线程中加了锁 ...

  6. Windows/Linux下jdk环境配置

    Windows 7下: Windows7 x64位系统 安装好java 1.点击开始菜单选择计算机选项右键选择属性选项 即可 2.然后在属性界面点击如图所示的高级系统设置选项 3.打开系统属性界面然后 ...

  7. SQL Server 创建数据库

    创建数据库有两种方式: 方式1-图形化界面创建: 1. 鼠标右击“数据库”,然后点击新建数据库 2.设置常规选项卡 2.1 给数据库命名,一般多个单词要用下划线连接,不建议用空格,如Test_DB. ...

  8. [LeetCode] 417. Pacific Atlantic Water Flow 太平洋大西洋水流

    Given an m x n matrix of non-negative integers representing the height of each unit cell in a contin ...

  9. EF Code Frist 执行 nuget命令

    1.Enable-Migrations -EnableAutomaticMigrations2.Add-Migration InitialCreate3.Update-Database -Verbos ...

  10. 【操作系统之十五】iptables黑白名单、自定义链、网络防火墙、常用动作

    1.黑白名单当链的默认策略为ACCEPT时,链中的规则对应的动作应该为DROP或者REJECT,表示只有匹配到规则的报文才会被拒绝,没有被规则匹配到的报文都会被默认接受,这就是"黑名单&qu ...