2

最后编辑

谁能看到我做错了什么?以下是我的期望和观察:

我希望名为“搜索参数”的工作表具有粗体红色字体的单元格 a1。我得到了我的期望。

我希望有一个名为“4D,CCCU,SDAU”的工作表,其中的数据从第 3 行开始。我明白了。

我希望第 3 行有文本“bold font 3 green true”,并且是粗体绿色字体。我得到了文本,但我得到了粗体红色字体,它与另一张表中的单元格 a1 匹配。实际上,此单元格中的格式将始终与另一张表中的单元格 a1 匹配。

我希望剩余的单元格具有像“normal font 4 blue true”这样的值,并且是蓝色粗体。我得到了值,但根本没有格式。

我的 writedumps 总是向我展示我期望的值。

代码如下。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 建议的自包含代码。特拉维斯建议的 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>

结果是:工作表 fred 符合预期,单元格 a1 中的粗体蓝色字体。

在工作表 a 中,单元格 a1 和 a3 的字母 a 为蓝色粗体。我期待大胆的绿色。单元格 a2 和 a4 有字母 b,未​​格式化。我期待大胆和红色。

我是在做一些愚蠢的事情,还是做错了什么。我正在使用 ColdFusion 9.01 和 Excel 2010。

4

1 回答 1

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>
于 2013-02-22T15:42:07.867 回答