Как динамически установить автоматический фильтр электронных таблиц в ColdFusion 2016?

Я хотел бы добавить динамический автоматический фильтр ко всем столбцам в первой строке электронной таблицы. Вот пример того, что у меня есть до сих пор:

SpreadSheetAddAutoFilter(theSheet,"A1:Z1");

Это работает, но проблема в том, что в моих файлах меньше или больше столбцов. Есть ли способ установить фильтр для каждого столбца в первой строке моего файла? Это не должно быть жестко запрограммировано. Пожалуйста, дайте мне знать, если у вас есть пример для этой проблемы. Спасибо.


person espresso_coffee    schedule 21.12.2017    source источник
comment
Используйте CellReference для создания диапазона или перепишите его в CF из источник   -  person SOS    schedule 22.12.2017


Ответы (2)


Предполагая, что у вас уже есть лист Excel и вы пытаетесь динамически добавить фильтр ко всей строке, вам необходимо

  1. Получить количество столбцов
  2. Переведите количество столбцов в соответствующую букву. Например столбец E -> 5
  3. Создайте из него диапазон, например A1:E1, и передайте эту строку в функцию SpreadSheetAddAutoFilter().

Вот рабочий пример, который я написал:

<cffunction name="columnToLetter" returntype="any">
    <cfargument name="index" type="numeric">
    <cfset letterArray = listToArray('A B C D E F G H I J K L M N O P Q R S T U V W X Y Z', ' ')>
    <cfreturn letterArray[index]>
</cffunction>


<cfspreadsheet action="read" src="fin.xlsx" name="spreadSheetObj" sheetname="Sheet1"> 
<cfset count = SpreadsheetGetColumnCount(spreadSheetObj, 'Sheet1')>

<cfoutput>
    count: #count# <br>
    <cfset column_label = columnToLetter(count)>
    <cfset column_label = 'A1:' & column_label & '1'>
    label: #column_label#
    <cfset SpreadSheetAddAutoFilter(spreadSheetObj, column_label)>
    <cfspreadsheet action="write" filename="updatedFile.xls" name="spreadSheetObj" sheetname="courses" overwrite=true> 
</cfoutput>
person Erwin Rodriguez    schedule 21.12.2017
comment
Функции перестанут работать, когда index превысит 26. Вместо этого попробуйте эту функцию. - person rrk; 22.12.2017
comment
@RRK - вы должны опубликовать это преобразование как отдельный ответ - person SOS; 28.12.2017

Публикация этого ответа, поскольку он дает лучшие результаты, чем уже опубликованный ответ. Это простой цикл с делением на 26 и получением символа.

<cfscript>
    // Function to print Excel column name for a given column number
    function printString(n){
        str = '';
        while (n>0){
            // Find remainder
            rem = n%26;
            // If remainder is 0, then a 'Z' must be there in output
            if (rem==0){
                str = 'Z' & str;
                n = (n\26)-1;
            } else {
                str = chr(64 + rem) & str;
                n = n\26;
            }
        }
        return str;
    }
</cfscript>

Более короткая форма

function printString(n){
    str = '';
    while (n>0){
        rem = n%26;
        str = rem==0 ? 'Z' & str : chr(64 + rem) & str;
        n = rem==0 ? (n\26)-1 : n\26;
    }
    return str;
}

Функция в действии.

person rrk    schedule 29.12.2017