一、使用的jar依赖版本
<!-- https://mvnrepository.com/artifact/org.apache.poi/poi-ooxml -->
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi-ooxml</artifactId>
<version>3.17</version>
</dependency>
注:jar包poi与poi-ooxml的区别:
poi:使用前缀为HSSF的类(HSSFWorkbook),只支持2007以前的excel(文件扩展名为xls)。
poi-ooxml:使用前缀为XSSH的类(XSSFWorkbook),支持2007以前和以后的excel(文件扩展名为xlsx)。
依赖和版本的差异可能会导致代码的差异。
二、工具类实现
package test.poi;
import java.io.ByteArrayOutputStream;
import java.io.InputStream;
import java.lang.reflect.Field;
import java.util.List;
import org.apache.poi.ss.usermodel.VerticalAlignment;
import org.apache.poi.ss.usermodel.BorderStyle;
import org.apache.poi.ss.usermodel.Cell;
import org.apache.poi.ss.usermodel.HorizontalAlignment;
import org.apache.poi.ss.usermodel.IndexedColors;
import org.apache.poi.ss.usermodel.Row;
import org.apache.poi.xssf.usermodel.XSSFCellStyle;
import org.apache.poi.xssf.usermodel.XSSFFont;
import org.apache.poi.xssf.usermodel.XSSFSheet;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;
public class ExcelUtil {
/**
* 通过模板导出excel文件
* @param dataList 数据集合
* @param dataEntityClass 数据实体类
* @param templateName 模板名称
* @param titleRowNum 固定标题行数
* @return
* @throws Exception
*/
public static <T> ByteArrayOutputStream exportExcel(List<T> dataList, Class<T> dataEntityClass, String templateName, int titleRowNum) throws Exception {
// 读取excel模板文件
InputStream in = ExcelUtil.class.getClassLoader().getResourceAsStream("templates/"+templateName);
XSSFWorkbook workbook = new XSSFWorkbook(in);
XSSFSheet sheet = workbook.getSheetAt(0);
// 设置默认行高
//sheet.setDefaultRowHeightInPoints(25F);
// 获取数据实体类的所有字段
Field[] declaredFields = dataEntityClass.getDeclaredFields();
int declaredFieldsSize = declaredFields.length;
// ByteArray输出字节流
ByteArrayOutputStream baos = new ByteArrayOutputStream();
// 遍历数据写入到excel
int dataListSize = dataList.size();
for (int i = 0; i < dataListSize; i++) {
// 获取数据list里面的对象实例
T instance = dataList.get(i);
// 创建行
Row row = sheet.createRow(i + titleRowNum);
for(int j = 0; j < declaredFieldsSize; j++){
Field field = declaredFields[j];
field.setAccessible(true);
// 获取字段的值
Object value = field.get(instance);
// 创建单元格
Cell cell = row.createCell(j);
// 设置单元格样式
XSSFCellStyle cellStyle = workbook.createCellStyle();
// 设置文本对齐方式
cellStyle.setWrapText(true); //设置自动换行
cellStyle.setAlignment(HorizontalAlignment.CENTER);// 水平居中
cellStyle.setVerticalAlignment(VerticalAlignment.CENTER);// 垂直居中
// 设置边框
cellStyle.setBorderBottom(BorderStyle.THIN); // 下边框
cellStyle.setBorderLeft(BorderStyle.THIN);// 左边框
cellStyle.setBorderTop(BorderStyle.THIN);// 上边框
cellStyle.setBorderRight(BorderStyle.THIN);// 右边框
// 设置字体
XSSFFont font = workbook.createFont();
font.setFontName("宋体");// 设置字体名称
font.setFontHeightInPoints((short) 11);// 设置字号
font.setColor(IndexedColors.BLACK.index);// 设置字体颜色
cellStyle.setFont(font);
cell.setCellStyle(cellStyle);
cell.setCellValue(value != null ? value.toString() : "");
}
}
workbook.write(baos);
workbook.close();
return baos;
}
}
三、控制类下载实现(spring mvc)
package test.controller;
import java.io.ByteArrayOutputStream;
import java.io.OutputStream;
import java.net.URLEncoder;
import java.util.ArrayList;
import java.util.List;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import test.domain.ExcelDataTest;
import test.poi.ExcelUtil;
@Controller
@RequestMapping("/excel")
public class ExcelController {
@RequestMapping(value = "/export" , method = RequestMethod.GET, produces = "application/json")
public void exportQuarterReport(HttpServletResponse response,HttpServletRequest request) throws Exception{
ByteArrayOutputStream baos = null;
OutputStream out = null;
try {
// excel数据 实际运用从数据库中查询
List<ExcelDataTest> dataList = new ArrayList<ExcelDataTest>();
ExcelDataTest data = new ExcelDataTest();
data.setColumn1(123456);
data.setColumn2("测试测试");
data.setColumn3("测试测试测试测测试测试测试");
dataList.add(data);
baos = ExcelUtil.exportExcel(dataList, ExcelDataTest.class, "excel测试模板.xlsx", 2);
// 设置响应消息头,告诉浏览器当前响应是一个下载文件
response.setContentType( "application/x-msdownload");
// 告诉浏览器,当前响应数据要求用户干预保存到文件中,以及文件名是什么 如果文件名有中文,必须URL编码
String FileName = URLEncoder.encode("测试.xlsx", "UTF-8");
response.setHeader( "Content-Disposition", "attachment;filename=" + FileName);
out = response.getOutputStream();
baos.writeTo(out);
} catch (Exception e) {
e.printStackTrace();
throw new Exception("导出失败:" + e.getMessage());
} finally {
if(baos != null){
baos.close();
}
if(out != null){
out.close();
}
}
}
}
数据实体类
package test.domain;
public class ExcelDataTest {
private Integer column1;
private String column2;
private String column3;
public Integer getColumn1() {
return column1;
}
public void setColumn1(Integer column1) {
this.column1 = column1;
}
public String getColumn2() {
return column2;
}
public void setColumn2(String column2) {
this.column2 = column2;
}
public String getColumn3() {
return column3;
}
public void setColumn3(String column3) {
this.column3 = column3;
}
}
模板文件(存放路径为src/main/resources/templates)