自定义导出p:dataTable数据从.xls到.pdf

时间:2015-11-10 16:44:48

标签: excel pdf primefaces export cyrillic

我来自马其顿,在我的国家,我们使用西里尔字体。

我正在NetBeans IDE中开发Web应用程序并使用PrimeFaces 5.2框架。对于导出,我使用poi-3.9.jaritext-2.7.1.jar。我创建了一个表<p:dataTable>,我填写了一些带有西里尔文本的列(名称,姓氏等列)。在我的应用程序中,我喜欢使用export to PDF并导出到Excel,以便客户端可以将表中的数据作为报告或其他内容导出。

导出到Excel效果很好。我可以看到所有数据(包括西里尔文本),并可以在postProcessor中修改它。在postProcessor中,我使用蓝色背景制作表格的标题,为每个单元格添加边框,如果它们有多行则使行更大,自动调整所有列等。

来自xhtml的代码:

    <p:dataTable var="u" value="#{WebClient.allRemoteParkingUsers}" id="uncheckedParkingRequests"
                             rowKey="#{u.ID}" editable="true" tableStyle="table-layout: auto;"
                             emptyMessage="Не постои ниеден паркинг клиент според податоците по кои пребарувате."
                             filteredValue="#{WebClient.filtered_users}" widgetVar="client_table"
                             paginator="true" rows ="20" rowsPerPageTemplate="20,50,100" paginatorAlwaysVisible="true" 
                             paginatorPosition="bottom" paginatorTemplate="{PreviousPageLink} {CurrentPageReport} {NextPageLink} {RowsPerPageDropdown} {Exporters}">
                    <f:facet name="header" id="naslovTabela">
                        <p:outputLabel value="Листа на паркинг клиенти"/>
                        <p:outputPanel style="text-align: right; font-size: 18px;">
                            <h:outputText value="Глобално пребарување:" style="margin-right: 5px;"/>
                            <p:inputText id="globalFilter" onkeyup="PF('client_table').filter()" style="width:200px" placeholder="внесете клучен збор" />
                        </p:outputPanel>
                    </f:facet>
                    <f:facet name="{Exporters}">
                        <h:commandLink style="color: white; font-size: 15px; text-align: center">
                            <h:outputText value="Сними во Excel" />
                            <img src="images/excel_icon.png" alt=""/>
                            <p:dataExporter type="xls" target="uncheckedParkingRequests" fileName="parking_user_excel" postProcessor="#{doc.postProcessXLS}" />
                        </h:commandLink>
                        <h:commandLink style="color: white; font-size: 15px; text-align: center">
                            <h:outputText value="Сними во PDF" />
                            <img src="images/pdf_icon.png" alt=""/>
                            <p:dataExporter type="pdf" target="uncheckedParkingRequests" fileName="file" encoding="UTF-8" />
                        </h:commandLink>
                    </f:facet>
...
</p:dataTable>

DocumentBuilder类:

    import java.io.Serializable;
import javax.faces.bean.ManagedBean;
import org.apache.poi.hssf.usermodel.HSSFCell;
import org.apache.poi.hssf.usermodel.HSSFCellStyle;
import org.apache.poi.hssf.usermodel.HSSFRow;
import org.apache.poi.hssf.util.HSSFColor;
//POI libraries to read Excel File
import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import org.apache.poi.hssf.usermodel.HSSFSheet;
import java.util.Iterator;
//itext libraries to write PDF file

/**
 *
 * @author adrian
 */
@ManagedBean(name = "doc", eager = true)
public class DocumentBuilder implements Serializable {

    public void postProcessXLS(Object document) {
        HSSFWorkbook wb = (HSSFWorkbook) document;
        HSSFSheet sheet = wb.getSheetAt(0);
        //Aply style for all cells
        Iterator rowIter = sheet.rowIterator();
        boolean first_row = true;
        while (rowIter.hasNext()) {
            HSSFRow myRow = (HSSFRow) rowIter.next();
            Iterator cellIter = myRow.cellIterator();
            int row_max_number_of_breaks = 0;
            while (cellIter.hasNext()) {
                HSSFCell cell = (HSSFCell) cellIter.next();
                HSSFCellStyle cell_style = wb.createCellStyle();
                if (first_row) { //Header cell
                    cell_style.setFillForegroundColor(HSSFColor.SKY_BLUE.index);
                    cell_style.setFillPattern(HSSFCellStyle.SOLID_FOREGROUND);
                }
                cell_style.setAlignment(HSSFCellStyle.ALIGN_CENTER);
                cell_style.setVerticalAlignment(HSSFCellStyle.ALIGN_CENTER);
                cell_style.setBorderBottom(HSSFCellStyle.BORDER_THIN);
                cell_style.setBorderTop(HSSFCellStyle.BORDER_THIN);
                cell_style.setBorderRight(HSSFCellStyle.BORDER_THIN);
                cell_style.setBorderLeft(HSSFCellStyle.BORDER_THIN);
                cell_style.setWrapText(true);
                cell.setCellStyle(cell_style);
                String cell_value = cell.getStringCellValue();
                int cell_number_of_break = 0;
                while (cell_value.contains("<br/>")) {
                    cell_value = cell_value.replaceFirst("<br/>", "\n");
                    cell.setCellValue(cell_value);
                    cell_number_of_break += 1;
                }
                if (row_max_number_of_breaks < cell_number_of_break) {
                    row_max_number_of_breaks = cell_number_of_break;
                }
            }
            myRow.setHeight(Short.valueOf(String.valueOf((myRow.getHeight() * (row_max_number_of_breaks + 1)))));
            first_row = false;
        }
        //Resize columns to fit data
        int noOfColumns = sheet.getRow(0).getLastCellNum();
        for (int i = 0; i < noOfColumns; i++) {
            sheet.autoSizeColumn(i);
        }
    }

}

当我尝试使用PrimeFaces导出器将同一个表导出为PDF时,每个具有西里尔文本的字段都不可见。当我从我的Excel文件导出到.pdf时,一切都很好(我可以看到西里尔文本加上我从DocumentBuilder类中获得了额外的设计)。

我已经研究并且已经尝试将编码更改为UTF-8,CP1252,Windows-1252等,但仍然没有。

是否可以制作自定义导出器,首先创建Excel文档,将其导出为PDF并发送(在postProcessor或preProcessor中使用一些魔术代码:) :)

所以我可以从Excel中保留设计并将工作导出为PDF。

0 个答案:

没有答案