2016-07-26 70 views
2

当我尝试创建xlsx时,我一直在创建标头。我能够创建一个包含行和合并单元格的文件,但标题似乎无法工作。这是我有什么:未创建Apache POI XSSF标头

var WorkBook = CreateObject( 
    "java", 
    "org.apache.poi.xssf.usermodel.XSSFWorkbook" 
).Init(); 

var Sheet = WorkBook.CreateSheet(
    JavaCast("string", 'my sheetname') 
); 

// create the default header if it doesn't exist 
var header = sheet.getHeader(); // have also tried getEvenHeader() and getOddHeader() 

header.setText('&LLeft Section'); 
// have also tried the following: 
//header.setLeft('left header'); 
//header.setCenter('CENTER'); 
//header.setRight('right header'); 

// open the file stream 
var FileOutputStream = CreateObject(
    "java", 
    "java.io.FileOutputStream" 
).Init(
    JavaCast("string", filename) 
); 

// Write the workbook data to the file stream. 
WorkBook.Write( 
    FileOutputStream 
); 

// Close the file output stream. 
FileOutputStream.Close(); 

当我运行此代码,没有错误引发。该文件已创建并可以打开而不会引发任何错误,但不会显示标题。就像我所说的,如果我创建的是行/单元而不是头,那么这些都是正确创建的。我错过了什么?

编辑: 正如Leigh指出的那样,标题/页脚在Excel中的含义与我对它们的想法不同(如在PDF中)。我在Excel中添加一个标题显示它在第一行上方,并且认为通过POI添加一个会做同样的事情。

+1

愚蠢的问题,而是你是如何验证头是不存在?它们应该只在打印时出现(或在打印预览中)。 FWIW,上面的代码在填充至少一个单元格后(即所以需要打印的东西)对我来说工作得很好。 – Leigh

+0

“Header”是什么意思?工作表中的第一行?打印头?还有别的吗? – Gagravarr

+0

@Leigh Hmmmm .....我以为他们应该显示,因为当我在Excel中插入标题时,它确实出现在第一行的上方。我有(显然是错误的)假设,如果我以编程方式创建头,它会以相同的方式出现。所以在Excel中,打印时严格使用页眉/页脚?我想现在我觉得这是有道理的。在D'oh下的文件! – earachefl

回答

3

(从评论的推动下,万一答案是下一个家伙有用)

愚蠢的问题,而是你是如何验证标头不存在?在Excel中,headers and footers should only be visible when printing (or in print preview mode)

...页眉和页脚不显示在普通视图 工作表上 - 他们只是在页面视图中,并在印刷 页面上显示。

FWIW,在我填充至少一个单元格(因此有东西需要打印)后,代码可以在CF10和11下正常工作。

Runnable Example on trycf.com

<cfscript> 
    workBook = CreateObject("java", "org.apache.poi.xssf.usermodel.XSSFWorkbook").Init(); 
    sheet = WorkBook.CreateSheet(JavaCast("string", 'my sheetname')); 
    header = sheet.getHeader(); // have also tried getEvenHeader() and getOddHeader() 
    header.setText('&LLeft Section'); 
    // add some data so there is something to print 
    sheet.createRow(0).createCell(0).setCellValue("sample value"); 
    // Using binary stream because trycf.com does not support files for security reasons 
    baos = createObject("java", "java.io.ByteArrayOutputStream").init(); 
    // Write the workbook data to the binary stream 
    workBook.write(baos); 
    baos.close(); 
</cfscript> 

<!--- CF10 lacks support for script version of cfcontent ---> 
<cfcontent type="application/vnd.openxmlformats-officedocument.spreadsheetml.sheet" 
    variable="#baos.toByteArray()#">