ColdFusion CFSpreadsheet читает пустые ячейки

Я даю своему клиенту шаблон, который он должен заполнить, а затем он загружает электронную таблицу, и я читаю файл с помощью 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>

person Joe Simes    schedule 02.05.2013    source источник
comment
Можете ли вы показать нам свой код cfspreadsheet? Я считаю, что по умолчанию он должен игнорировать пустые ячейки, иначе каждый раз будет считываться вся пустая таблица. Вы уверены, что ячейки пусты и не заполнены каким-то невидимым символом. Работает ли он должным образом, когда вы выбираете пустые строки и столбцы, а затем удаляете?   -  person Miguel-F    schedule 02.05.2013
comment
похоже, что ваш xls (x) имеет ячейки, которые объединены и центрированы, и он помещает ing_cas в col_3. попробуйте перестроить шаблон с ing_cas в A1 и данными в A2 и загрузить эту новую электронную таблицу.   -  person Travis    schedule 02.05.2013
comment
Вы пытались просто скопировать значения из своей грязной электронной таблицы в новый файл, сохранить его и опубликовать? У меня была проблема, когда у клиента был какой-то странный символ за пределами диапазона просмотра, и таблица взорвалась.   -  person steve    schedule 02.05.2013
comment
Стив, будучи технарем, я могу прочитать сообщение об ошибке и скопировал хороший столбец в новую электронную таблицу, сохраненную и загруженную, и она работала нормально. Конечные пользователи не очень. И, честно говоря, я дал им пустой шаблон, поэтому они говорят, что в моем шаблоне есть скрытые данные или что-то в этом роде. Там определенно нет скрытых символов. Я думаю, что столбцы читаются как грязные, если вы не выберете все и не очистите содержимое.   -  person Joe Simes    schedule 02.05.2013
comment
Вместо того, чтобы загружать файл, почему бы им не вставить столбец в текстовую область?   -  person Dan Bracuk    schedule 02.05.2013


Ответы (2)


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

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

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

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

person Leigh    schedule 02.05.2013
comment
Мой немедленный обходной путь состоял в том, чтобы игнорировать все, кроме одного требуемого столбца. Но проблема возвращается, когда пользователь-администратор выполняет ту же функцию, и мы разрешаем иметь более одного столбца. Все эти данные хранятся в вертикальной таблице, поэтому мы в основном берем любые заголовки столбцов, которые они помещают в электронную таблицу. И да, я согласен, я знаю, что очистка всего на самом деле очищает электронную таблицу, но, к сожалению, наши пользователи не настолько разбираются в технологиях, и пытаться объяснить им этот процесс - не самая простая вещь в мире. - person Joe Simes; 02.05.2013
comment
Если у вас есть разные уровни доступа пользователей, я предполагаю, что задействован логин/сеансы. Вы должны иметь возможность использовать переменные сеанса для применения различных правил в зависимости от того, имеет ли пользователь права администратора. RE: к сожалению, наши пользователи не очень разбираются в технологиях Да, я не предлагал пользователям очищать ячейки. Я просто привел пример того, что означает пустая ячейка в Excel. - person Leigh; 02.05.2013
comment
Да, именно так я определяю, разрешаю ли я вам иметь более одного столбца... роли и разрешения в области сеанса. Но пользователи-администраторы теперь получают пустые столбцы в своих загрузках. См. мои комментарии выше ... эти данные хранятся в вертикальной таблице, и любые заголовки столбцов, которые находит cfspreadsheet, вставляются в вертикальную таблицу, следовательно, COL_1, COL_2 COL_3 .... - person Joe Simes; 02.05.2013
comment
Выше я разместил свою функцию очистки, которая по существу удаляет столбцы COL_(n). Я больше надеялся на что-то, чего мне не хватало в cfspreadsheet, что заставило бы его игнорировать пустые столбцы. - person Joe Simes; 02.05.2013
comment
Нет, потому что они не на самом деле пусты. Для человека да, но не для Excel/POI, что имеет значение. Re: вертикальная таблица Не знаю, что это значит. Вы говорите, что заголовки электронных таблиц соответствуют именам столбцов в одной из таблиц вашей базы данных? Если да, то может есть лучший вариант. Но опять же, вам нужно будет опубликовать свою таблицу DDL. - person Leigh; 02.05.2013
comment
Вертикальная таблица имеет три поля ID, Label, Data... из электронной таблицы ING_CAS и COL_2, COL_3 переходят в поле Label, а фактические данные для каждой ячейки переходят в столбец Data. Действительно паршивый дизайн базы данных, по сути, в базе данных есть строка для каждой ячейки в электронной таблице, но так хочет босс. - person Joe Simes; 02.05.2013
comment
Да, это плохой дизайн, как с точки зрения производительности, так и с точки зрения целостности данных. Если заголовки электронной таблицы соответствуют столбцу таблицы или даже строке в отдельной таблице поиска: LabelID, LabelText), вы можете использовать запрос для поиска и проверки заголовков. - person Leigh; 02.05.2013
comment
Если есть возможность, стоит пересмотреть дизайн. Тем не менее, если нет механизма для проверки имен заголовков столбцов, то проверка на COL_X, вероятно, настолько хороша, насколько это возможно. Вы должны опубликовать свой окончательный код в качестве ответа. - person Leigh; 09.05.2013
comment
Я делаю ваш ответ ответом ... Я думаю, что ушел из этой компании, прежде чем сделать свой окончательный код ответом! :) - person Joe Simes; 09.01.2014

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

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

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

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

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

person Geo    schedule 03.05.2013
comment
Я могу ошибаться, но у меня сложилось впечатление, что количество строк и позиций столбцов может варьироваться. Если это так, то и columns, и rows выпадают, потому что это, очевидно, требует знания диапазона заранее. Если бы разрешенные имена заголовков хранились в таблице базы данных, то возможно использование columns. Но если ничего не исправить, то их текущее решение может быть настолько хорошим, насколько это возможно... - person Leigh; 06.05.2013