如何在ColdFusion 2016中动态设置电子表格自动筛选?

如何在ColdFusion 2016中动态设置电子表格自动筛选?,coldfusion,spreadsheet,autofilter,coldfusion-2016,Coldfusion,Spreadsheet,Autofilter,Coldfusion 2016,我想向电子表格第一行中的所有列添加动态自动筛选。以下是我到目前为止所做的示例: SpreadSheetAddAutoFilter(theSheet,"A1:Z1"); 这是可行的,但问题是如果我的文件中有更少或更多的列。有没有办法在文件第一行的每一列上设置过滤器?这不应该硬编码。如果你有这个问题的例子,请告诉我。谢谢。假设您已经有一个Excel工作表,并且正在尝试将筛选器动态添加到整行,您需要 获取列计数 将列计数转换为相应的字母。例如,列E->5 从中创建一个范围,例如A1:E1,并将该字符

我想向电子表格第一行中的所有列添加动态自动筛选。以下是我到目前为止所做的示例:

SpreadSheetAddAutoFilter(theSheet,"A1:Z1");

这是可行的,但问题是如果我的文件中有更少或更多的列。有没有办法在文件第一行的每一列上设置过滤器?这不应该硬编码。如果你有这个问题的例子,请告诉我。谢谢。

假设您已经有一个Excel工作表,并且正在尝试将筛选器动态添加到整行,您需要

  • 获取列计数
  • 将列计数转换为相应的字母。例如,列E->5
  • 从中创建一个范围,例如
    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>
    
    
    计数:#计数#
    标签:#列_标签#
    发布此答案,因为它比已发布的答案效果更好。 这只是一个简单的循环,通过除以
    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>
    

    .

    用于构建范围,或在CF中重写范围,因为当
    索引大于26时,函数将中断。相反,试试这个@RRK-您应该根据此处的POI convertNumToColString函数,将该转换作为单独的答案+1发布:用于查找余数(%26)的方法在Railo、Lucee和ColdFusion 10/11中有效,但在CF2016或2018中无效。这一定是一个新的CF错误。我认为在使用模数时,您可能需要在“n”附近添加val()。。。rem=val(n)%26;我补充了这一点,现在似乎在2016年和2018年成功了。@JamesMoberg-2018年的确切版本是什么?这个例子在2018,0,02313961中对我有效。但你是对的,它确实在trycf.com上失败了——2018,0,03314033版。似乎是某种解析器错误。在“%”之前或之后添加一个空格,它可以正常工作
    rem=n(空格)%26
    rem=n%(空格)26
    
    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;
    }