Валидация excel файла.

262 views
Skip to first unread message

denis kodua

unread,
Dec 26, 2011, 4:28:20 AM12/26/11
to dotne...@googlegroups.com
Доброго времени суток уважаемые участники группы =)

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

Эти строки и столбцы определяют облать(табличку) которую нужно экспортировать.



(шапка)
Например: 
ДАТА
ОТЧЕТА
ИСПОЛНИТЕЛЬ СТОЛБЦЫ ЗАГОЛОВКА СТРОКИ ЗАГОЛОВКА СТОЛБЦЫ ДАННЫХ СТРОКИ ДАННЫХ
Начало Конец Начало Конец Начало Конец Начало Конец
  ARM\VoronovDA B G 6 6 C G 7 7


в шапке сказано, что нужно взять следующую область (табличку) 
столбцы B, G строка 6 - это шапка таблицы, C, G строка 7 - это тело таблицы (шапка и тело по одной строчке)


(табличка: две строчки и шесть столбцов)
Общая площадь жилых помещений, приходящаяся в среднем на 1 жителя субъекта РФ, введенная в действие
2007 2008 2009 2010 2011(прогноз)
кв.м 0,5 0,41 0,32 0,32 0,42


Потом, на основе этих метаданных хранимая процедура понимает с какой областью данных ей работать. 
Хранимая процедура на основе таблички(выделенной в excel области) раскидывает данные в таблицы БД.

Мне нужно придумать механизм ваидации этой всей штуки.  Шапка задается хардкодом.
Т.е. первый столбей всегда должен быть "дата отчета" а шестой - всегда число показывающее последнюю строку таблицы.


У меня есть мысль хардкодом проверять что первый чтолбей - дата отчета(тупо проверять что там в  написано) и что данные кастятся к типу datatime и так проверять всю шапку, НО если данные заполнены не верно, например нужен столбец G а стоит H то тут хранимка либо упадет либо отработает без ошибок и никаких данных не зальет, а может и фигню какую нибудь зальет.

Пока ума не приложу как сделать валидацию, т.е. мне нужно выводить красивые сообщения о том какой косяк в листе документа....
Буду рад любому совету!
P.S. в аттаче файл который нужно валидировать.

МинСтрой_tmp.xlsx

denis kodua

unread,
Dec 27, 2011, 6:29:20 AM12/27/11
to dotne...@googlegroups.com
чуствую какая - то бркдовая это затея...

26 декабря 2011 г. 13:28 пользователь denis kodua <denis...@gmail.com> написал:

menozz

unread,
Dec 27, 2011, 6:38:06 AM12/27/11
to dotne...@googlegroups.com
Денис, может глянуть в сторону excel->xml->generate c# classes->validation?
Ничего конкретного, просто как идея...

Александр Деханд

unread,
Jan 20, 2012, 7:52:26 AM1/20/12
to dotne...@googlegroups.com
Решал подобную задачу. Остановил выбор на Linq to XML. Получал всю информацию из Excel (с использованием условий отбора) и проверял на адекватность. Еще есть вариант Connection to Excel using Jet Engine

Eskat0n

unread,
Jan 20, 2012, 8:42:30 AM1/20/12
to dotne...@googlegroups.com
Всем привет!

Я бы сказал, что для решения задачи, означенной Денисом, API, предоставляемый LinqToXml, является весьма низкоуровневым, что увеличивает объем, требуемого к написанию кода. Поэтому я бы порекомендовал посмотреть в сторону использования OpenXML, который, используя LinqToXml, позволяет работать с объектной моделью xlsx-документа более высокого уровня. В сети существует множество примеров по работе с OpenXML, также небольшой пример работы с электронными таблицами Excel можно найти в исходном коде, поддерживаемой нами библиотеки Foxby.

Что касается использования Excel-файла как Data source (через Jet или же ODBC), то на мой взгляд такой подход, скорее всего, не подойдет для решения означенной проблемы, т.к. оперирование данными в электронной таблицы должно опираться на индексы столбцов/строк, что невозможно при работе с файлов как с источником данных. Возможно, в этом суждении я могу ошибаться, т.к. плотно не работал с подобным подходом.

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

20 января 2012 г. 18:52 пользователь Александр Деханд <de...@nm.ru> написал:

Решал подобную задачу. Остановил выбор на Linq to XML. Получал всю информацию из Excel (с использованием условий отбора) и проверял на адекватность. Еще есть вариант Connection to Excel using Jet Engine



--
Eskat0n, lead software developer at IndyCode – www.indycode.ru
You can find my contacts and portfolio at following site – http://muyou.koumakan.jp/

denis kodua

unread,
Jan 20, 2012, 12:54:30 PM1/20/12
to dotne...@googlegroups.com
ух ты круто!!! я видел инфу про OpenXML но  он мне показался трудным и как следствие долгим, но сейчас время есть, начну ковырять!

20 января 2012 г. 17:42 пользователь Eskat0n <muyo...@gmail.com> написал:

Евгений Сверчков

unread,
Jan 20, 2012, 3:03:09 PM1/20/12
to dotne...@googlegroups.com

Я тоже недавно задался вопросом чтения из ексел файла. Выбрал linqtoexcel. Можно настроить маппинг к обьектам. И файлы в старом формате xls поддерживаются. Много перебрал библиотек. Все мне не подошли так как не могли читать быстро большие файлы. А вот linqtoexcel просто доволен.

20.01.2012 23:54 пользователь "denis kodua" <denis...@gmail.com> написал:
Reply all
Reply to author
Forward
0 new messages