2016-04-07 29 views
3

ColdFusion 10 ve CFSpreadSheet kullanarak elektronik tabloların işlenmesini otomatikleştirmeye çalışıyorum. Şimdiye kadar dosyayı okuyabilir ve sorgu nesnesini herhangi bir sorun olmadan dökebilirim. Ben verilerle çalışmak çalıştığınızda CFSPREADSHEET sorgusuna Excel dosyasında okuma yapamıyorsanız sonuç sütunlara erişemiyor

cfdumpoutput

konu

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

gelir. Ben böyle bir şey yapmak:

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

ben hemen bir hata alıyorum: "Eleman GRUBU QDATA tanımlanmamış" Ben bir sütun listesini almak qData.ColumnList dökümü olursa

:

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

o boşluk var ve() o kadar karıştırmasını s? Eğer öyleyse, bunlardan nasıl kurtulabilirim ve dosyada okurken ya da hemen ardından sütun isimlerini güncelleyebilir miyim?

cevap

0

ÇÖZÜM - sütun adlarında çok sayıda boşluk vardı ve ColdFusion buna tahammül etmiyor. Bu muhtemelen bir regex ile daha iyi yapılabilirdi ve bundan sonra çalışacağım ama işte buradaki hızlı ve kirli çözüm.

<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

Sadece "COLUMNNAMES" kullanmak '#query [ "BTBN (002)"] [currentRow] # Ayrıca isimleri yani geçersiz sütun erişmek için dizi gösterimini kullanabilirsiniz :) ne istersen sütun adları atamak bağlıyor 'ancak" columnNames "daha basit/daha temiz IMO'dur. – Leigh

+0

İstemcilerin, yüklemeden önce tüm değerleri kırpmaları için Excel için "ASAP Yardımcı Programları" nı kullanmasını şiddetle öneririm. Ayrıca, formülleri hızlıca değerlere dönüştürmek için de bir işlev vardır, böylece ColdFusion değeri belirlemek için bir hata atmaz. http://www.asap-utilities.com/ (Ayrıca, trim() ile kaldırılmayan ve SQL'e aktarılan pek çok Excel dosyasını hedefleyen görünmez bölümleri de keser.) –

3

Başlangıçta, "grup" un ayrılmış bir SQL anahtar sözcüğü olması nedeniyle olabileceğini düşündüm. (Sorgu sorgusunda bu sütun adını kullanmayı denemeyin.)

Bilinen değerler için ilk satır değerlerini ve dosyayı yeniden israf etmek yerine, döngüden geçmeli ve isValid ("variablename", ColumnName) kullanmalısınız. Sütun adı geçerli olup olmadığını belirlemek ve sonra yeniden adlandırmak için RenameColumn UDF kullanın. Bu yöntemin, istemcinin orijinal Excel dosyasını değiştirmemesi (özellikle dosyalar yazılırken Adobe ColdFusion'ın bazı hatalar vermesi ve dosya içinde diğer çalışma sayfalarını ve/veya biçimlendirmesini bozması nedeniyle) değiştirmemizi tercih ediyoruz.

Bir yasadışı karakterleri kaldırmak için kolay bir yol rereplace kullanmaktır:

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

Ama aynı zamanda yeni sütun adı, boş olmayan bir harfi ile başlayan ve zaten başka sütun için kullanılmaz sağlamak gerekir. Sütunların belirli bir sırada olmasını beklerseniz, bunları "col_1" olarak yeniden adlandırabilirsiniz (ya da benzersiz ve/veya yasa dışı sütun adları için varsayılan bir geri dönüş olarak numaralandırmayı kullanabilirsiniz.)

İşte Yeniden AdlandırmaSolumn

(... durumunda millet yorumları okumak yok)

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

Bir not: ColdFusion's ' isValid ("variableName") 'bilinen bir hatayı/özelliği vardır ve onu değerlendirmeden önce dizgiyi düzeltir, böylece sütun ismindeki öndeki/sondaki boşlukları da manuel olarak kontrol etmeniz gerekir. –

0

parantez ve onlar uymayan olarak kesikler sorunlu olacaktır: UDF bu 2011 blog yayınında alınan standard variable name rules. En basit seçenek, geçerli sütun adlarını belirtmek için "columnNames" attribute kullanmaktır. Ayrıca ilişkili dizi gösterimi kullanarak geçersiz sütun adlarını erişebilir, Çoğu durumda

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

(Ayrıca, hiçbir şey sorunuzun ile ilgisi, ancak başlık satırı hariç tutmak istiyorsanız, excludeHeaderRow="true" kullanın). Bununla birlikte, "columnNames" özelliğini kullanmak daha basit/daha temiz IMO'dur.

<cfoutput query="qData" maxrows="#qData.RecordCount#"> 
    #qData["BTBN(002)"][currentRow]#<br /> 
    .... 
</cfoutput>