在我的另一个应用程序中,我有一个带有动态列的数据表。我的代码应该将数据表内容导出为excel格式。我的代码是为具有固定列数的数据表工作的。但是,如果标题行位于动态列中,则它不会带来标题行。我浏览了更多的网站,他们建议有一个带标签的虚拟栏。我也试过了。但无法在excel中显示页眉。其他excel内容显示正确。
我的代码是:
Xhtml代码:
<p:dataTable id="rosterviewtab" var="data" value="#{dtRosterView.rostertab}" >
<p:columnGroup type="header">
<p:row>
<p:column headerText="" />
<p:column style="display:none">
<f:facet name="header"> #{dtRosterView.dates} </f:facet>
</p:column>
<ui:repeat value="#{dtRosterView.dates}" var="dates">
<p:column headerText="#{dates}" exportable="false" />
</ui:repeat>
</p:row>
</p:columnGroup>
<p:column>
<h:outputText value="#{data.slot_noresources}" />
</p:column>
<p:column>
<h:outputText value="#{data.datecol1}" />
</p:column>
<p:column>
<h:outputText value="#{data.datecol2}" />
</p:column>
</p:dataTable>
<h:panelGrid columns="2" cellpadding="5">
<p:commandButton value="Export To Excel" style="font-size:11px;width:120px;height:40px" immediate="true" ajax="false" >
<p:dataExporter type="xls" target="rosterviewtab" fileName="RosterView" postProcessor="#{dtRosterView.postProcessXLS}" update="@form" />
</p:commandButton>
在我的Bean课堂上:
public void postProcessXLS(Object document)
{ HSSFWorkbook wb = (HSSFWorkbook) document;
HSSFSheet sheet = wb.getSheetAt(0);
for (Row row : sheet) {
for (Cell cell : row) {
System.out.println("cell value -->"+ cell.getStringCellValue());
cell.setCellValue(cell.getStringCellValue().toUpperCase());
}
}
}
我遇到了同样的情况,我使用了p:fileDownload,并实现了如下:在xhtml中:
<p:commandLink ajax="false">
<p:graphicImage value="#{exportType.icon}" title="#{exportType.firstLangName}"/>
<p:fileDownload value="#{customStatementBean.makeExportFile(exportType.exportTypeId)}"/>
</p:commandLink>
在豆中:
public StreamedContent makeExportFile(Long exportTypeId) {
InputStream stream;
try {
stream = customStatementService.getExportFileInputStream(customStatementSO, customStatementResult, exportTypeId, getCurrentLanguage().toLowerCase());
} catch (SabaBusinessException e) {
saveError(e);
return null;
}
return new DefaultStreamedContent(stream, getContentType(exportTypeId), customStatementService.makeFileName(customStatementSO, exportTypeId), "UTF-8");
}
当然,在customerStatementService.getExportFileInputStream中,我根据需要使用POI创建了excel文件。
我在pom.xml中对poi使用的依赖项如下:
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi</artifactId>
<version>3.9</version>
</dependency>
我使用以下代码解决了这个问题。
HSSFWorkbook wb = (HSSFWorkbook) document;
HSSFSheet sheet = wb.getSheetAt(0);
/*HSSFRow header = sheet.getRow(1);
HSSFCellStyle cellStyle = wb.createCellStyle();
for(int i=0; i < header.getPhysicalNumberOfCells();i++) {
HSSFCell cell = header.getCell(i);
cell.setCellStyle(cellStyle);
} */
HSSFRow row1 = sheet.createRow(0);
//HSSFCell r1c1 = row1.createCell(1);
//r1c1.setCellValue("dates");
int columval = 1;
for(int d=0; d<dates.size();d++)
{
System.out.println("dates-->"+dates.get(d).toString());
HSSFCell r1c1 = row1.createCell(columval);
r1c1.setCellValue(dates.get(d).toString());
columval +=1;
}
for (Row row : sheet) {
for (Cell cell : row) {
System.out.println("cell value -->"+ cell.getStringCellValue());
cell.setCellValue(cell.getStringCellValue().toUpperCase());
}
}