2013-02-25 155 views
2

当我运行这段代码:SpreadsheetFormatColumn()右边框

<cfscript> 
flinstones = "fred,wilma,pebbles"; 
Workbook = Spreadsheetnew("Workbook"); 
for (i = 1; i lte listlen(flinstones); i ++) { 
ThisFlinstone = ListGetAt(Flinstones, i); 
if (ThisFlinstone == "wilma") 
SpreadSheetAddRow(Workbook, "#ThisFlinstone#,barney"); 
else 
SpreadSheetAddRow(Workbook, ThisFlinstone); 
} 

Format = {}; 
format.rightborder = "thin"; 
SpreadsheetFormatColumn(WorkBook, Format, 2); 
MYfile = "d:\dw\dwtest\dan\abc.xls"; 
writedump(format); 

</cfscript> 

<cfspreadsheet action="write" filename="#MYFile#" name="Workbook" 
    sheet=1 sheetname="flinstones" overwrite=true> 

我希望看到一个工作表中三行。第二行将有两列,在单元格中带有威尔玛和巴尼。到目前为止,我看到了我的期望。我也希望看到列B右手边框。我实际上看到了右手边框的单元格B2。

如果我改变了:

SpreadSheetAddRow(Workbook, ThisFlinstone); 

这个

SpreadSheetAddRow(Workbook, "#ThisFlinstone#, "); 

我看到右手边第一个三排柱B的

有没有办法有右边框适用于所有列B?

回答

1

更新:

正如丹在评论中提到的,我误解了问题。为了澄清,最后我检查了POI不支持向整个列添加边框。使边框出现在整个列上的唯一方法是首先填充该列中的每个单元格。通过明确设置值或使用SpreadsheetFormatCellRange(sheet, format, 1, 2, maxRow, 2)maximum row number。虽然这确实有效,但我不会推荐它,因为它有一些undesirable side effects


有没有办法有右手边适用于所有的B列的?

简短的回答:

是的,做你已经发现:把所有的细胞,即B1B2B3值第一。即使它只是一个空白或空的字符串。这将在所有三个单元上创建一个边界。

更新1:如果您使用CF 9.0.1,另一个选项是SpreadsheetFormatCellRange。与大多数电子表格功能,它会自动创建不存在的细胞首先:

<cfset SpreadsheetFormatCellRange(Workbook, Format, 1, 2, 3, 2)> 

较长的答案:

要应用的格式,你需要的POI调用Cell对象。当你创建一个新的工作表时,它是完全空白的,没有任何“单元格”。在大多数的情况下,当您使用各种功能之一(例如SpreadSheetSetCellValue,SpreadSheetAddRow等)设置值时,CF仅创建一个Cell对象。 (见下面的例子)。您的原始代码仅在列B中设置一个值。因此,它仅创建一个Cell,即B2SpreadsheetFormatColumn仅格式化现有单元格,这就是为什么边框仅在B2中可见。

<!--- blank sheet with no CELLS ---> 
<cfset Workbook = Spreadsheetnew() /> 
<cfset SpreadSheetWrite(Workbook, "c:/test.xls", true) /> 
<cfspreadsheet action="read" src="c:/test.xls" query="qValues" /> 
<cfdump var="#qValues#" label="No cells exist yet" /> 

<!--- setting one value, creates one CELL ---> 
<cfset Workbook = Spreadsheetnew() /> 
<cfset SpreadSheetAddRow(Workbook, "Fred") /> 
<cfset SpreadSheetWrite(Workbook, "c:/test.xls", true) /> 
<cfspreadsheet action="read" src="c:/test.xls" query="qValues" /> 
<cfdump var="#qValues#" label="Creates a single cell" /> 

<!--- setting two values, creates two CELL's ---> 
<cfset Workbook = Spreadsheetnew() /> 
<cfset SpreadSheetAddRow(Workbook, "Fred, ") /> 
<cfset SpreadSheetWrite(Workbook, "c:/test.xls", true) /> 
<cfspreadsheet action="read" src="c:/test.xls" query="qValues" /> 
<cfdump var="#qValues#" label="Creates two cells" /> 
+0

谢谢你的回答。尽管澄清点。为所有单元格赋值并不会导致格式应用于整个列。它会导致格式化应用于包含数据的单元格。我正在寻找一些代码来模拟选择整个列并使用excel工具栏添加右边框的excel行为。我不认为有任何存在。在我实际做的工作中,我的解决方法是使用空间是数据和单元格将被格式化的事实。我只是不喜欢这种方法,因为它效率低下。 – 2013-02-25 20:14:42

+0

(编辑)确实,我不清楚你是真的意味着“整个专栏”还是只是那些你填充的行。为了回答你的问题,AFAIK在POI中是不可能的。 “单元格”必须存在才能格式化。所以唯一的解决方法是创建它们,或者通过设置一个值或使用'SpreadsheetFormatCellRange'(本质上是做同样的事情)。后者尽可能接近。但你是对的,它是低效的..也有一些[不愉快的副作用](http://stackoverflow.com/a/12699425/104223)。 – Leigh 2013-02-25 20:27:51

+0

我根据评论更新了答案。 – Leigh 2013-02-25 20:49:51