Как получить доступ к столбцу запроса с несколькими словами?

Я использую чтение cfspreadsheet для чтения листа в объект запроса.

<cfspreadsheet action="read" src="TestExcel.xls" sheet="1" query="spreadsheetData" headerrow="1" excludeHeaderRow="true"> 

Проблема в том, что некоторые заголовки содержат более одного слова. Таким образом, я получаю примерно такой запрос:

ID  Name    Start Date  End Date
3   Test    1/1/2009    1/1/2013
17  Test 2  11/11/2010  11/11/2012

Если я попытаюсь получить доступ к одному из столбцов, в имени которых есть пробел, я получу сообщение об ошибке.

<cfoutput query="spreadsheetData">
   #start date#
</cfoutput>

Я тоже пробовал #[start date]#, но это не сработало. Я не могу контролировать формат листа Excel, который я получаю. Есть ли способ получить доступ к столбцам заголовков с несколькими словами?


person froadie    schedule 20.05.2012    source источник


Ответы (1)


При использовании записи в квадратных скобках содержимое должно заканчиваться строкой, поэтому:

<cfoutput query="spreadsheetData">
    #spreadsheetData['start date'][CurrentRow]#
</cfoutput>


Если вы не используете кавычки, вы передаете переменную, что делается так:

<cfset ColumnName = 'start date' />

<cfoutput query="spreadsheetData">
    #spreadsheetData[ColumnName][CurrentRow]#
</cfoutput>


Обратите внимание, что вы должны использовать имя запроса перед скобками - если вы просто пишете [ColumnName], то это запись создания встроенного массива, без доступа к переменной.

Кроме того, если вы используете это вне цикла запроса (т.е. не внутри cfoutput/cfloop с атрибутом запроса), вам также необходимо определить область действия переменной CurrentRow, т.е.

spreadsheetData[ColumnName][spreadsheetData.CurrentRow]

(или укажите свой собственный явный номер/переменную).


Как отмечает Ли ниже, для поведения, специфичного для cfspreadsheet, вы также можете указать атрибут columnnames, чтобы переименовать столбец во что-то непосредственно доступное, например.

<cfspreadsheet query=".." columnNames="Foo,Bar,StartDate,Etcetera" ..>
person Peter Boughton    schedule 20.05.2012
comment
В дополнение к ответу Питера имейте в виду, что вы также можете использовать атрибут columnNames для назначения разных имен столбцов, если хотите, например <cfspreadsheet query=".." columnNames="Foo,Bar,StartDate,Etcetera" ..>. - person Leigh; 20.05.2012
comment
@Peter - Когда я пробую ваш первый пример кода, я получаю сообщение об ошибке. Сложные типы объектов не могут быть преобразованы в простые значения. - person froadie; 20.05.2012
comment
@Peter - хотя этот код работает - <cfoutput query='spreadsheetData'>#spreadsheetData['start date'][currentRow]#</cfoutput>. Я бы хотел, чтобы был менее явный способ сделать это, хотя... - person froadie; 20.05.2012
comment
@Ли - спасибо! Хорошо знать, как это сделать. Я хочу, чтобы это было как можно более динамичным - например, столбцы могут быть в любом порядке, и мы можем просто получить доступ по имени - person froadie; 20.05.2012
comment
@froadie - Да, для динамических случаев Питер - лучший общий / общий ответ. FYI, IIRC, вам всегда нужно использовать номер строки при использовании запросов и скобок, т.е. #query["column"][row]#, независимо от того, находитесь ли вы в цикле запроса или нет. - person Leigh; 21.05.2012
comment
Извините, дружище, это одна из странных особенностей/ошибок ACF — выполнение query.col работает, но выполнение query['col'] требует номера строки. Так как сейчас я работаю на 99% с Railo (где скобки и точка не отличаются друг от друга), я забыл об этом. - person Peter Boughton; 21.05.2012
comment
(Только что обновил/исправил ответ и добавил информацию, предоставленную Ли об атрибуте columnNames.) - person Peter Boughton; 21.05.2012