POI:Jakarta POI 是一套用于访问微软格式文档的Java API。Jakarta POI有很多组件组成,其中有用于操作Excel格式文件的HSSF和用于操作Word的HWPF,在各种组件中目前只有用于操作Excel的HSSF相对成熟。
现在用的比较多的都是用POI技术来导出或者导入Excel,最近工作需要使用导出Excel文件,所以学习了一下,总结一下POI导出Excel的使用。
在项目pom.xml中添加坐标
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi</artifactId>
<version>3.6</version>
</dependency>
Jakarta POI HSSF API 组件
HSSF用于操作Excel的组件对象,常用对象:
- 常用组件:
- HSSFWorkBook -----excel的文档对象
- HSSFSheet -----excel表单
- HSSFRow -----excel的行
- HSSFCell -----excel的格子单元(列)
- HSSFFont -----excel的字体
- HSFFDataFormat -----日期格式
- HSSFHeader ------sheet头
- HSSFFooter -----sheet尾
- 样式:
- HSSFCellStype -----cell的样式
基本操作步骤
首先一个Excel文件对应一个workbook,一个workbook中有多个sheet组成,一个sheet是由多个行(row)和列(cell)组成,那么使用顺序:
- 用HSSFWorkbook创建一个Excel文件对象
- 用HSSFWorkbook对象创建一个Sheet对象
- 用Sheet对象创建行对象(row),用行对象得到cell对象(列)
- 对cell对象进行读或写操作。
- 将生成的HSSFWorkbook放入HttpServletResponse中响应到前端页面
代码演示:
public class ExportExcelUtil {
/**
*@Author:hyg
*@Description:导出excel
*@Date:15:06 2020/8/12
*@param: sheetName sheet名称
*@param: title 标题
*@param: values 内容
*@param: wb HSSFWorkbook对象
*@return:
*/
public static HSSFWorkbook getHSSFWorkbook(String sheetName,String[] title,String[][] values,HSSFWorkbook wb){
//第一步,创建一个HSSFWorkbook,对应一个Excel文件
if (wb==null){
wb=new HSSFWorkbook();
}
//第二步 在workbook中添加一个sheet,对应Excel文件中得sheet
HSSFSheet sheet=wb.createSheet(sheetName);
//第三步,在sheet中添加表头第0 行
HSSFRow row=sheet.createRow(0);
//第四步,创建单元格,设置表头居中
HSSFCellStyle stype=wb.createCellStyle();
stype.setAlignment(HSSFCellStyle.ALIGN_CENTER);
//生命列对象
HSSFCell cell=null;
//创建标题
for (int i=0;i<title.length;i++){
cell=row.createCell(i);
cell.setCellValue(title[i]);
cell.setCellStyle(stype);
}
//创建内容
for (int i=0;i<values.length;i++){
row=sheet.createRow(i+1);
for (int j=0;j<values[i].length;j++){
//将内容赋值到列中
row.createCell(j).setCellValue(values[i][j]);
}
}
return wb;
}
public static void setResponseHeader(HttpServletResponse response, String fileName) {
try {
fileName = new String(fileName.getBytes(), "UTF-8");
response.setContentType("application/vnd.ms-excel");
response.setHeader("Content-Disposition", "attachment;filename="+java.net.URLEncoder.encode(fileName, "UTF-8"));
} catch (Exception ex) {
ex.printStackTrace();
}
}
public static void exportExcel( HttpServletResponse response,String sheetName, String filename,String[] title,String[][] content) {
HSSFWorkbook wb = ExcelUtil.getHSSFWorkbook(sheetName, title, content, null);
try {
// 响应到客户端
ExcelUtil.setResponseHeader(response, filename);
OutputStream os = response.getOutputStream();
wb.write(os);
os.flush();
os.close();
} catch (Exception e) {
e.printStackTrace();
}
}
}
工具类做好后,在业务层进行数据的处理。
service层
List<YggzgwListVO> list=workPostApplyShMapper.selectWorkPostApplyList(query,dw,type,xnxq);
String[] title=new String[]{"岗位名称","设岗导师","所需人数","年级","应聘条件及其要求","学期工作量","计酬标准","学期津贴总额","备注"};
int point=list.size();
String filename = "工作岗位汇总.xls";
String sheetName = "sheet";
String[][] content = new String[point+1][title.length];
int num = 0;
for (YggzgwListVO yggzgwListVO:list){
content[num][0]=yggzgwListVO.getGwmc();
content[num][1]=yggzgwListVO.getDsxm();
content[num][2]=String.valueOf(yggzgwListVO.getRs()) ;
content[num][3]=yggzgwListVO.getNj();
content[num][4]=yggzgwListVO.getTj();
content[num][5]=yggzgwListVO.getXqgzl();
content[num][6]=String.valueOf(yggzgwListVO.getJcbz());
content[num][7]=yggzgwListVO.getXqjtz().toString();
content[num][8]=yggzgwListVO.getBz();
num++;
}
//导出
ExcelUtil.exportExcel(response,sheetName,filename,title,content);
样式的设置
1. 单元格合并
使用HSSFSheet的addMergedRegion()方法
public int addMergedRegion(CellRangeAddress region)
参数CellRangeAddress 表示合并的区域,构造方法:
CellRangeAddress(int firstRow, int lastRow, int firstCol, int lastCol)
参数依次表示:起始行,截至行,起始列,截至列。
2. 单元格样式
- 设置单元格的行高、列宽
HSSFSheet sheet=wb.createSheet();
sheet.setDefaultRowHeightInPoints(10);//设置缺省列高sheet.setDefaultColumnWidth(20);//设置缺省列宽
//设置指定列的列宽,256 * 50这种写法是因为width参数单位是单个字符的256分之
sheet.setColumnWidth(cell.getColumnIndex(), 256 * 50);
3. 单元格样式
首先创建:HSSFCellStyle
HSSFCellStyle cellStyle=wkb.createCellStyle()
操作:
cellStyle.setAlignment(HSSFCellStyle.ALIGN_CENTER);//水平居中
cellStyle.setVerticalAlignment(VerticalAlignment.CENTER);//垂直居中
设置单元格的填充方式,以及前景颜色和背景颜色
提示:
如果需要前景颜色或背景颜色,一定要指定填充方式,两者顺序无所谓;
如果同时存在前景颜色和背景颜色,前景颜色的设置要写在前面;
前景颜色不是字体颜色。
//填充方式
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"));
重要的一步
将样式应用于单元格,注意有些样式只对单元格起作用
cell.setCellStyle(cellStyle);
row.setRowStyle(cellStyle);
设置字体样式
- 创建HSSFFont对象,需要先创建HSSFWorkbook对象
HSSFFont fontStyle = wb.createFont();
字体的各种样式
//设置字体样式
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,需要将它赋值到HSSFCellStyle的对象里。
// 将字体对象赋值给单元格样式对象
cellStyle.setFont(font);
// 将单元格样式应用于单元格
cell.setCellStyle(cellStyle);