Java 导出 Excel
-
为什么要有导出Excel表格的功能呢?
因为我们在使用软件时会有,一些数据需要导出来,进行留存,大多数人使用的都是office的办公软件,就会使用常用的Excel表格。因此为了方便,所以就有了这个功能。 -
工作准备
首先我们需要一个导入,一个架包,
poi.jar最新版
这个poi是4.0.1版本的只支持jdk8和以上版版本运行,
如果你使用的jdk8以下版本,就需要下载poi4.0以下版,如poi3.6.jar
api文档:http://poi.apache.org/apidocs/index.html
.
将根目录下的poi-4.0.jar和Lib目录下三个通用包 commons-logging-1.2.jar junit-4.1.2.jar log4j-1.2.17.jar拷贝到项目的Lib下
如果是用maven的可自行到maven中央仓库搜索poi然后选择对应的版本即可,也可以直接将下面代码复制到pom.xml。<!-- https://mvnrepository.com/artifact/org.apache.poi/poi --> <dependency> <groupId>org.apache.poi</groupId> <artifactId>poi</artifactId> <version>4.0.1</version> </dependency>
3.常用api
常用:
HSSFWorkbook excel的文档对象
HSSFSheet excel的表单
HSSFRow excel的行
HSSFCell excel的格子单元
HSSFFont excel字体
HSSFDataFormat 日期格式
HSSFHeader sheet头
HSSFFooter sheet尾(只有打印的时候才能看到效果)
辅助操作包括:
HSSFDateUtil 日期
HSSFPrintSetup 打印
HSSFErrorConstants 错误信息表
样式:
HSSFCellStyle cell样式
-
使用jar理解步骤
3.1、HSSFWorkbook打开或者创建“Excel文件对象”
3.2、HSSFWorkbook对象返回Sheet对象”
3.3、Sheet对象返回行对象、用行对象得到Cell对象
3.4、使用Cell对象读写来看一个效果:
package com.zsx.excl; import java.io.FileOutputStream; import java.io.IOException; import org.apache.poi.hssf.usermodel.HSSFCell; import org.apache.poi.hssf.usermodel.HSSFRow; import org.apache.poi.hssf.usermodel.HSSFSheet; import org.apache.poi.hssf.usermodel.HSSFWorkbook; public class ToExcl { public static void main(String[] args) { HSSFWorkbook wb = new HSSFWorkbook();// 创建HSSFWorkbook对象 HSSFSheet sheet = wb.createSheet("sheet1");// 创建HSSFSheet对象 HSSFRow row = sheet.createRow(0);// 创建HSSFRow对象 HSSFCell cell = row.createCell(0);// 创建HSSFCell对象 cell.setCellValue("我的Excel表格标题");// 设置单元格的值 // 输出Excel文件 try { FileOutputStream output = new FileOutputStream("d:\\oExcl.xls"); wb.write(output); output.flush(); System.out.println("成功"); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); System.out.println("文件导出出错"); } } } ```
贴图
- 例子1
package com.zsx.excl;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.Date;
import org.apache.poi.hssf.usermodel.HSSFCell;
import org.apache.poi.hssf.usermodel.HSSFCellStyle;
import org.apache.poi.hssf.usermodel.HSSFDataFormat;
import org.apache.poi.hssf.usermodel.HSSFRow;
import org.apache.poi.hssf.usermodel.HSSFSheet;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import org.apache.poi.ss.util.CellRangeAddress;
public class ToExcel2 {
public static void main(String[] args) {
HSSFWorkbook wb = new HSSFWorkbook(); // 创建excel文档对象
HSSFSheet sheet = wb.createSheet("用户信息表"); // 创建excel表单
HSSFRow row1 = sheet.createRow(0); // 创建一行,0-代表第一行,可以是0~65535之间的任何一个
HSSFCell cell = row1.createCell(0); // 创建一列,0-代表第一列,可以是0~255之间的任何一个
cell.setCellValue("系统用户信息"); // 设置单元格内容
sheet.addMergedRegion(new CellRangeAddress(0, 0, 0, 4)); // 合并单元格,CellRangeAddress构造参数依次表示起始行,截至行,起始列,
// 截至列
HSSFRow row2 = sheet.createRow(1); // 在sheet里面创建第二行
row2.createCell(0).setCellValue("ID");
row2.createCell(1).setCellValue("用户名");
row2.createCell(2).setCellValue("角色");
row2.createCell(3).setCellValue("创建时间");
row2.createCell(4).setCellValue("登录次数");
HSSFRow row3 = sheet.createRow(2); // 在sheet里面创建第三行
HSSFCell cell3_3 = row3.createCell(3); // 为了给这一行设样式
HSSFCellStyle cellStyle = wb.createCellStyle(); // 样式
cellStyle.setDataFormat(HSSFDataFormat.getBuiltinFormat("m/d/yy h:mm")); // 格式
row3.createCell(0).setCellValue(530);
row3.createCell(1).setCellValue("张三");
row3.createCell(2).setCellValue("超级管理员");
cell3_3.setCellValue(new Date());
cell3_3.setCellStyle(cellStyle);
row3.createCell(4).setCellValue(1000);
//。。。省略部分代码
// 输出Excel文件
try {
FileOutputStream output = new FileOutputStream("d:\\oExcl2.xls");
wb.write(output);
output.flush();
System.out.println("成功");
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
System.out.println("文件导出出错");
}
}
}
贴图:
ps: 上面的例子,是通过io流来输出,这个并不能满足我们的需求,在实际的开发中我还是希望能,通过浏览器下载
- web功能的列子,这里我就写一个servlet的小例子
在实际开发中还是使用ssm框架,或者springboot,ssh框架中的事务层中,这里例子太小,所以不做过多。
创建servlet足以。
5.1、创建servlet
package com.zsx.servlet;
import java.io.IOException;
import java.io.OutputStream;
import java.util.Date;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.apache.poi.hssf.usermodel.HSSFCell;
import org.apache.poi.hssf.usermodel.HSSFCellStyle;
import org.apache.poi.hssf.usermodel.HSSFDataFormat;
import org.apache.poi.hssf.usermodel.HSSFRow;
import org.apache.poi.hssf.usermodel.HSSFSheet;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import org.apache.poi.ss.util.CellRangeAddress;
/**
* Servlet implementation class ToExcelServlet
*/
@WebServlet("/toExcelServlet")
public class ToExcelServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
HSSFWorkbook wb = new HSSFWorkbook(); // 创建excel文档对象
HSSFSheet sheet = wb.createSheet("用户信息表"); // 创建excel表单
HSSFRow row1 = sheet.createRow(0); // 创建一行,0-代表第一行,可以是0~65535之间的任何一个
HSSFCell cell = row1.createCell(0); // 创建一列,0-代表第一列,可以是0~255之间的任何一个
cell.setCellValue("系统用户信息"); // 设置单元格内容
sheet.addMergedRegion(new CellRangeAddress(0, 0, 0, 4)); // 合并单元格,CellRangeAddress构造参数依次表示起始行,截至行,起始列,
// 截至列
HSSFRow row2 = sheet.createRow(1); // 在sheet里面创建第二行
row2.createCell(0).setCellValue("ID");
row2.createCell(1).setCellValue("用户名");
row2.createCell(2).setCellValue("角色");
row2.createCell(3).setCellValue("创建时间");
row2.createCell(4).setCellValue("登录次数");
HSSFRow row3 = sheet.createRow(2); // 在sheet里面创建第三行
HSSFCell cell3_3 = row3.createCell(3); // 为了给这一行设样式
HSSFCellStyle cellStyle = wb.createCellStyle(); // 样式
cellStyle.setDataFormat(HSSFDataFormat.getBuiltinFormat("m/d/yy h:mm")); // 格式
row3.createCell(0).setCellValue(530);
row3.createCell(1).setCellValue("张三");
row3.createCell(2).setCellValue("超级管理员");
cell3_3.setCellValue(new Date());
cell3_3.setCellStyle(cellStyle);
row3.createCell(4).setCellValue(1000);
//。。。
//输出Excel文件
OutputStream output=response.getOutputStream();
response.reset();
response.setHeader("Content-disposition", "attachment; filename=test.xls");
response.setContentType("application/msexcel");
wb.write(output);
output.close();
}
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doGet(request, response);
}
}
jsp页面:
<%@ page language="java" contentType="text/html; charset=utf-8"
pageEncoding="utf-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<title>我的jsp页面</title>
</head>
<body>
<a href="toExcelServlet">下载Excel文档</a>
</body>
</html>
成功:
样式设置
-
设置单元格的行高,列宽
HSSFSheet sheet=wb.createSheet(); sheet.setDefaultRowHeightInPoints(10);//设置默认列 sheet.setDefaultColumnWidth(20);//设置默认列宽 sheet.setColumnWidth(cell.getColumnIndex(), 256 * 50); //单位是单个字符的256分之一
-
合并单元格
sheet.addMergedRegion(new CellRangeAddress(0, 0, 0, 4)); // 合并单元格,CellRangeAddress构造参数依次表示起始行,截至行,起始列,
// 截至列
- 单元格样式
HSSFCell cell3_3 = row3.createCell(3); // 为了给这一行设样式
HSSFCellStyle cellStyle = wb.createCellStyle(); // 样式
cellStyle.setDataFormat(HSSFDataFormat.getBuiltinFormat("m/d/yy h:mm")); // 格式
row3.createCell(0).setCellValue(530);
row3.createCell(1).setCellValue("张三");
row3.createCell(2).setCellValue("超级管理员");
cell3_3.setCellValue(new Date());
cell3_3.setCellStyle(cellStyle); // 在这里使用
row3.createCell(4).setCellValue(1000);
下面是引用,我是陌生人的样式例子
// 设置单元格的横向和纵向对齐方式,具体参数就不列了,参考HSSFCellStyle
cellStyle.setAlignment(HSSFCellStyle.ALIGN_JUSTIFY);
cellStyle.setVerticalAlignment(HSSFCellStyle.VERTICAL_CENTER);
/* 设置单元格的填充方式,以及前景颜色和背景颜色
三点注意:
1.如果需要前景颜色或背景颜色,一定要指定填充方式,两者顺序无所谓;
2.如果同时存在前景颜色和背景颜色,前景颜色的设置要写在前面;
3.前景颜色不是字体颜色。
*/
//设置填充方式(填充图案)
cellStyle.setFillPattern(HSSFCellStyle.DIAMONDS);
//设置前景色
cellStyle.setFillForegroundColor(HSSFColor.RED.index);
//设置背景颜色
cellStyle.setFillBackgroundColor(HSSFColor.LIGHT_YELLOW.index);
// 设置单元格底部的边框及其样式和颜色
// 这里仅设置了底边边框,左边框、右边框和顶边框同理可设
cellStyle.setBorderBottom(HSSFCellStyle.BORDER_SLANTED_DASH_DOT);
cellStyle.setBottomBorderColor(HSSFColor.DARK_RED.index);
//设置日期型数据的显示样式
cellStyle.setDataFormat(HSSFDataFormat.getBuiltinFormat("m/d/yy h:mm"));
-
字体样式
HSSFWorkbook wb=new HSSFWorkbook(); HSSFFont fontStyle=wb.createFont(); HSSFWorkbook wb=new HSSFWorkbook (); //设置字体样式 fontStyle.setFontName("宋体"); //设置字体高度 fontStyle.setFontHeightInPoints((short)20); //设置字体颜色 font.setColor(HSSFColor.BLUE.index); //设置粗体 fontStyle.setBoldweight(HSSFFont.BOLDWEIGHT_BOLD); //设置斜体 font.setItalic(true); //设置下划线 font.setUnderline(HSSFFont.U_SINGLE); //字体也是单元格格式的一部分,所以从属于HSSFCellStyle // 将字体对象赋值给单元格样式对象 cellStyle.setFont(font); // 将单元格样式应用于单元格 cell.setCellStyle(cellStyle);