使用HSSFWorkbook导出、操作excel
原文地址:https://www.jianshu.com/p/dd1e4f28757b
在实际开发中我们经常需要导入数据,统计数据,并且将统计好的数据导出excel,今天分享一个导出学生信息的方法。
目前,比较常用的实现Java导入、导出Excel的技术有两种Jakarta POI和Java Excel。
Jakarta POI 是一套用于访问微软格式文档的Java API。Jakarta POI有很多组件组成,其中有用于操作Excel格式文件的HSSF和用于操作Word的HWPF,目前用于操作Excel的HSSF比较成熟。官方主页,API文档
使用步骤:
一:下载jar包,并放在工程的WEB-INF——>lib目录下
下载地址:http://poi.apache.org/download.html
目前最新版本是4.0,我使用的是3.9
二:理解HSSFWorkbook的几种对象:
HSSFWorkbook:excel的工作簿
HSSFSheet:excel的工作表
HSSFRow:excel的行
HSSFCell:excel的单元格
HSSFFont:excel字体
HSSFDataFormat:日期格式
HSSFHeader:sheet头
样式:
HSSFCellStyle:单元格样式
一个Excel的文件对应一个工作簿(HSSFWorkbook),一个工作簿可以有多个工作表(我们通常看到的Sheet0、Sheet1)(HSSFSheet)组成,一个工作表是由多行(HSSFRow)组成,一行又是由多个单元格(HSSFCell)组成。
三:定义导出数据的请求接口,一般的业务逻辑在这里处理
/**
* 导出学生信息
* @param request
* @param response
* @throws IOException
*/
@RequestMapping("/studentInfoExcelOut")
public void studentInfoExcelOut(HttpServletRequest request, HttpServletResponse response)
throws IOException {
/**获取导出数据,实际开发中这里一般是从数据库查询的数据,
这里演示是定义了一个实体对象,然后初始化多个对象,并放进我们需要导出的集合里*/
List<Student> list = new ArrayList<>();
int sex = ;
for(int i = ;i < ;i++){
if(i% == ){
sex = ;
}
Student stu = new Student(i+,"学生"+(i+)+"号",sex,+i,+i,"1998年-"+(i+)+"月",new Date());
list.add(stu);
}
exportExcelBook(request,response,list);
return;
}
由于我们是导出学生的基础信息,所以需要定义一个学生实体类对象Student.java:
public class Student {
/**学生id*/
private int id;
/**学生姓名*/
private String name;
/**学生性别 1:男 2:女*/
private int sex;
/**学生年龄*/
private int age;
/**学生学号*/
private int student_no;
/**学生出生年月*/
private String birthday;
/**学生创建时间*/
private Date create_time;
public Student(int id,String name,int sex,int age,int student_no,String birthday,Date create_time) {
this.id = id;
this.name = name;
this.sex = sex;
this.age = age;
this.student_no = student_no;
this.birthday = birthday;
this.create_time = create_time;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getSex() {
return sex;
}
public void setSex(int sex) {
this.sex = sex;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public int getStudent_no() {
return student_no;
}
public void setStudent_no(int student_no) {
this.student_no = student_no;
}
public String getBirthday() {
return birthday;
}
public void setBirthday(String birthday) {
this.birthday = birthday;
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public Date getCreate_time() {
return create_time;
}
public void setCreate_time(Date create_time) {
this.create_time = create_time;
}
}
四:调用HSSFWorkbook提供的方法将所需要导出的数据导出并生成文件
/**
* 导出数据生成EXCEL方法
* @param request
* @param response
* @param list
* @throws IOException
*/
public void exportExcelBook(HttpServletRequest request, HttpServletResponse response,List<Student> list)
throws IOException {
if (CollectionUtils.isEmpty(list)) {
return;
}
//文件名称,客户端传来的参数,防止中文文件名乱码参数编码因此这里需要解码
String fileName = URLDecoder.decode(request.getParameter("fileName"),"UTF-8");
//创建Excel工作薄对象
HSSFWorkbook workbook = new HSSFWorkbook();
//创建Excel工作表对象
HSSFSheet sheet = workbook.createSheet();
sheet.setColumnWidth(, );
sheet.setColumnWidth(, );
sheet.setColumnWidth(, );
sheet.setColumnWidth(, );
sheet.setColumnWidth(, );
sheet.setColumnWidth(, );
sheet.setColumnWidth(, ); // 设置表头字体样式
HSSFFont columnHeadFont = workbook.createFont();
columnHeadFont.setFontName("宋体");
columnHeadFont.setFontHeightInPoints((short) );
columnHeadFont.setBoldweight(HSSFFont.BOLDWEIGHT_BOLD); // 列头的样式
HSSFCellStyle columnHeadStyle = workbook.createCellStyle();
columnHeadStyle.setFont(columnHeadFont);
// 左右居中
columnHeadStyle.setAlignment(HSSFCellStyle.ALIGN_CENTER);
// 上下居中
columnHeadStyle.setVerticalAlignment(HSSFCellStyle.VERTICAL_CENTER);
columnHeadStyle.setLocked(true);
columnHeadStyle.setWrapText(true);
// 左边框的颜色
columnHeadStyle.setLeftBorderColor(HSSFColor.BLACK.index);
// 边框的大小
columnHeadStyle.setBorderLeft((short) );
// 右边框的颜色
columnHeadStyle.setRightBorderColor(HSSFColor.BLACK.index);
// 边框的大小
columnHeadStyle.setBorderRight((short) );
// 设置单元格的边框为粗体
columnHeadStyle.setBorderBottom(HSSFCellStyle.BORDER_THIN);
// 设置单元格的边框颜色
columnHeadStyle.setBottomBorderColor(HSSFColor.BLACK.index);
// 设置单元格的背景颜色(单元格的样式会覆盖列或行的样式)
columnHeadStyle.setFillForegroundColor(HSSFColor.WHITE.index);
// 设置普通单元格字体样式
HSSFFont font = workbook.createFont();
font.setFontName("宋体");
font.setFontHeightInPoints((short) ); //创建Excel工作表第一行
HSSFRow row0 = sheet.createRow();
// 设置行高
row0.setHeight((short) );
HSSFCell cell = row0.createCell();
//设置单元格内容
cell.setCellValue(new HSSFRichTextString("学生id"));
//设置单元格字体样式
cell.setCellStyle(columnHeadStyle);
cell = row0.createCell();
cell.setCellValue(new HSSFRichTextString("姓名"));
cell.setCellStyle(columnHeadStyle);
cell = row0.createCell();
cell.setCellValue(new HSSFRichTextString("性别"));
cell.setCellStyle(columnHeadStyle);
cell = row0.createCell();
cell.setCellValue(new HSSFRichTextString("年龄"));
cell.setCellStyle(columnHeadStyle);
cell = row0.createCell();
cell.setCellValue(new HSSFRichTextString("学号"));
cell.setCellStyle(columnHeadStyle);
cell = row0.createCell();
cell.setCellValue(new HSSFRichTextString("出生年月"));
cell.setCellStyle(columnHeadStyle);
cell = row0.createCell();
cell.setCellValue(new HSSFRichTextString("创建时间"));
cell.setCellStyle(columnHeadStyle); // 循环写入数据
for (int i = ; i < list.size(); i++) {
Student stu = list.get(i);
HSSFRow row = sheet.createRow(i + );
cell = row.createCell();
cell.setCellValue(new HSSFRichTextString(String.valueOf(stu.getId())));
cell.setCellStyle(columnHeadStyle);
cell = row.createCell();
cell.setCellValue(new HSSFRichTextString(stu.getName()));
cell.setCellStyle(columnHeadStyle);
cell = row.createCell();
if(stu.getSex() == ){
cell.setCellValue(new HSSFRichTextString("男"));
}else{
cell.setCellValue(new HSSFRichTextString("女"));
}
cell.setCellStyle(columnHeadStyle);
cell = row.createCell();
cell.setCellValue(new HSSFRichTextString(String.valueOf(stu.getAge())));
cell.setCellStyle(columnHeadStyle);
cell = row.createCell();
cell.setCellValue(new HSSFRichTextString(String.valueOf(stu.getStudent_no())));
cell.setCellStyle(columnHeadStyle);
cell = row.createCell();
cell.setCellValue(new HSSFRichTextString(stu.getBirthday()));
cell.setCellStyle(columnHeadStyle);
cell = row.createCell();
cell.setCellValue(new HSSFRichTextString());
cell.setCellStyle(columnHeadStyle);
cell.setCellValue(new HSSFRichTextString(DateUtils.DateToString(stu.getCreate_time(), "yyyy-MM-dd HH:mm:ss")));
}
// 获取输出流
OutputStream os = response.getOutputStream();
// 重置输出流
response.reset();
// 设定输出文件头
response.setHeader("Content-disposition",
"attachment; filename=" + new String(fileName.getBytes("GB2312"), "8859_1") + ".xls");
// 定义输出类型
response.setContentType("application/msexcel");
workbook.write(os);
os.close();
return;
}
五:网页调用导出excel接口
<a href="javascript:void(0)" onclick="outExcel()">导出学生信息</a>
<script>
function outExcel(){
var fileName ="学生信息表";
//编码防止中文字符乱码
window.location.href=encodeURI("studentInfoExcelOut?fileName="+encodeURIComponent(fileName));
}
</script>
六:导出excel截图:
使用HSSFWorkbook导出、操作excel的更多相关文章
- NPOI操作EXCEL(四)——反射机制批量导出excel文件
前面我们已经实现了反射机制进行excel表格数据的解析,既然有上传就得有下载,我们再来写一个通用的导出方法,利用反射机制实现对系统所有数据列表的筛选结果导出excel功能. 我们来构想一下这样一个画面 ...
- c# .Net :Excel NPOI导入导出操作教程之读取Excel文件信息及输出
c# .Net :Excel NPOI导入导出操作教程之读取Excel文件信息及输出 using NPOI.HSSF.UserModel;using NPOI.SS.UserModel;using S ...
- POI操作Excel导入和导出
Apache的POI组件是Java操作Microsoft Office办公套件的强大API,当中对Word,Excel和PowperPoint都有支持,当然使用较多的还是Excel.由于Word和Po ...
- apache POI 操作excel<导入导出>
1.首先导入maven依赖 <!-- POI核心依赖 --> <dependency> <groupId>org.apache.poi</groupId> ...
- poi 操作Excel 以及大数据量导出
maven 依赖 (版本必须一致,否则使用SXSSFworkbook 时程序会报错) <dependency> <groupId>org.apache.poi</grou ...
- java使用POI操作excel文件,实现批量导出,和导入
一.POI的定义 JAVA中操作Excel的有两种比较主流的工具包: JXL 和 POI .jxl 只能操作Excel 95, 97, 2000也即以.xls为后缀的excel.而poi可以操作Exc ...
- 数据导出生成Excel附件使用POI的HSSFWorkbook对象
比较常用的实现Java导入.导出Excel的技术有两种Jakarta POI和Java Excel.Jakarta POI 是一套用于访问微软格式文档的Java API.Jakarta POI有很多组 ...
- loadrunner实现excel文件导出操作
项目中需要对“商品信息”进行查询及导出,但是loadrunner并不能录制到“保存”这一操作. 项目介绍:flex+Http协议: 不能录制的原因: 在我们点击了“导出”按钮后,服务端已经生成一份我们 ...
- 循序渐进开发WinForm项目(5)--Excel数据的导入导出操作
随笔背景:在很多时候,很多入门不久的朋友都会问我:我是从其他语言转到C#开发的,有没有一些基础性的资料给我们学习学习呢,你的框架感觉一下太大了,希望有个循序渐进的教程或者视频来学习就好了. 其实也许我 ...
随机推荐
- Java多态之Father f=new Son();
成员变量静态方法看左边,非静态方法编译看左边,运行看右边. 左边Father f其实是定义了一个Father类的对象,而右边new Son()可以只理解为是一个重写了Father类方法的对象. 因此, ...
- python之pymysql模块
模块安装 pip install pymysql 执行sql语句 import pymysql #通过pymysql下的connect函数来建立一个传输通道,连接本地mysql的所以host地址是12 ...
- Day4-Python3基础-装饰器、迭代器
今日内容: 1.高阶函数 2.嵌套函数 3.装饰器 4.生成器 5.迭代器 1.高阶函数 定义: a:把一个函数名当作实参传给函数 a:返回值包含函数名(不修改函数的调用方式) import time ...
- 记一次阿里云LVM扩容与 LVM 相关知识学习
一.lvm 扩容 问题: 我们阿里云服务器有一个磁盘容量为 1T ,但是最近由于业务的扩增,磁盘容量已经不够了,需要增大磁盘的容量.磁盘挂载在 /home,使用的是 LVM.我们现在需要对磁盘进行扩容 ...
- .net core控制台使用log4net
第一步,Nuget log4net包 第二步,在项目中添加一个新xml文件,我这里是直接从.net framework的项目里复制过来的config文件,不过效果是一样的 内容如下: ?xml ver ...
- input输入框联想功能
一直想找一个可以连接后台,可以根据后台内容的input输入框,可以实现联想功能,网上找到一个简单的静态页面的输入框联想,经过一番修改之后终于可以实现读取自己定义的数组的联想了,其实也比较简单就是格式的 ...
- 06讲案例篇:系统的CPU使用率很高,但为啥却找不到高CPU的应用
小结 碰到常规问题无法解释的 CPU 使用率情况时,首先要想到有可能是短时应用导致的问题,比如有可能是下面这两种情况. 第一,应用里直接调用了其他二进制程序,这些程序通常运行时间比较短,通过 top ...
- JSP&Servlet学习笔记----第6章
JSP与Servlet是一体两面的关系. JSP最终还是被编译为Servlet. <%@page contentType="text/html;charset=UTF-8" ...
- C++不同类中的特征标相同的同名函数
转载请注明出处,版权归作者所有 lyzaily@126.com yanzhong.lee 作者按: 从这篇文章中,我们主要会认识到一下几点: ...
- ThinkPHP5.1学习笔记 数据库操作
数据库 参见<Thinkphp5.1完全开发手册>学习 Mirror王宇阳 数据库连接 ThinkPHP采用内置抽象层对数据库操作进行封装处理:且基于PDO模式,可以适配各种数据库. 数据 ...
