如何使用Primefaces中的自定义数据导出器在excel中设置字体?

如何使用Primefaces中的自定义数据导出器在excel中设置字体?,primefaces,apache-poi,Primefaces,Apache Poi,我使用的是primefaces 6.1。我需要将报表列表导出为excel格式。为此,我使用了primefaces数据导出器。Dataexporter为我提供excel格式。我还在excel中设置了字体。但该字体在我的excel文件中无法完全使用。设置的字体仅显示在表头。 我的代码如下: public void postProcessXLS(Object document) { HSSFWorkbook wb = (HSSFWorkbook) document; HSSFSheet

我使用的是primefaces 6.1。我需要将报表列表导出为excel格式。为此,我使用了primefaces数据导出器。Dataexporter为我提供excel格式。我还在excel中设置了字体。但该字体在我的excel文件中无法完全使用。设置的字体仅显示在表头。 我的代码如下:

public void postProcessXLS(Object document) {
    HSSFWorkbook wb = (HSSFWorkbook) document;
    HSSFSheet sheet = wb.getSheetAt(0);
    HSSFRow header = sheet.getRow(0);

    HSSFCellStyle cellStyle = wb.createCellStyle();  
    cellStyle.setFillForegroundColor(HSSFColor.AQUA.index);
    cellStyle.setFillPattern(HSSFCellStyle.SOLID_FOREGROUND);
    HSSFFont fontHeader = (HSSFFont) wb.createFont();
    cellStyle.setAlignment(HSSFCellStyle.ALIGN_CENTER);
    fontHeader.setFontName("Magnus Nepali");
    cellStyle.setFont(fontHeader);
    for(int i=0; i < header.getPhysicalNumberOfCells();i++) {
        HSSFCell cell = header.getCell(i);

        cell.setCellStyle(cellStyle);

    }
}
 public void postProcessXLS(Object document) {
        HSSFWorkbook wb = (HSSFWorkbook) document;
        HSSFSheet sheet = wb.getSheetAt(0);
        HSSFCellStyle cellStyle = wb.createCellStyle();  
        cellStyle.setFillForegroundColor(HSSFColor.AQUA.index);
        cellStyle.setFillPattern(HSSFCellStyle.SOLID_FOREGROUND);
        HSSFFont fontHeader = (HSSFFont) wb.createFont();
        cellStyle.setAlignment(HSSFCellStyle.ALIGN_CENTER);
        fontHeader.setFontName("Magnus Nepali");
        cellStyle.setFont(fontHeader);
        for (Row row : sheet) {
            for (Cell cell : row) {
                cell.setCellStyle(cellStyle);
            }
        }

    }
public void后处理xls(对象文档){
HSSF工作手册wb=(HSSF工作手册)文件;
HSSFSheet sheet=wb.getSheetAt(0);
HSSFRow标题=sheet.getRow(0);
HSSFCellStyle cellStyle=wb.createCellStyle();
cellStyle.setFillForegroundColor(HSSFColor.AQUA.index);
cellStyle.setFillPattern(HSSFCellStyle.SOLID\u前景);
HSSFFont fontHeader=(HSSFFont)wb.createFont();
cellStyle.setAlignment(HSSFCellStyle.Alignment_CENTER);
fontHeader.setFontName(“Magnus Nepali”);
cellStyle.setFont(fontHeader);
对于(int i=0;i
我的按钮代码是:

<p:commandButton id="excel" ajax="false">
    <p:dataExporter type="xls" target="tblReport" fileName="report" postProcessor="#{shareDividendMB.postProcessXLS}" />
</p:commandButton>

我的excel格式如下:

public void postProcessXLS(Object document) {
    HSSFWorkbook wb = (HSSFWorkbook) document;
    HSSFSheet sheet = wb.getSheetAt(0);
    HSSFRow header = sheet.getRow(0);

    HSSFCellStyle cellStyle = wb.createCellStyle();  
    cellStyle.setFillForegroundColor(HSSFColor.AQUA.index);
    cellStyle.setFillPattern(HSSFCellStyle.SOLID_FOREGROUND);
    HSSFFont fontHeader = (HSSFFont) wb.createFont();
    cellStyle.setAlignment(HSSFCellStyle.ALIGN_CENTER);
    fontHeader.setFontName("Magnus Nepali");
    cellStyle.setFont(fontHeader);
    for(int i=0; i < header.getPhysicalNumberOfCells();i++) {
        HSSFCell cell = header.getCell(i);

        cell.setCellStyle(cellStyle);

    }
}
 public void postProcessXLS(Object document) {
        HSSFWorkbook wb = (HSSFWorkbook) document;
        HSSFSheet sheet = wb.getSheetAt(0);
        HSSFCellStyle cellStyle = wb.createCellStyle();  
        cellStyle.setFillForegroundColor(HSSFColor.AQUA.index);
        cellStyle.setFillPattern(HSSFCellStyle.SOLID_FOREGROUND);
        HSSFFont fontHeader = (HSSFFont) wb.createFont();
        cellStyle.setAlignment(HSSFCellStyle.ALIGN_CENTER);
        fontHeader.setFontName("Magnus Nepali");
        cellStyle.setFont(fontHeader);
        for (Row row : sheet) {
            for (Cell cell : row) {
                cell.setCellStyle(cellStyle);
            }
        }

    }

只有excel表格标题已更改为字体定义,其余数据为Arial字体。我尝试了其他字体,结果相同。

最终我得到了解决方案。我的工作代码如下:

public void postProcessXLS(Object document) {
    HSSFWorkbook wb = (HSSFWorkbook) document;
    HSSFSheet sheet = wb.getSheetAt(0);
    HSSFRow header = sheet.getRow(0);

    HSSFCellStyle cellStyle = wb.createCellStyle();  
    cellStyle.setFillForegroundColor(HSSFColor.AQUA.index);
    cellStyle.setFillPattern(HSSFCellStyle.SOLID_FOREGROUND);
    HSSFFont fontHeader = (HSSFFont) wb.createFont();
    cellStyle.setAlignment(HSSFCellStyle.ALIGN_CENTER);
    fontHeader.setFontName("Magnus Nepali");
    cellStyle.setFont(fontHeader);
    for(int i=0; i < header.getPhysicalNumberOfCells();i++) {
        HSSFCell cell = header.getCell(i);

        cell.setCellStyle(cellStyle);

    }
}
 public void postProcessXLS(Object document) {
        HSSFWorkbook wb = (HSSFWorkbook) document;
        HSSFSheet sheet = wb.getSheetAt(0);
        HSSFCellStyle cellStyle = wb.createCellStyle();  
        cellStyle.setFillForegroundColor(HSSFColor.AQUA.index);
        cellStyle.setFillPattern(HSSFCellStyle.SOLID_FOREGROUND);
        HSSFFont fontHeader = (HSSFFont) wb.createFont();
        cellStyle.setAlignment(HSSFCellStyle.ALIGN_CENTER);
        fontHeader.setFontName("Magnus Nepali");
        cellStyle.setFont(fontHeader);
        for (Row row : sheet) {
            for (Cell cell : row) {
                cell.setCellStyle(cellStyle);
            }
        }

    }

我不明白,但是。。您仅将字体应用于标题。您不应该对所有行上的所有单元格都执行相同的操作吗?Uhhhhh excel vs pdf。。。对不起,把事情搞混了:-(删除了评论(真丢脸)我怎么能这样做?我认为cell.setCellStyle(cellStyle);应该完成这项工作,但它不起作用@JasperdeVries@JasperdeVries是正确的,您只获取一行
HSSFRow header=sheet.getRow(0);
您需要在工作表中的所有行上循环并设置单元格样式。