coldfusion-在Excel文件中读取CFSPREADSHEET以查询无法访问结果中的列

我正在尝试使用ColdFusion 10和CFSpreadSheet自动处理电子表格.到目前为止,我可以读入文件并转储查询对象而没有任何问题.

<cfspreadsheet action="read" src="#theFile#" query="qData" headerrow="1" columns="1,8,9,11,33"/>
<cfdump var="#qData#"/>  

cfdumpoutput

当我尝试使用数据时,问题就来了.如果我做类似的事情:

<cfoutput query="qData" maxrows="#qData.RecordCount#">
    #qData.GROUP#<br />
    #qData.DOB#<br />
</cfoutput>

我立即收到一个错误:“元素组在QDATA中未定义”.

如果我转储qData.ColumnList我会得到一个列列表:

BTBN(002),DOB ,GROUP ,MEMBER/DEPENDENT NAME ,REL

是空格和()弄乱了吗?如果是这样,我该如何删除这些文件并在读取文件时或之后立即更新列名?

最佳答案
我最初认为这可能是由于“ group”是保留的SQL关键字. (不要尝试在查询中使用该列名.)

您应该遍历并使用isValid(“ variablename”,ColumnName)来确定列名是否有效,然后使用RenameColumn UDF重命名,而不是为已知值清除第一行值并重新保存文件.我们更喜欢这种方法,因为至关重要的是不要修改客户端的原始Excel文件(尤其是因为Adobe ColdFusion在编写文件时存在一些错误,并且很可能会弄乱其他工作表和/或文件中的格式.)

删除非法字符的一种简单方法是使用rereplace:

ReReplace(NewColumnName, "[^a-zA-Z0-9!]", "", "ALL")

但是,您还需要确保新的列名不为空,以字母开头,并且尚未用于其他列.如果您希望这些列按特定顺序排列,则可以简单地将它们重命名为“ col_1”(或将编号用作任何非唯一和/或非法列名的默认后备).

这是摘自2011年博客文章的RenameColumn UDF:

http://www.neiland.net/blog/article/using-java-to-rename-columns-in-a-coldfusion-query-object/

<cffunction name="renameColumn" access="public" output="false" returntype="query" hint="Uses java to rename a given query object column">
  <cfargument name="queryObj" required="true" type="query">
  <cfargument name="oldColName" required="true" type="string">
  <cfargument name="newColName" required="true" type="string">

  <!--- Get an array of the current column names --->
  <cfset var colNameArray = queryObj.getColumnNames()>
  <cfset var i = 0>

  <!--- Loop through the name array and try match the current column name with the target col name--->
  <cfif arrayLen(colNameArray)>
        <cfloop from="1" to="#arrayLen(colNameArray)#" index="i">
              <!--- If we find the target col name change to the new name --->
              <cfif compareNoCase(colNameArray[i],arguments.oldColName) EQ 0>
                    <cfset colNameArray[i] = arguments.newColName>
              </cfif>
        </cfloop>
  </cfif>

  <!--- Update the column names with the updated name array --->
  <cfset queryObj.setColumnNames(colNameArray)>

  <cfreturn queryObj />
</cffunction>

转载注明原文:coldfusion-在Excel文件中读取CFSPREADSHEET以查询无法访问结果中的列 - 代码日志