Excel открыть файл для чтения

Чтение Excel-файлов в Perl

Оригинал: Reading Native Excel Files in Perl Автор: Mike Diehl Дата: 2 сентября 2008 Перевод: Александр Тарасов aka oioki Дата перевода: 9 декабря 2008

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

Очевидно, что мы храним здесь имя, первую букву отчества, фамилию и телефонный номер. Но такой формат не очень хорош для хранения сведений о сыне моего друга, его зовут John Q. Public, Jr:

Возможно, формат с разделением полей табами был бы более удобен:

Но так кажется лишь на первый взгляд. При вводе данных я ошибся и напечатал после имени не таб, а пробел. Вы его видите? Нет, и я тоже, но он есть и в дальнейшем обязательно приведет к некорректной работе обрабатывающей эти данные программы.

Так что хранить данные в формате Excel — хороший выбор. Вам может показаться, что я преувеличиваю, но у одного моего клиента постоянно возникали именно такие проблемы, это не шутка. Поэтому я решил пользоваться форматом Excel для ввода и вывода данных. Это было удобно для моего клиента, ведь он был знаком с обработкой данных в Excel, а я мог протестировать скрипты в OpenOffice Calc.

В этой статье будет приведен пример сценария, демонстрирующего возможности использования Perl-модуля Spreadsheet::ParseExcel.

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

Знаю, varchar(50) на имя ребенка и его школу — возможно, многовато. Обратите внимание на поле code типа char(6). В этом поле будет храниться цветовая информация, в шестнадцатиричном формате RRGGBB.

Нужно сохранить этот код в html-файл куда-нибудь на веб-сервер. Тогда нашим пользователям будет достаточно открыть нужный URL-адрес с формой в веб-браузере, и они смогут загружать туда свои данные из файлов Excel в нашу базу данных.

Кажется, все нормально, но столбцы перемешаны. Для школы A столбцы расположены в другом порядке, нежели для школы B. Лучше решать эту неувязку в нашей программе, чем заставлять пользователей что-либо править. В общем, у нас есть данные для школ A и B. Очевидно. что один из наших учеников — отличник (средняя оценка A), а другой — двоечник (оцена F). Остальных можно назвать нормальными учениками.

Эта программа достаточно сложна, поэтому будем разобъем ее на части и рассмотрим их отдельно.

Как вы видите, этот код почти такой же, как и в программе из предыдущей статьи. Я не пользуюсь опциями Perl «-w» или «use strict», потому что эта программа работает и выдает правильный результат, и мне неинтересно, что какие-то переменные неинициализированы и т.п. вещи; меня интересуют лишь результаты работы программы.

В данном случае конструктору объекта Spreadsheet::ParseExcel передается идентификатор файла из объекта CGI.

В этом куске кода мы запускаем цикл по всем листам рабочей книги. Затем в каждом листе мы ищем, в каком столбце хранятся имена (строка «Name»), а в каком номера телефонов (строка «Phone»). Теперь мы знаем, где хранятся наши данные, мы готовы к обработке данных.

В этом блоке пробегаем по всем строкам, так же, как мы пробегали до этого по столбцам. Естественно, в этот раз мы пропускаем заголовок таблицы. Затем мы считываем через объекта $sheet содержимое ячеек: имя ученика в переменную $child_name, номер телефона — в $child_phone. Затем получаем название школы $child_school из названия листа.

Далее, вставляем данные в базу данных.

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

Результат выполнения запроса select * from children; следующий:

Это именно то, что мы ожидали.

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