最近做的项目中导出功能做的比较多,所以根据经验自己写了一个导出的公用类,供大家参考:
1、加入maven依赖
org.apache.poi
poi-ooxml
3.9
2、创建导出类,属性值不用提供getter和setter方法
import org.apache.poi.hssf.util.HSSFColor;
import org.apache.poi.ss.usermodel.CellStyle;
import org.apache.poi.ss.usermodel.IndexedColors;
import org.apache.poi.ss.util.CellRangeAddress;
import org.apache.poi.xssf.usermodel.XSSFCell;
import org.apache.poi.xssf.usermodel.XSSFCellStyle;
import org.apache.poi.xssf.usermodel.XSSFFont;
import org.apache.poi.xssf.usermodel.XSSFRow;
import org.apache.poi.xssf.usermodel.XSSFSheet;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;
/**
* 导出Excel表格工具类
*/
public class ExportExcel {
private String[] rowName;//列名名称
private List
3、创建单元表格头的样式
/**
* 列头单元格样式
*/
public CellStyle getColumnTopStyle(XSSFWorkbook workbook,int fontSize) {
// 设置字体
XSSFFont font = workbook.createFont();
// 设置字体大小
font.setFontHeightInPoints((short) fontSize);
// 字体加粗
font.setBoldweight(XSSFFont.BOLDWEIGHT_BOLD);
// 设置字体名字
font.setFontName("宋体");
// 设置列头字体的颜色
font.setColor(HSSFColor.VIOLET.index);
// 设置样式
CellStyle style = workbook.createCellStyle();
// 在样式用应用设置的字体
style.setFont(font);
// 设置自动换行
style.setWrapText(false);
// 设置水平对齐的样式为居中对齐
style.setAlignment(XSSFCellStyle.ALIGN_CENTER);
// 设置垂直对齐的样式为居中对齐
style.setVerticalAlignment(XSSFCellStyle.VERTICAL_CENTER);
// 设置单元格填充颜色
style.setFillForegroundColor(IndexedColors.GREY_25_PERCENT.getIndex());
style.setFillPattern(CellStyle.SOLID_FOREGROUND);
// 设置边框及颜色
style.setBorderBottom(XSSFCellStyle.BORDER_THIN);//
style.setBottomBorderColor(IndexedColors.BLACK.getIndex());
style.setBorderLeft(XSSFCellStyle.BORDER_THIN);
style.setLeftBorderColor(IndexedColors.BLACK.getIndex());
style.setBorderRight(XSSFCellStyle.BORDER_THIN);
style.setRightBorderColor(IndexedColors.BLACK.getIndex());
style.setBorderTop(XSSFCellStyle.BORDER_THIN);
style.setTopBorderColor(IndexedColors.BLACK.getIndex());
style.setAlignment(XSSFCellStyle.ALIGN_CENTER);
return style;
}
4、创建单元表格体的样式
/**
* 列数据信息单元格样式
*/
public CellStyle getStyle(XSSFWorkbook workbook) {
// 设置字体
XSSFFont font = workbook.createFont();
// 设置字体大小
font.setFontHeightInPoints((short) 10);
// 字体加粗
font.setBoldweight(XSSFFont.BOLDWEIGHT_NORMAL);
// 设置字体名字
font.setFontName("宋体");
// 设置样式
CellStyle style = workbook.createCellStyle();
// 在样式用应用设置的字体
style.setFont(font);
// 设置自动换行
style.setWrapText(true);
// 设置水平对齐的样式为居中对齐
style.setAlignment(XSSFCellStyle.ALIGN_CENTER);
// 设置垂直对齐的样式为居中对齐
style.setVerticalAlignment(XSSFCellStyle.VERTICAL_CENTER);
// 设置边框及颜色
style.setBorderBottom(XSSFCellStyle.BORDER_THIN);//
style.setBottomBorderColor(IndexedColors.BLACK.getIndex());
style.setBorderLeft(XSSFCellStyle.BORDER_THIN);
style.setLeftBorderColor(IndexedColors.BLACK.getIndex());
style.setBorderRight(XSSFCellStyle.BORDER_THIN);
style.setRightBorderColor(IndexedColors.BLACK.getIndex());
style.setBorderTop(XSSFCellStyle.BORDER_THIN);
style.setTopBorderColor(IndexedColors.BLACK.getIndex());
return style;
}
5、导出操作,对response的header设置可以防止在ie浏览器中的中文乱码问题
public void export(HttpServletResponse response) throws Exception {
try {
XSSFWorkbook workbook = new XSSFWorkbook(); // 创建工作薄对象
XSSFSheet sheet = workbook.createSheet(name); // 创建工作表
// sheet样式定义【getColumnTopStyle()/getStyle()均为自定义方法-在下面-可扩展】
CellStyle style = this.getStyle(workbook);// 单元格样式对象
style.setWrapText(false);
int columnlot = rowName.length;
// 将j缴费信息列头设置到sheet的单元格中
sheet.addMergedRegion(new CellRangeAddress(0, 0, 0, columnlot - 1));
// 设置表头
XSSFRow titleRow = sheet.createRow(0);
// 添加边框
CellStyle topStyle = this.getColumnTopStyle(workbook,16);// 获取列头样式对象
titleRow.setHeightInPoints((short)30);//设置表头的行高
for (int i = 0; i < columnlot; i++) {
XSSFCell titleCell = titleRow.createCell(i);
titleCell.setCellStyle(topStyle);
titleCell.setCellValue(name);
}
XSSFRow lotrowRowName = sheet.createRow(1);// 在索引2的位置创建行(最顶端的行开始的第二行)
CellStyle columnTopStyle = this.getColumnTopStyle(workbook,12);// 获取列头样式对象
for (int n = 0; n < columnlot; n++) {
XSSFCell cellRowName = lotrowRowName.createCell(n);// 创建列头对应个数的单元格
// cellRowName.setCellType(XSSFCell.CELL_TYPE_STRING);//设置列头单元格的数据类型
// XSSFRichTextString text = new XSSFRichTextString(rowName[n]);
cellRowName.setCellValue(rowName[n]);// 设置列头单元格的值
cellRowName.setCellStyle(columnTopStyle);// 设置列头单元格样式
}
// 将查询出的价格批次信息数据设置到sheet对应的单元格中
for (int i = 0; i < objList.size(); i++) {
Object[] obj = objList.get(i); // 遍历每个对象
XSSFRow row = sheet.createRow(2 + i); // 创建所需的行数
row.setHeightInPoints(16);
for (int j = 0; j < obj.length; j++) {
XSSFCell cell = null; // 设置单元格的数据类型
cell = row.createCell(j, XSSFCell.CELL_TYPE_STRING);
if (!"".equals(obj[j]) && obj[j] != null) {
cell.setCellValue(obj[j].toString()); // 设置单元格的值
}
cell.setCellStyle(style); // 设置单元格样式
}
}
// 让列宽随着导出的列长自动适应
for (int i = 0; i < columnlot; i++) {
sheet.autoSizeColumn(i);
}
for (int colNum = 0; colNum < columnlot; colNum++) {
int columnWidth = sheet.getColumnWidth(colNum) / 256;
for (int rowNum = 0; rowNum < sheet.getLastRowNum(); rowNum++) {
XSSFRow currentRow; // 当前行未被使用过
if (sheet.getRow(rowNum) == null) {
currentRow = sheet.createRow(rowNum);
} else {
currentRow = sheet.getRow(rowNum);
}
if (currentRow.getCell(colNum) != null) {
XSSFCell currentCell = currentRow.getCell(colNum);
if (currentCell.getCellType() == XSSFCell.CELL_TYPE_STRING) {
int length = currentCell.getStringCellValue().getBytes().length;
if (columnWidth < length) {
columnWidth = length;
}
}
}
}
if (colNum == 0) {
sheet.setColumnWidth(colNum, (columnWidth - 2) * 256);
} else {
sheet.setColumnWidth(colNum, columnWidth * 256);
}
}
// 设置第二行行高
XSSFRow row = sheet.getRow(1);
row.setHeightInPoints(20);
if (workbook != null) {
try {
ByteArrayOutputStream os = new ByteArrayOutputStream();
workbook.write(os);
byte[] content = os.toByteArray();
InputStream is = new ByteArrayInputStream(content);
// 设置response参数,可以打开下载页面
String fileName = name + new SimpleDateFormat("yyyyMMddHHmmss").format(new Date());//文件名称设置为 表头名称 + 14位当前时间戳
response.reset();
response.setContentType("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet;charset=utf-8");
// response.setHeader("Content-Disposition","attachment;filename=" + new String((filename).getBytes(), "iso-8859-1"));
response.setHeader("Content-Disposition", "attachment;filename="+ URLEncoder.encode(fileName, "UTF-8")+".xlsx");//为了解决在IE浏览器中汉字乱码的问题
response.setHeader("Last-Modified", ReportToolUtil.systemDateFormat());
response.setContentLength(content.length);
ServletOutputStream outputStream = response.getOutputStream();
BufferedInputStream bis = new BufferedInputStream(is);
BufferedOutputStream bos = new BufferedOutputStream(outputStream);
byte[] buff = new byte[8192];
int bytesRead;
while (-1 != (bytesRead = bis.read(buff, 0, buff.length))) {
bos.write(buff, 0, bytesRead);
}
bis.close();
bos.close();
outputStream.flush();
outputStream.close();
} catch (Exception e) {
e.printStackTrace();
}
}
} catch (Exception e) {
e.printStackTrace();
}
}
6.可以模拟由页面发起一个http请求,查询导出效果。。。