我来自马其顿,在我的国家,我们使用西里尔字体。
我正在NetBeans IDE中开发Web应用程序并使用PrimeFaces 5.2框架。对于导出,我使用poi-3.9.jar
和itext-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。