Форматирование ячеек электронной таблицы

Редактировать в конце

Может ли кто-нибудь увидеть, что я делаю неправильно? Вот мои ожидания и наблюдения:

Я ожидаю, что на листе с именем «Параметры поиска» ячейка a1 будет выделена жирным красным шрифтом. Я получаю то, что ожидаю.

Я ожидаю рабочий лист с именем «4D, CCCU, SDAU», данные которого начинаются в строке 3. Я понимаю это.

Я ожидаю, что строка 3 будет иметь текст «полужирный шрифт 3, зеленый, правда» и будет выделена жирным зеленым шрифтом. Я получаю текст, но получаю жирный красный шрифт, который соответствует ячейке a1 на другом листе. На самом деле форматирование в этой ячейке всегда будет соответствовать ячейке a1 на другом листе.

Я ожидаю, что остальные ячейки будут иметь значение, подобное «обычный шрифт 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>

Редактирование начинается здесь

Это автономный код, предложенный Ли. Предложение Трэвиса относительно методов формата закомментировано, но когда я их использовал, результаты не изменились.

<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.

На листе а в ячейках а1 и а3 буква а выделена жирным синим шрифтом. Я ожидал насыщенного зеленого цвета. Ячейки а2 и а4 имеют неформатированную букву b. Я ожидал смелый и красный.

Я делаю что-то глупое, или что-то не так. Я использую ColdFusion 9.01 и Excel 2010.


person Dan Bracuk    schedule 21.02.2013    source источник
comment
Было бы полезно, если бы вы опубликовали автономный пример, который другие могли бы протестировать независимо от вашей среды.   -  person Leigh    schedule 22.02.2013
comment
Хороший совет, но я начинаю нервничать. Желающие могут заглянуть в эту тему на выходных.   -  person Dan Bracuk    schedule 22.02.2013
comment
Вы пытались отправить электронную таблицу прямо в браузер, а не сохранять ее в файл? Интересно, есть ли у cfspreadsheet проблемы в стиле cfpdf. Пробовали ли вы использовать статический формат вместо структуры format1 {bold="true",color="green"}   -  person Travis    schedule 22.02.2013
comment
Я делаю это не очень часто, поэтому просто следую примерам в документации. Он использует структуру для форматирования.   -  person Dan Bracuk    schedule 22.02.2013
comment
да, я видел, даже такое же имя структуры, но для устранения неполадок попробуйте жестко запрограммировать формат или вывести его прямо в браузер. вы случайно не используете 9.0.1?   -  person Travis    schedule 22.02.2013
comment
если вы не используете 9.0.1, я не думаю, что вы можете предварительно отформатировать пустую ячейку. Вы пытались выполнить форматирование вне цикла после того, как содержимое было помещено в ячейку?   -  person Travis    schedule 22.02.2013


Ответы (1)


Я подозреваю, что вы могли столкнуться с ошибкой с <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>
person Leigh    schedule 22.02.2013
comment
Я не заметил функцию SpreadsheetCreateSheet при поиске по документации. Я знал, что проблема во мне. - person Dan Bracuk; 22.02.2013
comment
Я отредактировал этот ответ. Я отмечу это как ответ после того, как мое редактирование будет принято или отклонено. Я не уверен, будет ли возможно оценить редактирование, если я отмечу его как ответ. - person Dan Bracuk; 22.02.2013
comment
Хорошее дополнение. Re: Я знал, что проблема во мне ИМО, часть проблемы — это ошибка с action=update. (Вы можете отправить отчет об ошибке.) Кроме того, основные cfspreadsheet примеры не самые лучшие... Всего один большой блок кода, демонстрирующий все функции сразу. Вместо того, чтобы разбивать вещи на более мелкие, более простые для восприятия разделы (как сохранить книгу, как добавить лист, как обновить и т. д.). Что-то вроде Руководство разработчика по загруженности POI — очень наглядные примеры. - person Leigh; 22.02.2013
comment
Если вы этого не сделаете, последним именем рабочего листа будет имя объекта электронной таблицы, в данном случае рабочей книги. Хм... не уверен насчет последней части. Это не влияет на имена листов (например, Fred и A), а только на то, какой лист установлен как активный. - person Leigh; 22.02.2013
comment
Комментарий о том, чтобы вернуть активной электронной таблице значение 1, чтобы листы правильно назывались, основан на моих наблюдениях. Когда я этого не делал, последний созданный лист всегда назывался Workbook. - person Dan Bracuk; 22.02.2013
comment
Странный. В CF10 такого нет. - person Leigh; 22.02.2013