版权声明:本文为博主原创文章,未经博主允许不得转载。
在软件开发工作当中,导出Excel表格是比较常见的,下面我为大家分享一下POI导出Excel的一些方法。
1、引用poi.jar包
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi</artifactId>
<version>3.9</version>
</dependency>
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi-ooxml</artifactId>
<version>3.9</version>
</dependency>
2、创建Excel
@RequestMapping("/createExcel")
public String createExcel(HttpServletResponse response) throws IOException {
/**
*创建HSSFWorkbook对象(excel的文档对象),本实例是导出扩张名为xls(office2003)。
* 如果需要导出扩展名xlsx(office2007以后版本),只需要把文中HSSF改为XSSF即可,
* 如 HSSFWorkbook改为XSSFWorkbook。
* /
HSSFWorkbook wb = new HSSFWorkbook();
//建立新的sheet对象(excel的表单)
HSSFSheet sheet=wb.createSheet("学生成绩表");
//在sheet里创建第一行,参数为行索引(excel的行),行数最大可为:65536
HSSFRow row1=sheet.createRow(0);
//创建单元格,excel的单元格,参数为列索引,列数最大可为256。
HSSFCell cell=row1.createCell(0);
//设置单元格内容
cell.setCellValue("学员考试成绩一览表");
//合并单元格CellRangeAddress构造参数依次表示起始行,截至行,起始列, 截至列
sheet.addMergedRegion(new CellRangeAddress(0,0,0,3));
//在sheet里创建第二行
HSSFRow row2=sheet.createRow(1);
//创建单元格并设置单元格内容
row2.createCell(0).setCellValue("姓名");
row2.createCell(1).setCellValue("班级");
row2.createCell(2).setCellValue("语文成绩");
row2.createCell(3).setCellValue("数学成绩");
//在sheet里创建第三行
HSSFRow row3=sheet.createRow(2);
row3.createCell(0).setCellValue("测试一");
row3.createCell(1).setCellValue("001");
row3.createCell(2).setCellValue(42);
row3.createCell(3).setCellValue(48);
//输出Excel文件
OutputStream output=response.getOutputStream();
response.reset();
//设置编码
response.setContentType("application/vnd.ms-excel;charset=utf-8");
//filename为导出文件名称的参数,一般况下可用简称+时间串来表示。
response.setHeader("Content-disposition", "attachment; filename=chengji201812091655.xls");
wb.write(output);
output.close();
return null;
}
3、设置Excel的样式
3.1、设置单元格的行高、列宽
//sheet对象(excel的表单)
HSSFSheet sheet=wb.createSheet();
//设置行高
sheet.setDefaultRowHeightInPoints(10);
//设置列宽,第一参数为列数,第二参数为列宽的值。
sheet.setColumnWidth(0, 256 * 50);
//上面介绍的为统一设置行高、列宽,下面我们介绍一下单独设置每行的行高。
//创建行
Row row = sheet.createRow((short) 0);
//设置行高
row.setHeight((short)(200));
3.2、单元格样式
3.2.1设置单元格样式
//创建HSSFCellStyle
HSSFCellStyle cellStyle=wkb.createCellStyle();
// 设置单元格的横向和纵向对齐方式,具体参数就不列了,参考HSSFCellStyle
cellStyle.setAlignment(HSSFCellStyle.ALIGN_CENTER);
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_THIN);
cellStyle.setBottomBorderColor(HSSFColor.DARK_RED.index);
//设置日期型数据的显示样式
cellStyle.setDataFormat(HSSFDataFormat.getBuiltinFormat("m/d/yy h:mm"));
// 设置单元格内容是否自动换行
cellStyle.setWrapText(true);
//将样式应用于单元格中。
cell.setCellStyle(cellStyle);
//将样式应用到行,但有些样式只对单元格起作用
row.setRowStyle(cellStyle);
3.2.2设置单元格中的字体的样式
//创建HSSFFont对象
Font f = wb.createFont();
//设置字体大小
f.setFontHeightInPoints((short) 18);
//设置字体
f.setFontName("黑体");
//字体是否为斜体
f.setItalic(true);
//设置字体颜色。
f.setColor(IndexedColors.BLACK.getIndex());
//设置是非粗体,BOLDWEIGHT_BOLD为粗体字,BOLDWEIGHT_NORMAL为非粗体字。
f.setBoldweight(Font.BOLDWEIGHT_BOLD);
// 添加下划线(Font.U_SINGLE单条下划线/Font.U_DOUBLE双条下划线)
f.setUnderline(Font.U_DOUBLE);
// 是否添加删除线 。
f.setStrikeout(true);
// 将字体应用到样式上面。
cellStyle.setFont(f);
// 样式应用到该单元格上。
cell.setCellStyle(cellStyle);
4、Excel(xls)插入图片
import java.awt.image.BufferedImage;
import javax.imageio.ImageIO;
import org.apache.poi.hssf.usermodel.HSSFCell;
import org.apache.poi.hssf.usermodel.HSSFCellStyle;
import org.apache.poi.hssf.usermodel.HSSFClientAnchor;
import org.apache.poi.hssf.usermodel.HSSFFont;
import org.apache.poi.hssf.usermodel.HSSFHyperlink;
import org.apache.poi.hssf.usermodel.HSSFPatriarch;
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.hssf.util.HSSFColor;
import org.apache.poi.ss.usermodel.Hyperlink;
public class ExcelWriteImgUtil {
/**
* 插入图片
* @param cell 要插入链接的单元格位置
* @param sheetName 插入的图片所在的工作表
* @param patriarch 画图的顶级管理器,一个sheet只能获取一次,多次插入图片请使用同一个patriarch对象
* @param wb HSSFWorkbook对象
* @param file 图片文件
* @param cellPoint 自定义的对象,指定要插入图片的坐标(x, y)
* @return cellPoint 自定义的对象,返回下一个要插入图片的坐标(x, y)
* @throws IOException
*/
public static CellPoint whiteImg(HSSFCell cell, String sheetName, HSSFPatriarch patriarch, HSSFWorkbook wb, File file, CellPoint cellPoint) throws IOException {
Hyperlink hyperlink = new HSSFHyperlink(Hyperlink.LINK_DOCUMENT);
// "'插入图片实例'"表示sheet页名称 "A01"表示第几列第几行
hyperlink.setAddress("'插入图片实例'!A" + (cellPoint.getY() + 1));
cell.setHyperlink(hyperlink);
/* 设置为超链接的样式*/
HSSFCellStyle linkStyle = wb.createCellStyle();
HSSFFont cellFont= wb.createFont();
cellFont.setUnderline((byte) 1);
cellFont.setColor(HSSFColor.BLUE.index);
linkStyle.setFont(cellFont);
cell.setCellStyle(linkStyle);
BufferedImage bufferImg = null;
ByteArrayOutputStream byteArrayOut = new ByteArrayOutputStream();
bufferImg = ImageIO.read(file);
ImageIO.write(bufferImg, "png", byteArrayOut);
int x1 = cellPoint.getX();
int y1 = cellPoint.getY();
int width = bufferImg.getWidth() / 32;
int height = bufferImg.getHeight() / 8;
int x2 = x1 + width;
int y2 = y1 + height;
// anchor主要用于设置图片的属性
HSSFClientAnchor anchor1 = new HSSFClientAnchor(0, 0, 0, 0, (short) x1, y1, (short) x2, y2);
// 插入图片
patriarch.createPicture(anchor1, wb.addPicture(byteArrayOut.toByteArray(),HSSFWorkbook.PICTURE_TYPE_PNG));
cellPoint = new CellPoint(x1, y2 + 1);
return cellPoint;
}
public static class CellPoint {
private int x;
private int y;
public CellPoint(int x, int y) {
super();
this.x = x;
this.y = y;
}
public int getX() {
return x;
}
public void setX(int x) {
this.x = x;
}
public int getY() {
return y;
}
public void setY(int y) {
this.y = y;
}
}
}