2013-05-02 2 views
1

Я даю моему клиенту шаблон, который они должны заполнить, а затем они загружают электронную таблицу, и я прочитал файл с cfspreadsheet, чтобы скопировать данные в таблицу базы данных.ColdFusion CFSpreadsheet читает пустые ячейки

Довольно легко. Шаблон содержит только один столбец. Клиент не может загрузить лист с более чем одним столбцом в нем. Это работало.

Так заголовок один столбец ING_CAS, но когда я прочитал файл с cfspreadsheet я COL_2, COL_3, ING_CAS. Таким образом, не только чтение чистых ячеек, им также присваиваются имена по умолчанию из-за этого атрибута headerrow="1".

Я в затруднении здесь. Я продолжаю загружать шаблон и выбирать посторонние пустые строки и столбцы и удалять их, но у меня нет контроля над файлом, как только клиент получит его.

Есть ли какие-то странные настройки, которые у меня отсутствуют, что сделает cfspreadsheet игнорировать пустые ячейки?

<cfspreadsheet action="read" src="#theFile#" query="SpreadSheetData" headerrow="1"> 
<cfdump var="#SpreadSheetData#" /> 

В итоге я написал вспомогательную функцию, которая удалила столбцы COL_ (n).

<cffunction name="CleanExcelQuery" access="public" returntype="query" output="false" hint="Strips out blank column headers picked up on read."> 
    <cfargument name="SpreadSheetQuery" type="query" required="true" /> 

    <cfset var theColumnHeaders = SpreadSheetQuery.columnList> 
    <cfset var theNewColumnHeaders = ""> 

    <cfloop list="#theColumnHeaders#" index="h"> 
     <cfif uCase(left(h, 4)) IS NOT "COL_"> 
      <cfset theNewColumnHeaders = ListAppend(theNewColumnHeaders, h)> 
     </cfif> 
    </cfloop> 

    <cfquery name="newSpreadSheetQuery" dbtype="query"> 
     Select #theNewColumnHeaders# 
     From SpreadSheetQuery 
    </cfquery> 

    <cfreturn newSpreadSheetQuery /> 
</cffunction> 
+0

Вы можете показать нам свой код 'cfspreadsheet'? Я считаю, что он должен игнорировать пустые ячейки по умолчанию, иначе вся пустая таблица будет читаться каждый раз. Вы уверены, что ячейки пустые и не заполнены каким-то «невидимым» персонажем. Работает ли он так, как ожидалось, когда вы выбираете пустые строки и столбцы, а затем удаляете? –

+0

звучит как ваш xls (x) имеет ячейки, которые объединены и центрированы, и он помещает ing_cas в col_3. попробуйте восстановить шаблон с помощью ing_cas в A1 и данных в A2 и загрузить эту новую таблицу. – Travis

+0

Вы пытались просто скопировать значения из вашей «грязной» таблицы в новый файл, сохранить его и опубликовать? У меня была проблема, когда у клиента был какой-то странный характер выхода из диапазона просмотра и взорвал электронную таблицу. – steve

ответ

1

cfspreadsheet пропускает только клетки, которые полностью пустым: нет значения или формат (например, при выборе ячейки и использовать «все ясно»). Если он собирает «дополнительные» столбцы, это связано с тем, что одна или несколько ячеек в этом столбце имеют значение или формат пользовательских ячеек. Это означает, что они не являются «пустыми».

Если вы знаете позицию столбца, вы можете использовать атрибут columns только читать только значения в этом столбце. Например, чтобы прочитать колонку C:

<cfspreadsheet action="read" 
      src="c:/path/to/file.xls" 
      columns="3" 
      headerrow="1" 
      query="qResult" /> 

Но я не уверен, я понимаю, почему это является проблемой. Если вам нужен только один столбец, просто игнорируйте остальные столбцы в коде. Можете ли вы объяснить, почему это вызывает проблему?

+0

Мое непосредственное обходное решение состояло в том, чтобы игнорировать все, кроме одного столбца, который мне нужен. Но проблема возникает, когда пользователь-администратор выполняет ту же функцию, и мы разрешаем иметь более одного столбца. Все эти данные хранятся в вертикальной таблице, поэтому мы в основном берем любые заголовки столбцов, которые они помещают в электронную таблицу. И да, я согласен, что я знаю, что ясное все на самом деле очищает лист распространения, но, к сожалению, наши пользователи не настолько разбираются в технологиях и пытаются объяснить этот процесс им, это не самая легкая вещь в мире. –

+0

Если у вас разные уровни доступа пользователей, я предполагаю, что есть вход/сеансы. Вы должны иметь возможность использовать переменные сеанса для применения разных правил в зависимости от того, имеет ли пользователь доступ к «admin». RE: * К сожалению, наши пользователи не так проворны в технике * Да, я не предлагал вам, чтобы пользователи очищали ячейки. Я просто привел пример того, что означает «пустая» ячейка в Excel. – Leigh

+0

Да, так я определяю, разрешаю ли я иметь более одного столбца ... роли и разрешения в области сеанса. Но теперь пользователи-администраторы получают пустые столбцы в своих загрузках. См. Мои комментарии выше ... эти данные хранятся в вертикальной таблице, и все столбцы заголовков cfspreadsheet find вставлены в вертикальную таблицу, поэтому COL_1, COL_2 COL_3 .... –

0

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

<cfspreadsheet action="read" src="#path#" query="data" headerrow="1" excludeHeaderRow = "true" columns = "1-5" > 

Приведенный выше код считывает столбцы с 1 по 5. Вы можете также использовать решение Leigh, чтобы прочитать первые 3 колонки или вы можете сделать что-то вроде columns=1,3,6 (если я правильно помню) для чтения из пользовательского диапазона

Часть columns читает только те столбцы, которые вы хотите прочитать, не перескакивая. Я использовал это для чтения файлов, которые поступают от наших клиентов, и обычно я получаю несколько столбцов, которые не являются «пустыми» из-за их формата.

Вы также можете проверить документацию Cf для cfspreadsheet, чтобы увидеть, какие другие записи поддерживает опция «column».

+0

Я мог ошибаться, но у меня создается впечатление, что количество строк и позиций столбцов может меняться. Если это так, то и «столбцы», и «строки» отсутствуют, потому что для этого, очевидно, требуется знание диапазона раньше времени. Если «разрешенные» имена заголовков были сохранены в таблице db, то использование «столбцов» может быть возможно. Но если ничего не исправлено, их текущее решение может быть таким же хорошим, как и в случае ... – Leigh

Смежные вопросы