3

クライアントから Excel ファイルを受け取り、それらから csv ファイルを作成する必要があります。私の問題は、Excel ファイルの値が、コピーするだけで csv ファイルを作成する基準と一致しないことです。ファイルの作成中に、値を取得して正しい順序に並べる必要があります。CFのライブドキュメントを読みましたが、うまくいくものは見つかりませんでした。

構造体を作成してその中のデータを引き出し、構造体に基づいてcsvファイルを作成することを考えていましたが、これまでにこのようなことをしたことがなく、それが可能かどうかさえわかりません。構造体の代わりに listGetAt を使用することも考えましたが、まだ試していません。

誰かが前にこのようなことをしましたか?同じ問題を抱えた 2 番目のクライアントが発生した場合、これが将来の問題になると思われるため、できるだけ少ない値をハードコーディングしようとしています。

更新(過去数日間、コードを大幅に変更したため、これが現在のものです)

<cfset DataDirectory = "E:\testfolder\test.xlsx"> 

<cfspreadsheet action="read" src="#DataDirectory#" excludeHeaderRow="true" headerrow="1"  query="queryData"> 

 <cfquery name="contact" datasource="#ds#">
        select ClientBrandID 
        from ClientBrands 
        where surveyReferralID IN
                                (select surveyReferralID from clientAdmin where username = '#res#')
     </cfquery>


    <cfscript>
        dataFile = structNew();
        StructInsert(datafile,"ClientBrandID",contact.ClientBrandID);
        StructInsert(datafile,"surveyType", queryData.surveyType);  
    </cfscript>
 <cfscript> 

    ///We need an absolute path, so get the current directory path. 
    theFile=  "E:\testfolder\NewTest.csv";
    //Create a new Excel spreadsheet object and add the query data. 
    theSheet = SpreadsheetNew("PatientData"); 

    SpreadsheetAddRow(theSheet, "ClientBrandID,SurveyType,Location,ClientContactID,FirstName,LastName,HomePhone,WorkPhone,CellPhone,Email"); <!---This is the header of the new CSV --->
    SpreadsheetAddRows(theSheet, "datafile.clientbrandid, datafile.surveytype"); <!--- This is my latest failed attempt. Tried to pass in data from my struct, probably the quotes are the issue but haven't tried it without them --->
</cfscript> 

<!--- Write the spreadsheet to a file, replacing any existing file. ---> 
<cfspreadsheet action="write" filename="#theFile#" format="csv" name="theSheet" overwrite=true >

テスト フォルダー内のすべてのファイルを処理するには、これらのすべての操作を cfloop で実行する必要があります。現在、他のことをする前に、目前の問題を修正するために単一のファイルをハードコーディングしています。また、その間にファイルのすべての値を処理する必要がある別のループがありません。<cfloop query='queryData'>これは、cfspreadsheet から取得したクエリのようなものである必要があります。

4

2 に答える 2

6

任意の順序を受け入れるようにすることもできますが、予想される列ヘッダーを配列などにハードコーディングする必要があります。これは内部使用のためだけであるため、CSVにデータを想定どおりの順序で追加します。前回、クエリからスプレッドシートを作成したときは、このようにしました。おそらくそれは役立つでしょう。

<cfscript>
    sMySpreadSheet = spreadsheetNew();
    column = 1;
    <!--- header row --->
    <!--- Remember what is expected from SpreadsheetSetCellValue --->
    <!--- SpreadsheetSetCellValue(spreadsheetObj, value, row, column) --->

    spreadsheetSetCellValue(sMySpreadSheet ,"First Name",1,column); column++;
    spreadsheetSetCellValue(sMySpreadSheet ,"Last Name",1,column); column++;
    spreadsheetSetCellValue(sMySpreadSheet ,"DOB",1,column); column++;
    spreadsheetSetCellValue(sMySpreadSheet ,"Phone Number",1,column); column++;
    spreadsheetSetCellValue(sMySpreadSheet ,"Number of Kids",1,column); column++;

    <!--- data rows --->
    <!--- if you're not using a header row with real titles you can just use the 
          default col_x 
          example: spreadsheetSetCellValue(sMySpreadSheet , queryData.col_1[q], q+1, column); column++; --->
    for(q=1; q LTE queryData.recordCount; q++){
        column = 1;
        spreadsheetSetCellValue(sMySpreadSheet , queryData.first[q], q+1, column); column++;
        spreadsheetSetCellValue(sMySpreadSheet , queryData.last[q], q+1, column); column++;
        spreadsheetSetCellValue(sMySpreadSheet , queryData.dob[q], q+1, column); column++;
        spreadsheetSetCellValue(sMySpreadSheet , queryData.phoneNumber[q], q+1, column); column++;
        spreadsheetSetCellValue(sMySpreadSheet , queryData.kidCount[q], q+1, column); 

    }
    <!--- make it purdy (optional) --->
    spreadsheetFormatRow(queryData, {fgcolor="light_cornflower_blue"},1);   
</cfscript>

単純にCSVに追加したい場合は、次のようにすることができます(資格がある場合は、「ものを「」でラップします)。

<cfsetting enableCFoutputOnly = "Yes">
<cfsaveContent variable = "myCSV">
<cfset newline = #chr(13)#&#chr(10)#>
<cfoutput>First Name,Last Name,DOB,Phone Number,Number of Kids#newline#</cfoutput>
  <cfoutput query="queryData">#queryData.first#,#queryData.last#,#queryData.dob#,#queryData.phoneNumber#,#kqueryData.idCount##newline#/cfoutput>
</cfsaveContent>
</cfsetting>
<cffile action = "append" file = "[your file]" output = "#myCSV#">

cfsavecontentが空白の問題を引き起こし、cfsettingが役に立たない場合は、別の方法があります。

<cfset myCSV = "First Name,Last Name,DOB,Phone Number,Number of Kids#newline#">
<cfloop query="queryData">
  <cfset myCSV &= "#queryData.first#,#queryData.last#,#queryData.dob#,#queryData.phoneNumber#,#queryData.kidCount##newline#">
</cfloop>
于 2012-12-27T17:28:38.337 に答える
0

編集された質問に基づいたいくつかの提案があります。編集された質問では、あなたが何を達成しようとしているのかが明確ではありませんが、私はそれらを作成しています。

「テストフォルダ内のすべてのファイルを処理するには、これらすべての操作をcfloopに含める必要があります」に関しては、そのフォルダでcfdirectoryを使用できます。ループできるColdFusionクエリが返されます。

コードの残りの部分は、必要以上に複雑に見えます。スプレッドシートを読むと、クエリオブジェクトが得られます。これまでのところ非常に優れています。

連絡先という名前のデータベースクエリは疑わしいようです。resという名前の変数を参照していますが、それがどこから来ているのかは明確ではありません。スプレッドシートからのものである場合は、値リストの方が適切な場合があります。ちなみに、クエリパラメータを使用してください。

csvファイルでスプレッドシートのデータとデータベースクエリを組み合わせたいようです。その場合は、クエリのクエリが役立つ場合があります。

私の場合は、cffile action="write"を使用してcsvファイルを作成します。また、いずれかの値にコンマが含まれている場合に備えて、各値を二重引用符で囲みます。

于 2012-12-27T17:27:20.773 に答える