2016-04-07 35 views
3

ColdFusion 10とCFSpreadSheetを使用してスプレッドシートの処理を自動化しようとしています。これまでのところ、ファイルを読み込んで問題なくダンプすることができます。CFSPREADSHEETクエリにExcelファイルを読み込み、結果の列にアクセスできない

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

を私はすぐにエラーが出ます:「要素GROUPはQDATAで定義されていません。」

私はqData.ColumnListをダンプした場合、私は列のリストを取得:

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

はそれがスペースと(IS)は、それをめちゃくちゃよ?もしそうなら、ファイルを読み込んだり、直後に列名を更新するにはどうすればよいですか?

答えて

0

解決策 - 列名に複数の空白があり、ColdFusionではそれを許容しません。これはおそらく正規表現でうまくいくかもしれませんが、私はそれを次に扱いますが、ここでは素早く汚れた解決策があります。

<cfset colNameArray = qData.getColumnNames() /> 

<cfloop from="1" to="#arrayLen(colNameArray)#" index="i"> 
    <cfset colNameArray[i] = colNameArray[i].replace(' ','') /> 
    <cfset colNameArray[i] = colNameArray[i].replace('(','') /> 
    <cfset colNameArray[i] = colNameArray[i].replace(')','') /> 
    <cfset colNameArray[i] = colNameArray[i].replace('/','') /> 
</cfloop>  

<cfset qData.setColumnNames(colNameArray) /> 
+2

ただ、#あなたがまた[currentRowの] [「BTBN(002)」]無効な列名すなわち '#queryにアクセスするために、配列表記を使用することができます:)好きな列名割り当てるには、「COLUMNNAMES」属性を使用します'しかし、" columnNames "はもっと単純で清潔なIMOです。 – Leigh

+0

アップロードする前にすべての値をトリミングするために、Excel用に「ASAP Utilities」を使用することを強くお勧めします。また、式を値に素早く変換して、ColdFusionで値を決定しようとしてエラーが発生しないようにする機能もあります。 http://www.asap-utilities.com/(trim()で削除されずにSQLにインポートされる多くのExcelファイルを悩ましている目に見えない非改行スペースも取り除きます) –

3

私は当初、 "group"が予約済みのSQLキーワードである可能性があると考えました。

既知の値の最初の行の値をサニタイズし、ファイルを再保存する代わりに、isValid( "variablename"、ColumnName)をループスルーして使用する必要があります。列名が有効かどうかを確認し、RenameColumn UDFを使用して名前を変更します。このメソッドは、クライアントの元のExcelファイルを変更しないことが重要です(特に、ファイルを書き込む際にAdobe ColdFusionにバグがあり、他のワークシートやファイル内のフォーマットを混乱させる可能性が高いため)。不正な文字を削除する簡単な方法は、rereplace使用することです。

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

をしかし、あなたはまた、新しい列名は、空でない文字で始まり、すでに別の列に使用されていないことを確認する必要があります。列が特定の順序になることを期待している場合は、単に「col_1」の名前を変更するだけです(または、一意でない列名や違法な列名のデフォルトのフォールバックとして番号付けを使用することもできます)。

ここにRenameColumn UDFは、この2011年のブログ記事から撮影:

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

注:ColdFusionの ' isValid( "variableName") 'は既知のバグ/機能を持っており、評価する前に文字列をトリミングするので、列名の先頭と末尾のスペースも手動でチェックする必要があります。 –

0

(ケースの人々のコメントを読んでいない...)

彼らが適合しないとして括弧とスラッシュが問題になりますstandard variable name rules。最も簡単な方法は、"columnNames" attributeを使用して有効な列名を指定する方法です。 (また、あなたの質問には何もしていますが、ヘッダー行を除外したい場合は、excludeHeaderRow="true"を使用)、ほとんどのケースで

<cfspreadsheet action="read" src="c:\path\file.xlsx" 
    query="qData" 
    columnNames="BTBN_002,DOB,GROUP_NAME,MEMBER_DEPEND_NAME,REL" 
    excludeHeaderRow="true" 
    headerrow="1" 
    ... /> 

は、あなたが連想配列表記法を使用して、無効な列名をもアクセスすることはできません。ただし、「columnNames」属性を使用すると、より簡単できれいなIMO属性になります。

<cfoutput query="qData" maxrows="#qData.RecordCount#"> 
    #qData["BTBN(002)"][currentRow]#<br /> 
    .... 
</cfoutput> 
関連する問題