如何在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工作表,并且正在尝试将筛选器动态添加到整行,您需要
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;
}