poi导出excel设置样式

时间:2024-03-08 09:37:25

由于要利用poi导出excel(XSSFWorkbook),而且要添加样式,搜索其他的结果无非都是颜色值,经查询的结果,做一下总结:

1、设置背景色,要用  style.setFillForegroundColor(IndexedColors.YELLOW.getIndex());

使用 style.setFillBackgroundColor(bg);方法总是出现一个黑块,所以改为上面的写法,结果正确

颜色的问题,可以在 IndexedColors 中查到,是个枚举

2、有合并单元格的情况下,给一行直接设置背景颜色,并没有起到效果,所以在 createCell 时,包装了一个方法

 1 /**
 2      * 创建cell 此方法目的,是要给所有的cell加上边框和背景色
 3      * @param workbook 工作薄
 4      * @param row 行
 5      * @param index 下标
 6      * @return
 7      */
 8 public XSSFCell createCell(XSSFWorkbook workbook,XSSFRow row,int index,String ... args) {
 9         CellStyle style=SheetStyle.getDefaultCellStyle(workbook);
10         XSSFCell cell = row.createCell(index);
11         
12         //大于3,因为前边几行不需要样式
13         if(row.getRowNum()>3) {
14             //偶数行为Lime,奇数行为Yellow
15             if(this.staffIndex%2==0) {
16                 SheetStyle.setCellStyleLime(style);
17             }else {
18                 SheetStyle.setCellStyleYellow(style);
19             }
20         }
21         row.setRowStyle(style);
22         cell.setCellStyle(style);
23         return cell;
24     }

把样式同时赋值给RowStyle和CellStyle,导出的效果理想

3、需要有合并单元格的情况,必须先创建合并单元格,然后在填值

CellRangeAddress callRangeAddress5 = new CellRangeAddress(start,end,0,0);//起始行,结束行,起始列,结束列
sheet.addMergedRegion(callRangeAddress5);

4、spring mvc导出excel文件,Controller部分的代码:

主要用来设置导出的文件名

/**
     * excel排班
     * @param request
     * @param response
     * @return
     * @throws IOException
     */
    @SuppressWarnings("resource")
    @RequestMapping(value = "exportExcel")
    public void exportExcel(HttpServletRequest request, HttpServletResponse response) throws IOException {
        Map<String,Object> result=schedulingService.downloadScheduling(request.getParameter("x"));
        String name="导出结果"+result.get("month");
        byte [] bytes=(byte[]) result.get("data");
        response.setContentType("application/binary;charset=UTF-8");
        response.setHeader("Content-Disposition", "attachment;fileName=" + URLEncoder.encode(name+".xlsx", "UTF-8"));
        response.setContentLength(bytes.length);
        response.getOutputStream().write(bytes);
        response.getOutputStream().flush();
        response.getOutputStream().close();
    }

 

将SheetStyle完整代码贴出,有需要的可以拿来复制

import org.apache.poi.ss.usermodel.BorderStyle;
import org.apache.poi.ss.usermodel.CellStyle;
import org.apache.poi.ss.usermodel.FillPatternType;
import org.apache.poi.ss.usermodel.Font;
import org.apache.poi.ss.usermodel.HorizontalAlignment;
import org.apache.poi.ss.usermodel.IndexedColors;
import org.apache.poi.ss.usermodel.VerticalAlignment;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;

/**
 * 设置excel的样式类
 *
 */
public class SheetStyle {

    public static void setColumnWidth() {
        
    }
    /**
     * 水平居中、垂直居中
     * 字体:宋体
     * 字体大小:16号
     * 加粗
     * @param workbook
     * @return
     */
    public static CellStyle getStyle(XSSFWorkbook workbook) {
        CellStyle cellstyle=workbook.createCellStyle();
        cellstyle.setAlignment(HorizontalAlignment.CENTER);//水平居中
        cellstyle.setVerticalAlignment(VerticalAlignment.CENTER);//垂直居中
        Font font=workbook.createFont();//字体
        font.setFontName("宋体");//字体
        font.setFontHeightInPoints((short)16);//字号
        font.setBold(true);//加粗
        cellstyle.setFont(font);
        setBorderStyle(cellstyle);
        return cellstyle;
    }
    
    /**
     * 获取默认的cell表格样式,加边框,水平居中,垂直居中
     * @param workbook
     * @return
     */
    public static CellStyle getDefaultCellStyle(XSSFWorkbook workbook) {
        CellStyle style=workbook.createCellStyle();
        style.setAlignment(HorizontalAlignment.CENTER);//水平居中
        style.setVerticalAlignment(VerticalAlignment.CENTER);//垂直居中
        setBorderStyle(style);
        return style;
    }
    
    /**
     * 边框样式
     * @param style
     */
    public static void setBorderStyle(CellStyle style) {
        style.setBorderBottom(BorderStyle.THIN); //下边框
        style.setBorderLeft(BorderStyle.THIN);//左边框
        style.setBorderTop(BorderStyle.THIN);//上边框
        style.setBorderRight(BorderStyle.THIN);//右边框
    }
    
    /**
     * 奇数行
     * 背景颜色为黄色
     * @param style
     */
    public static void setCellStyleYellow(CellStyle style) {
        style.setFillForegroundColor(IndexedColors.YELLOW.getIndex());
        style.setFillPattern(FillPatternType.SOLID_FOREGROUND);
    }
    /**
     * 偶数行
     * 背景颜色为LIME 
     * @param style
     */
    public static void setCellStyleLime(CellStyle style) {
        style.setFillForegroundColor(IndexedColors.LIME.getIndex());
        style.setFillPattern(FillPatternType.SOLID_FOREGROUND);
    }
    /**
     * 字体设置红色
     * @param workbook
     * @param style
     */
    public static void setFontRedColor(XSSFWorkbook workbook,CellStyle style) {
        Font font=workbook.createFont();//字体
        font.setColor(IndexedColors.RED.getIndex());
        style.setFont(font);
    }
}