Primefaces DataExporter 设置 Table 列宽
Primefaces DataExporter Set Table Columns Width
我有一个使用 Primefaces DataExporter 导出的 Primefaces DataGrid,但我不知道如何调整列的大小。
我添加了一个预处理器
<p:dataExporter type="pdf" target="tbl" fileName="cars" preProcessor="#{customizedDocumentsView.preProcessPDF}" />
这是我的 bean 中的代码
public void preProcessPDF(Object document) {
Document pdf = (Document) document;
pdf.open();
pdf.setPageSize(PageSize.A4);
//I need to do something like that
//PdfPTable table = new PdfPTable(4);
//float[] columnWidths = new float[] {10f, 20f, 30f, 10f};
//table.setWidths(columnWidths);
}
有什么办法吗?
最近我继承了许多已经存在的 exporters 的项目,并且已经设置了 options 标签,所以我需要找到一个解决方案来保留所有的他们完好无损。
我从这个接受的 answer 中得到了一个想法。
我的解决方案通过 p:dataExporter 的 options 标签设置列宽,因此不需要 pre/post 处理。我使用 Primefaces 版本 4.x 及更高版本对其进行了测试。
步骤步骤:
创建新包
org.primefaces.component.export
在你的项目中。
来自 Primefaces git 存储库完全复制以下 classes
ExporterOptions ,PDFOptions, Exportedfactory and PDFExporter
进入新创建的包。
在ExporterOptions中添加
public float[] getColumnWidths();
在PDFOptions中添加
float[] columnWidths;
并添加 getter 和 setter.
在ExporterFactory修改行
exporter = new PdfExporter();
到 exporter = new CustomPdfExporter();
将 PDFExporter class 重命名为 CustomPDFExporter 并继续关注 export 方法完全
public void export(FacesContext context, DataTable table, String filename, boolean pageOnly, boolean selectionOnly, String encodingType,MethodExpression preProcessor, MethodExpression postProcessor, ExporterOptions options) throws IOException
从其他 export 方法中删除代码但保留声明。
在CustomPDFExporter里面添加2行在ExportPdfTable方法
protected PdfPTable exportPDFTable(FacesContext context, DataTable table, boolean pageOnly, boolean selectionOnly, String encoding) throws DocumentException {
int columnsCount = getColumnsCount(table);
PdfPTable pdfTable = new PdfPTable(columnsCount);
this.cellFont = FontFactory.getFont(FontFactory.TIMES, encoding);
this.facetFont = FontFactory.getFont(FontFactory.TIMES, encoding, Font.DEFAULTSIZE, Font.BOLD);
if (this.expOptions != null) {
applyFacetOptions(this.expOptions);
applyCellOptions(this.expOptions);
//line 1
//sets columns column relative widths to iText PdfTable object
pdfTable.setWidths(this.expOptions.getColumnWidths());
//line 2
//decreases page margins comparing to original 'Primefaces' layout
pdfTable.setWidthPercentage(100);
}
//....
}
现在您已准备好使用托管 bean 并添加 pdf 选项。例如
pdfOpt = new PDFOptions(); //add getter and setter too
pdfOpt.setFacetBgColor("#F88017");
...
//if, for example, your PDF table has 4 columns
//1st column will occupy 10% of table's horizontal width,...3rd - 20%, 4th - 60%
float[] columnWidths = new float[]{0.1f, 0.1f, 0.2f, 0.6f};
pdfOpt.setColumnWidths(columnWidths);
...
最后,您的 p:dataExporter
组件应该如下所示
<p:dataExporter type="pdf" target="tbl" fileName="cars" options="#{customizedDocumentsView.pdfOpt}"/>
此解决方案使用 PF showcase 产生以下结果
扩展此解决方案的建议:
Primefaces 导出器使用 iText 版本 2.1.7。旧但仍然强大 API。
例如,在步骤 1 的 ExporterOptions 中,您可以添加
public int[] getColumnWidths();
设置绝对列宽
或者您可以根据项目要求设置任何其他选项。
我有一个使用 Primefaces DataExporter 导出的 Primefaces DataGrid,但我不知道如何调整列的大小。
我添加了一个预处理器
<p:dataExporter type="pdf" target="tbl" fileName="cars" preProcessor="#{customizedDocumentsView.preProcessPDF}" />
这是我的 bean 中的代码
public void preProcessPDF(Object document) {
Document pdf = (Document) document;
pdf.open();
pdf.setPageSize(PageSize.A4);
//I need to do something like that
//PdfPTable table = new PdfPTable(4);
//float[] columnWidths = new float[] {10f, 20f, 30f, 10f};
//table.setWidths(columnWidths);
}
有什么办法吗?
最近我继承了许多已经存在的 exporters 的项目,并且已经设置了 options 标签,所以我需要找到一个解决方案来保留所有的他们完好无损。
我从这个接受的 answer 中得到了一个想法。
我的解决方案通过 p:dataExporter 的 options 标签设置列宽,因此不需要 pre/post 处理。我使用 Primefaces 版本 4.x 及更高版本对其进行了测试。
步骤步骤:
创建新包
org.primefaces.component.export
在你的项目中。来自 Primefaces git 存储库完全复制以下 classes ExporterOptions ,PDFOptions, Exportedfactory and PDFExporter 进入新创建的包。
在ExporterOptions中添加
public float[] getColumnWidths();
在PDFOptions中添加
float[] columnWidths;
并添加 getter 和 setter.在ExporterFactory修改行
exporter = new PdfExporter();
到exporter = new CustomPdfExporter();
将 PDFExporter class 重命名为 CustomPDFExporter 并继续关注 export 方法完全
public void export(FacesContext context, DataTable table, String filename, boolean pageOnly, boolean selectionOnly, String encodingType,MethodExpression preProcessor, MethodExpression postProcessor, ExporterOptions options) throws IOException
从其他 export 方法中删除代码但保留声明。
在CustomPDFExporter里面添加2行在ExportPdfTable方法
protected PdfPTable exportPDFTable(FacesContext context, DataTable table, boolean pageOnly, boolean selectionOnly, String encoding) throws DocumentException { int columnsCount = getColumnsCount(table); PdfPTable pdfTable = new PdfPTable(columnsCount); this.cellFont = FontFactory.getFont(FontFactory.TIMES, encoding); this.facetFont = FontFactory.getFont(FontFactory.TIMES, encoding, Font.DEFAULTSIZE, Font.BOLD); if (this.expOptions != null) { applyFacetOptions(this.expOptions); applyCellOptions(this.expOptions); //line 1 //sets columns column relative widths to iText PdfTable object pdfTable.setWidths(this.expOptions.getColumnWidths()); //line 2 //decreases page margins comparing to original 'Primefaces' layout pdfTable.setWidthPercentage(100); } //....
}
现在您已准备好使用托管 bean 并添加 pdf 选项。例如
pdfOpt = new PDFOptions(); //add getter and setter too pdfOpt.setFacetBgColor("#F88017"); ... //if, for example, your PDF table has 4 columns //1st column will occupy 10% of table's horizontal width,...3rd - 20%, 4th - 60% float[] columnWidths = new float[]{0.1f, 0.1f, 0.2f, 0.6f}; pdfOpt.setColumnWidths(columnWidths); ...
最后,您的
p:dataExporter
组件应该如下所示<p:dataExporter type="pdf" target="tbl" fileName="cars" options="#{customizedDocumentsView.pdfOpt}"/>
此解决方案使用 PF showcase 产生以下结果
扩展此解决方案的建议:
Primefaces 导出器使用 iText 版本 2.1.7。旧但仍然强大 API。 例如,在步骤 1 的 ExporterOptions 中,您可以添加
public int[] getColumnWidths();
设置绝对列宽 或者您可以根据项目要求设置任何其他选项。