Вы можете сделать это следующим образом:
>>> 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
.
ItemArray является Объектный массив. Таким образом, я предполагаю, что "столбец" в DataRow, что я пытаюсь сослаться, имеет текстовый объект.
Источник данных Excel выбирает тип столбца для всего столбца. Если одна из ячеек не соответствует тому типу точно, он оставляет пробелы как этот. У нас были проблемы, где наша машинистка вошла "8" (пространство перед числом, таким образом, Excel преобразовал его в строку для той ячейки) в числовом столбце. Это имело бы смысл мне, что это попробует методы.Net Parse, поскольку они более устойчивы, но я предполагаю, что это не то, как драйвер Excel работает.
Наша фиксация, так как мы использовали сервисы импорта базы данных, должна была зарегистрировать все строки, которые 'привели этот путь к сбою'. Затем мы вернулись к документу XLS и перепечатали те ячейки, чтобы гарантировать, что базовый тип был корректен. (Мы нашли, что просто удаление пространства не зафиксировало его - мы должны были Очистить целую ячейку сначала, чем перепечатывают '8'.) Чувствует hacky и не elagent, но это было лучшим методом, который мы нашли. Если драйвер Excel не может считать его в правильно отдельно, нет ничего, что можно сделать для получения тех данных из там, после того как Вы находитесь в .NET.
Просто другой случай, где Office скрывает важные детали от пользователей от имени простоты и поэтому создание его более трудный, когда необходимо быть точными для использования питания.
{} означает, что это - своего рода пустой объект и не строка. Когда Вы нависаете над объектом, необходимо смочь видеть его тип. Аналогично при использовании quickwatch для просмотра доктора ["..., "] необходимо видеть тип объекта. Какой тип является объектом, который Вы получаете?
Для совместимости VISTA можно использовать драйвер EXCEL 12.0 в строке подключения. Это должно решить Ваш вопрос. Это действительно взрывало.
Решение:
Строка подключения:
Provider = Microsoft.Jet.OLEDB.4.0; Источник данных = FilePath; Расширенный Properties = "Excel 8.0; HDR = Yes; IMEX = 1";
HDR = Yes;
указывает, что первая строка содержит имена столбцов, а не данные. HDR = Нет;
указывает на обратное.
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 защищена паролем, вы не сможете открыть ее для доступа к данным, даже если в строке подключения укажите правильный пароль. Если вы попытаетесь, вы получите следующее сообщение об ошибке: «Не удалось расшифровать файл».
Решение:
У меня это сработало. Таким образом, вам не нужно изменять регистры!