Доступ к электронной таблице Excel с C# иногда возвращает пустое значение для некоторых ячеек

Вы можете сделать это следующим образом:

>>> sorted( ("A","a","b","B","CC","c"), key=lambda x: (x.lower() + str(x != x.lower()) ,x) )
['a', 'A', 'b', 'B', 'c', 'CC']

Это работает, сравнивая строчную версию буквы с фактической буквой. Если в нижнем регистре есть совпадение, то str(x != x.lower() будет 0, в противном случае 1.

11
задан Jonathan Leffler 7 September 2013 в 23:13
поделиться

6 ответов

ItemArray является Объектный массив. Таким образом, я предполагаю, что "столбец" в DataRow, что я пытаюсь сослаться, имеет текстовый объект.

1
ответ дан 3 December 2019 в 02:02
поделиться

Источник данных Excel выбирает тип столбца для всего столбца. Если одна из ячеек не соответствует тому типу точно, он оставляет пробелы как этот. У нас были проблемы, где наша машинистка вошла "8" (пространство перед числом, таким образом, Excel преобразовал его в строку для той ячейки) в числовом столбце. Это имело бы смысл мне, что это попробует методы.Net Parse, поскольку они более устойчивы, но я предполагаю, что это не то, как драйвер Excel работает.

Наша фиксация, так как мы использовали сервисы импорта базы данных, должна была зарегистрировать все строки, которые 'привели этот путь к сбою'. Затем мы вернулись к документу XLS и перепечатали те ячейки, чтобы гарантировать, что базовый тип был корректен. (Мы нашли, что просто удаление пространства не зафиксировало его - мы должны были Очистить целую ячейку сначала, чем перепечатывают '8'.) Чувствует hacky и не elagent, но это было лучшим методом, который мы нашли. Если драйвер Excel не может считать его в правильно отдельно, нет ничего, что можно сделать для получения тех данных из там, после того как Вы находитесь в .NET.

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

3
ответ дан 3 December 2019 в 02:02
поделиться

{} означает, что это - своего рода пустой объект и не строка. Когда Вы нависаете над объектом, необходимо смочь видеть его тип. Аналогично при использовании quickwatch для просмотра доктора ["..., "] необходимо видеть тип объекта. Какой тип является объектом, который Вы получаете?

1
ответ дан 3 December 2019 в 02:02
поделиться

Для совместимости VISTA можно использовать драйвер EXCEL 12.0 в строке подключения. Это должно решить Ваш вопрос. Это действительно взрывало.

1
ответ дан 3 December 2019 в 02:02
поделиться

Решение:

Строка подключения:

Provider = Microsoft.Jet.OLEDB.4.0; Источник данных = FilePath; Расширенный Properties = "Excel 8.0; HDR = Yes; IMEX = 1";

  1. HDR = Yes; указывает, что первая строка содержит имена столбцов, а не данные. HDR = Нет; указывает на обратное.

  2. IMEX = 1; указывает драйверу всегда читать «смешанные» (числа, даты, строки и т. Д.) Столбцы данных как текст. Обратите внимание, что этот параметр может отрицательно повлиять на доступ к записи в Excel.

Синтаксис SQL SELECT * FROM [sheet1 $] . Т.е. имя рабочего листа Excel, за которым следует $ и заключенное в квадратные скобки [ ] .

Важно:

  • Проверьте [HKEY_LOCAL_MACHINE \ SOFTWARE \ Microsoft \ Jet \ 4.0 \ Engines \ Excel] находится в реестре REG_DWORD "TypeGuessRows". Это ключ к тому, чтобы не позволять Excel использовать только первые 8 строк для определения типа данных столбца. Установите это значение на 0, чтобы сканировать все строки. Это может снизить производительность.

  • Если книга Excel защищена паролем, вы не сможете открыть ее для доступа к данным, даже если в строке подключения укажите правильный пароль. Если вы попытаетесь, вы получите следующее сообщение об ошибке: «Не удалось расшифровать файл».

26
ответ дан 3 December 2019 в 02:02
поделиться

Решение:

  1. Вы указываете HDR = Нет, чтобы первая строка не считалась заголовком столбца. Строка подключения: Provider = Microsoft.Jet.OLEDB.4.0; Data Source = FilePath; Extended Properties = «Excel 8.0; HDR = No; IMEX = 1»;
  2. Вы игнорируете первую строку и получаете доступ к данным любым способом вы хотите (DataTable, DataReader и т. д.). Вы получаете доступ к столбцам по числовым индексам, а не по именам столбцов.

У меня это сработало. Таким образом, вам не нужно изменять регистры!

1
ответ дан 3 December 2019 в 02:02
поделиться
Другие вопросы по тегам:

Похожие вопросы: