2013-02-21 5 views
2

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

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

Я ожидаю, что рабочий лист с именем Search Parameters будет иметь ячейку a1 жирным шрифтом красного цвета. Я получаю то, что ожидаю.

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

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

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

Мои 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> 

Edit начинается здесь

Это самодостаточный код Leigh предложил. Рекомендации Travis для метода wrt format закомментированы, но когда я их использовал, результаты не изменились.

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

Результаты: Лист Фреда, как и ожидалось, ярко-синий шрифт в ячейке а1.

В листе a ячейки a1 и a3 имеют букву a жирным шрифтом синего цвета. Я ожидал смелого зеленого цвета. Клетки a2 и a4 имеют букву b, неформатированные. Я ожидал смелого и красного.

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

+1

Это поможет, если вы разместите * самодостаточный * пример, который другие могли бы проверить независимо от вашей среды. – Leigh

+0

Хороший совет, но я получаю iterupted. Те, кто заинтересован, должны прекратить эту тему в выходные. –

+1

Вы пытались отправить электронную таблицу прямо в браузер вместо сохранения ее в файл? Интересно, имеет ли 'cfspreadsheet' проблемы' cfpdf'-esque. Вы пробовали использовать статический формат вместо структуры format1? {Bold = "true", color = "green"} ' – Travis

ответ

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> 
+0

Я не заметил функцию SpreadsheetCreateSheet в моем поиске через документы. Я знал, что это проблема. –

+0

Я отредактировал этот ответ. Я буду отмечать это как ответ после того, как мое редактирование было принято или отклонено. Я не уверен, что оценка редактирования будет возможна, если я пометил ее как ответ. –

+0

Хорошее дополнение. Re: * Я знал, что проблема в том, что я * IMO часть проблемы - ошибка с 'action = update'. (Возможно, вам понадобится файл с сообщением об ошибке.) Кроме того, основные примеры 'cfspreadsheet' не самые большие ... Просто один большой блок кода, демонстрирующий сразу все функции. Вместо того, чтобы разбивать вещи на меньшие, легче усваивать разделы («как сохранить книгу», «как добавить лист», «как обновить» и т. Д.). Что-то вроде [Руководство для разработчиков POI Busy] (http://poi.apache.org/spreadsheet/quick-guide.html) - очень четкие примеры. – Leigh

Смежные вопросы