导出excel通用工具类
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStream;
import java.net.URLEncoder;
import java.util.Map;
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.HSSFRow;
import org.apache.poi.hssf.usermodel.HSSFSheet;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import org.apache.poi.ss.usermodel.Cell;
import org.apache.poi.ss.usermodel.HorizontalAlignment;
import org.apache.poi.ss.usermodel.VerticalAlignment;
import org.apache.poi.xssf.usermodel.XSSFCell;
import org.apache.poi.xssf.usermodel.XSSFCellStyle;
import org.apache.poi.xssf.usermodel.XSSFRow;
import org.apache.poi.xssf.usermodel.XSSFSheet;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;
/**
* 导出excel通用工具类
* @author zql
*/
public class ExportExcel {
/**
* 导出Excel到本地
*
* @param filePath 文件路径
* @param fileName 文件名
* @param sheetName 工作簿名称
* @param headTitle 头部标题集合
* @param headEmpty 头部标题是否导出,true头部不导出
* @param cellValSetter 数据添加接口
*/
public void exportExcel(String filePath, String fileName, String sheetName, Map<String,String> headTitle, boolean headEmpty, CellValSetter cellValSetter) {
File file = new File(filePath, fileName);
String suffix = fileName.substring(fileName.lastIndexOf(".") + 1);
try {
OutputStream out = new FileOutputStream(file);
if ("xls".equals(suffix)) {
exportExcel2003(sheetName, headTitle, headEmpty, out, cellValSetter);
}
if ("xlsx".equals(suffix)) {
exportExcel2007(sheetName, headTitle, headEmpty, out, cellValSetter);
}
} catch (Exception e) {
e.printStackTrace();
}
}
/**
* 从网页上导出Excel
*
* @param fileName 文件名
* @param sheetName 工作簿名称
* @param headTitle 头部标题集合
* @param headEmpty 头部标题是否导出,true头部不导出
* @param response 输出流
* @param userAgent 处理文件的中文名称不显示问题
* @param cellValSetter 数据添加接口
*/
public void exportExcel(String fileName, String sheetName, Map<String,String> headTitle, boolean headEmpty, HttpServletResponse response, String userAgent, CellValSetter cellValSetter) {
try {
String suffix = fileName.substring(fileName.lastIndexOf(".") + 1);
// 处理文件的中文名称不显示问题
fileName = userAgent.toLowerCase().indexOf("msie") == -1
? new String(fileName.getBytes("UTF-8"), "ISO8859-1") : URLEncoder.encode(fileName, "UTF-8");
// vnd.ms-excel类型是对应xls的,所以有时候自定义的xlsx后缀不生效,所以使用 octet-stream
/// response.setContentType("application/vnd.ms-excel");
response.setContentType("application/octet-stream");
response.addHeader("Content-Disposition", "attachment;filename=" + fileName);
if ("xls".equals(suffix)) {
exportExcel2003(sheetName, headTitle, headEmpty, response.getOutputStream(), cellValSetter);
}
if ("xlsx".equals(suffix)) {
exportExcel2007(sheetName, headTitle, headEmpty, response.getOutputStream(), cellValSetter);
}
} catch (Exception e) {
e.printStackTrace();
}
}
/**
* 此方法生成2003版本的文件 (文件后缀:xls)
*
* @param sheetname 工作簿名称
* @param headTitle 头部标题集合
* @param headEmpty 头部标题是否导出,true头部不导出
* @param out 与输出设备关联的流对象,可以将EXCEL文档导出到本地文件或者网络中
* @param cellValSetter 设置单元格内容的接口
*/
public void exportExcel2003(String sheetName, Map<String,String> headTitle, boolean headEmpty, OutputStream out, CellValSetter cellValSetter) {
// 声明一个工作簿
HSSFWorkbook wb = new HSSFWorkbook();
// 生成一个表格
HSSFSheet sheet = wb.createSheet();
// 生成一个样式
HSSFCellStyle style = wb.createCellStyle();
// 水平居中样式
style.setAlignment(HorizontalAlignment.CENTER);
// 垂直居中样式
style.setVerticalAlignment(VerticalAlignment.CENTER);
// 定义第一行的索引
int rowNum = 0;
// 判断是否需要设置第一行标题内容
if (!headEmpty) {
// 生成表格标题行
HSSFRow row = sheet.createRow(rowNum);
// 定义标题列索引
int titleCellIndex = 0;
// 遍历标题集合进行设置
for (Map.Entry<String, String> e : headTitle.entrySet()) {
// 生成一个单元格
HSSFCell cell = row.createCell(titleCellIndex++);
// 设置居中样式
cell.setCellStyle(style);
// 设置单元格值
cell.setCellValue(e.getValue());
}
// 行数加一
rowNum += 1;
}
// 是否继续
boolean isContinue = true;
// 数据行数,用于停止行内容的判断条件
int dataNum = 0;
while (isContinue) {
// 生成一行
HSSFRow row = sheet.createRow(rowNum);
// 列索引
int cellIndex = 0;
// 遍历标题集合,对应设置列的内容
for (Map.Entry<String, String> e : headTitle.entrySet()) {
// 生成一个单元格
HSSFCell cell = row.createCell(cellIndex++);
isContinue = cellValSetter.setCellVal(dataNum, e.getKey(), cell);
}
rowNum++;
dataNum++;
}
try {
wb.write(out);
wb.close();
out.close();
} catch (IOException e) {
e.printStackTrace();
}
}
/**
* 此方法生成2007以上版本的文件 (文件后缀:xlsx)
*
* @param sheetname 工作簿名称
* @param headTitle 头部标题集合
* @param headEmpty 头部标题是否导出,true头部不导出
* @param out 与输出设备关联的流对象,可以将EXCEL文档导出到本地文件或者网络中
* @param cellValSetter 设置单元格内容的接口
*/
public void exportExcel2007(String sheetName, Map<String,String> headTitle, boolean headEmpty, OutputStream out, CellValSetter cellValSetter) {
// 声明一个工作簿
XSSFWorkbook wb = new XSSFWorkbook();
// 生成一个表格
XSSFSheet sheet = wb.createSheet(sheetName);
// 生成一个样式
XSSFCellStyle style = wb.createCellStyle();
// 水平居中样式
style.setAlignment(HorizontalAlignment.CENTER);
// 垂直居中样式
style.setVerticalAlignment(VerticalAlignment.CENTER);
// 定义第一行的索引
int rowNum = 0;
// 判断是否需要设置第一行标题内容
if (!headEmpty) {
// 生成表格标题行
XSSFRow row = sheet.createRow(rowNum);
// 定义标题列索引
int titleCellIndex = 0;
// 遍历标题集合进行设置
for (Map.Entry<String, String> e : headTitle.entrySet()) {
// 生成一个单元格
XSSFCell cell = row.createCell(titleCellIndex++);
// 设置居中样式
cell.setCellStyle(style);
// 设置单元格值
cell.setCellValue(e.getValue());
}
// 行数加一
rowNum += 1;
}
// 是否继续
boolean isContinue = true;
// 数据行数,用于停止行内容的判断条件
int dataNum = 0;
while (isContinue) {
// 生成一行
XSSFRow row = sheet.createRow(rowNum);
// 列索引
int cellIndex = 0;
// 遍历标题集合,对应设置列的内容
for (Map.Entry<String, String> e : headTitle.entrySet()) {
// 生成一个单元格
XSSFCell cell = row.createCell(cellIndex++);
isContinue = cellValSetter.setCellVal(dataNum, e.getKey(), cell);
}
rowNum++;
dataNum++;
}
try {
wb.write(out);
wb.close();
out.close();
} catch (IOException e) {
e.printStackTrace();
}
}
/**
* 定义一个设置行值的接口
*/
public interface CellValSetter {
/**
* 设置单元格的方法
* @param rowNum 行数
* @param columnName 列名
* @param cell 单元格
* @return
*/
boolean setCellVal(int rowNum, String columnName, Cell cell);
}
}
导出excel通用工具示例测试类
import java.util.ArrayList;
import java.util.HashMap;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;
import org.apache.poi.ss.usermodel.Cell;
public class ExportExcelTest {
public static void main(String[] args) throws Exception{
Map<String,String> map = new HashMap<String,String>();
final List<Map<String,String>> list = new ArrayList<Map<String,String>>();
for (int i = 0; i < 20; i++) {
for (int j = 1; j < 6; j++) {
map.put("测试" + j, "测试内容" + i + j);
}
list.add(map);
}
// 注意要使用LinkedHashMap,要不列可能不会按表头插入的顺序排序
Map<String,String> headTitle=new LinkedHashMap<String,String>();
headTitle.put("测试1", "测试1");
headTitle.put("测试2", "测试2");
headTitle.put("测试3", "测试3");
headTitle.put("测试4", "测试4");
headTitle.put("cs5", "测试");
final int c = list.size()-1;
ExportExcel ee = new ExportExcel();
ee.exportExcel("e:\\excel", "测试表格.xlsx", "测试", headTitle, false, new CellValSetter() {
@Override
public boolean setCellVal(int rowNum, String columnName, Cell cell) {
if (rowNum > c) {
return false;
}
list.get(rowNum);
if (columnName.equals("测试1")) {
cell.setCellValue(list.get(rowNum).get("测试1"));
}
if (columnName.equals("测试2")) {
cell.setCellValue(list.get(rowNum).get("测试2"));
}
if (columnName.equals("测试3")) {
cell.setCellValue(list.get(rowNum).get("测试3"));
}
if (columnName.equals("测试4")) {
cell.setCellValue(list.get(rowNum).get("测试4"));
}
if (columnName.equals("cs5")) {
cell.setCellValue(list.get(rowNum).get("测试5"));
}
return true;
}
});
System.out.println("测试执行完毕");
}
}
普通项目需要引入的包
poi-4.0.1.jar
poi-ooxml-4.0.1.jar
poi-ooxml-schemas-4.0.1.jar
commons-codec-1.11.jar
commons-collections4-4.3.jar
commons-math3-3.6.1.jar
xmlbeans-3.0.2.jar
commons-compress-1.18.jar
curvesapi-1.06.jar
servlet-api-2.5.jar
maven项目依赖
<!-- poi -->
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi</artifactId>
<version>4.0.1</version>
</dependency>
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi-ooxml</artifactId>
<version>4.0.1</version>
</dependency>
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>servlet-api</artifactId>
<version>2.5</version>
<scope>provided</scope>
</dependency>