最后编辑
谁能看到我做错了什么?这些是我的期望和观察:
我希望一个名为Search Parameters的工作表让单元格a1以粗体红色字体显示。我得到了我的期望。
我期待一个名为“4D,CCCU,SDAU”的工作表,其数据从第3行开始。我得到了这个。
我希望第3行的文字为“粗体字体3绿色为真”,并为粗体绿色字体。我得到了文字,但是我得到了大胆的红色字体,它与另一张表格中的单元格a1相匹配。实际上,此单元格中的格式将始终与单元格a1匹配。“/ p>
我希望剩下的单元格有一个像“normal font 4 blue true”这样的值,并且是蓝色粗体字体。我得到了值,但根本没有格式化。
我的减刑总是向我展示我期望的价值。
代码如下。 AddNewRow是一个udf。
重申一下,问题是,为什么单元格没有像我期望的那样格式化?
<cfscript>
FileName = "d:\dw\dwweb\work\Antibiotics.xls";
SearchParameters = QueryNew("Item,Value","varchar,varchar");
AddNewRow(SearchParameters, "Item,Value","Date Range,#DateRange#");
SearchParametersSheet = Spreadsheetnew("SearchParameters");
SpreadSheetAddRows(SearchParametersSheet, SearchParameters);
SheetNumber = 1;
DrugsByCategory = QueryNew("Item,font","varchar,varchar");
format1 = StructNew();
format1.bold = true;
format1.color = "red";
SpreadsheetFormatCell(SearchParametersSheet, format1, 1, 1);
</cfscript>
<cfspreadsheet action="write" filename="#FileName#"
name="SearchParametersSheet"
sheet=1 sheetname="Search Parameters" overwrite=true>
<cfoutput query="AllDrugs" group="CategoryName">
<cfset AddNewRow(DrugsByCategory,"Item#Chr(30)#font"
,"#CategoryName##Chr(30)#bold",Chr(30))>
<cfoutput>
<cfset AddNewRow(DrugsByCategory,"Item#Chr(30)#font"
,"#StandardSpelling##Chr(30)#normal",Chr(30))>
</cfoutput>
</cfoutput>
<cfquery name="units" dbtype="query">
select distinct unit
from initialresults
</cfquery>
<cfloop query="units">
<cfscript>
SheetNumber ++;
ThisSpreadSheet = SpreadSheetNew(unit);
RowNumber = 3;
for (i = 1; i <= DrugsByCategory.recordcount; i ++) {
// note that the data might contain commas, so we have to use two commands
SpreadsheetAddRow(ThisSpreadSheet, "", RowNumber, 1);
SpreadSheetSetCellValue(ThisSpreadSheet, DrugsByCategory.Item[i], RowNumber, 1);
if (DrugsByCategory.font[i] == "bold"){
format1.bold = true;
format1.color = "green";
writedump(var="#format1#" label="#RowNumber#");
SpreadSheetSetCellValue(ThisSpreadSheet
, "bold font #Rownumber# #format1.color# #format1.bold#"
, RowNumber, 1);
SpreadsheetFormatCell(ThisSpreadSheet, format1, RowNumber, 1);
}
else {
format1.color = "blue";
format1.bold = true;
writedump(var="#format1#" label="#RowNumber#");
SpreadSheetSetCellValue
(ThisSpreadSheet, "normal font
#Rownumber# #format1.color# #format1.bold#"
, RowNumber, 1);
SpreadsheetFormatCell(ThisSpreadSheet, format1, RowNumber, 1);
}
RowNumber ++;
}
</cfscript>
<cfspreadsheet action="update" filename="#FileName#" name="ThisSpreadSheet"
sheet=#SheetNumber# sheetname="#unit#" >
</cfloop>
编辑从这里开始
这是Leigh建议的自包含代码。 Travis的建议wrt格式方法被注释掉了,但是当我使用它们时,结果没有改变。
<cfscript>
Sheet1 = Spreadsheetnew("Sheet1");
SpreadSheetAddRow(Sheet1, "fred");
SheetNumber = 1;
Format = {};
format.bold = true;
format.color = "blue";
MYfile = "d:\dw\dwtest\dan\abc.xls";
writedump(format);
SpreadsheetFormatCell(Sheet1, Format, 1, 1);
Values = "a,b,a,b";
</cfscript>
<cfspreadsheet action="write" filename="#MYFile#" name="Sheet1"
sheet=1 sheetname="fred" overwrite=true>
<cfloop list="a" index="letter">
<cfscript>
RowNumber = 1;
SheetNumber ++;
ThisSheet = SpreadSheetNew(letter);
for (i = 1; i <= 4; i ++) {
SpreadsheetAddRow(ThisSheet, ListGetAt(Values, i));
if (ListGetAt(Values, i) == "a") {
format.color = "green";
SpreadsheetFormatCell(ThisSheet, Format, RowNumber, 1);
//SpreadsheetFormatCell(ThisSheet, {bold="true",color="green"}, RowNumber, 1);
}
else {
format.color = "red";
SpreadsheetFormatCell(ThisSheet, Format, RowNumber, 1);
//SpreadsheetFormatCell(ThisSheet, {bold="true",color="green"}, RowNumber, 1);
}
RowNumber ++;
}
</cfscript>
<cfspreadsheet action="update" filename="#MYFile#" name="ThisSheet"
sheet="#sheetNumber#" sheetname="#letter#" >
</cfloop>
结果如下: Sheet fred与单元格a1中的粗体蓝色字体一样。
在表a中,单元格a1和a3的字母a为粗体蓝色字体。我期待大胆的绿色。单元格a2和a4具有字母b,未格式化。我期待大胆和红色。
我做了些什么愚蠢的事,或者说错了。我正在使用ColdFusion 9.01和Excel 2010。
答案 0 :(得分:4)
我怀疑你可能遇到了<cfspreadsheet action="update" ..>
的错误。
当CF执行“更新”时,它会尝试将表格"a"
(值,格式,公式等)中的所有内容复制到您保存在磁盘上的工作簿中的新工作表中。显然CF并没有复制一切。因此缺少格式。您可以通过将工作表"a"
(仅限 )保存到单独的文件来证明这一点。请注意,当您使用action="write"
时,单元格格式是否正确(出现红色和绿色)?
...
<!--- save separate copy of "ThisSheet" only --->
<cfspreadsheet action="write" filename="c:/thisSheetOnly.xls" name="ThisSheet" ....>
<!--- attempt to combine the sheets --->
<cfspreadsheet action="update" filename="#MyFile#" name="ThisSheet" ... >
老实说,创建整个工作表的完整副本非常棘手。有一个很多的移动件,很容易错过一些东西,这就是这里似乎发生的事情。就个人而言,如果可能的话,我会避免使用action="update"
。太多事情都可能出错。此外,在大多数情况下,您不需要它。您可以轻松创建工作簿,然后添加并填充多个工作表。这是一个简化的示例,它创建并保存两个工作表,然后将它们保存到磁盘。 (经CF10测试)
<cfscript>
// Create new sheet and add one row
Workbook = Spreadsheetnew("Sheet1");
SpreadSheetAddRow(Workbook, "fred");
// Apply formatting to new cell
format = {bold = true, color = "blue"};
SpreadsheetFormatCell(Workbook, Format, 1, 1);
WriteDump(format);
//Add another worksheet and make it active
letter = "a";
SpreadSheetCreateSheet(Workbook, letter);
SpreadSheetSetActiveSheet(Workbook, letter);
//Add rows to the active worksheet
RowNumber = 1;
Values = "a,b,a,b";
for (i = 1; i <= 4; i ++) {
SpreadsheetAddRow(Workbook, ListGetAt(Values, i), RowNumber, 1);
if (ListGetAt(Values, i) == "a") {
Format = {bold = true, color = "green"};
SpreadsheetFormatCell(Workbook, Format, RowNumber, 1);
WriteDump(var=format, label="RowNumber="& RowNumber);
}
else {
Format = {bold = true, color = "red"};
SpreadsheetFormatCell(Workbook, Format, RowNumber, 1);
WriteDump(var=format, label="RowNumber="& RowNumber);
}
RowNumber++;
}
// Set the active worksheet back to the original. If you don't
// the last worksheet name will be the name of the spreadsheet
// object, in this case, workbook.
SpreadSheetSetActiveSheetNumber(Workbook, 1);
//Finally, save it to disk
SpreadSheetWrite(Workbook, "c:/path/to/yourFile.xls", true);
</cfscript>