Из чего состоит файл эксель

Обновлено: 04.07.2024

Сразу хочется сделать несколько замечаний.

Первое. В основном говорить буду про то, с чем сталкивался лично. Претензий на стопроцентное знание «изнанки» формата у меня нет.

Второе. Как многие, вероятно, знают, файлы MS Office 2007 и выше представляют собой архив, который можно открыть с помощью любого архиватора (WinRAR, 7zip и так далее).

Третье. «Под капотом» у этих файлов — в основном XML-разметка, гордо именуемая OOXML или просто OpenXML. Поэтому, в принципе, для понимания принципов редактирования файлов «руками» достаточно будет Блокнота (или, что удобнее, Notepad++).

Итак, начнем с формата MS Excel как наиболее употребимого для генерации всевозможных отчетов, выгрузок из БД и иже с ними.

Когда имеешь дело с форматом .XLSX, на каждый вопрос «почему оно реализовано… так?» следует отвечать: «того требовала оптимизация». Когда Microsoft расширили допустимый размер листа до неприличного с точки зрения наблюдателя (около миллиона строк и 16 тысяч с хвостиком столбцов), они понимали, что найдутся маньяки, которые все это забьют данными под завязку. А через это, если подходить к хранению данных «в лоб», то даже все возрастающих мощностей ПК не хватит ни при каких условиях. Следовательно, надо сделать так, чтобы объем хранимых данных был меньше, чем объем данных в книге. Как это сделать? Забегая вперед: например, исключить дубликаты строк.

Первый интересующий нас файл — %file%/xl/workbook.xml. Основное его назначение — манифест, то есть перечень листов, из которых наша книга Excel, собственно, и состоит.
Выглядит этот перечень, к примеру, так:


Это значит, что в книге 4 листа, и их имена указаны в атрибутах name. Каждому тегу должен соответствовать файл в папке %file%/xl/worksheets. Excel сам знает, как должны называться эти файлы и при попытке их переименовать, сочтет всю книгу поврежденной.

Еще в папке %file%/xl нас интересует файл styles.xml.

Как нетрудно догадаться, здесь хранится информация об оформлении ячеек. Причем в угоду оптимизации, хранится она в достаточно интересном виде. Файл состоит из следующих секций:


Как можно понять, здесь перечислены только уникальные стили оформления текста, использованные в книге. Каждый тег — один стиль. Вложенные теги — особенности стиля, такие как полужирное написание (тег <b/>), кегль (<sz/>) и другие.

2. Заливка ячеек:


Как видно, первый вариант — без заливки вообще, а второй — сплошная заливка библиотечного цвета «gray125».


Как видно, одно наименование здесь состоит из пяти элементов, 4 основных границы и диагональная, то есть все то, что можно настроить через GUI самого Excel.


А вот здесь надо объяснить подробнее. Когда в файле листа мы будем указывать стиль ячейки, мы будем ссылаться как раз на эту секцию. Каждый тег <xf />, представляющий собой один стиль, является собранием ссылок на предыдущие секции, то есть он сам по себе не содержит объявления шрифта, границ и заливки. Рассмотрим интересные атрибуты ближе:

В продолжение темы, начатой в предыдущей статье, хочу поделиться своим опытом экспорта данных, в частности, в формате XLSX.


Итак, кому интересно, как заполнить XLSX без больших и сложных библиотек, прошу под кат.

Недавно передо мной возникла задача экспортировать непредсказуемый по размеру объем табличных данных в формате XLSX. Как любой здравомыслящий программист, первым делом полез искать готовые решения.
Почти сразу наткнулся на библиотеку PHPExcel. Мощное решение, с кучей разных функций и возможностей. Порывшись еще немного нашел отзывы программистов о ней. В частности, на форумах встречаются жалобы на скорость работы и отказ работать с большим объемом данных. Отметил библиотеку как один из вариантов решения и начал искать дальше.
Находил еще несколько библиотек для работы с XLSX, но все они были или забытыми, т.к. не обновлялись по 2-3 года, или обязательно тянули за собой сторонние библиотеки, или использовали DOM для работы с файлами, что мне не очень нравилось. Каждый раз, натыкаясь на очередную библиотеку и изучая механизмы ее работы, ловил себя на мысли, что все это «из пушки по воробьям». Не нужно мне такое сложное решение!
Признаюсь честно, изучив поверхностно каждое из найденных решений, не стал ставить и тестировать ни одного. Мне нужно было более простое и надежное, как танк, решение.

Задача

  • Оформить экспортирующий механизм в виде автономного класса
  • Реализовать в классе набор функций для записи значений ячеек и ряда
  • Возможность работы с неограниченным объемом данных
  • Распаковка и упаковка XLSX.

Реализация

Изначально очень хотел создавать все файлы, из которых состоит XLSX, кодом, но, к счастью, быстро понял бессмысленность своей идеи. И родилось иное, более правильно и простое решение. Надо с помощью Microsoft Excel создать файл XLSX в таком виде, в каком он нужен в итоге, но без данных, иными словами — шаблон, а потом, с помощью кода, только добавить данные!
В таком случае, класс должен будет распаковывать шаблон в отдельный каталог, вносить изменения в /xl/worksheets/sheet1.xml и упаковывать содержимое каталога обратно в XLSX.

В объявлении класса присутствуют публичные переменные:
$templateFile – имя файла шаблона
$exportDir – папка, в которую будет распакован шаблон, разумеется с необходимыми правами доступа.

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

Обеспечить скорость работы и возможность работы с большим объемом данных позволяют функции resetRow и flushRow. Они отвечают за очистку текущего ряда в памяти и запись текущего ряда на диск.
А вот сохранение значений ячеек с разными типами оказалось не такой простой задачей.

Запись строки

Казалось бы, что сложного записать строковое значение в файл. Однако, в XLSX все не так просто. Все строки внутри XLSX хранятся в отдельном файле /xl/sharedStrings.xml. В ячейки записываются не строковые значения, а их порядковые номера — индексы. Разумное решение с точки зрения сокращения размера файла.

Но такое решение неудобно с точки зрения программного заполнения шаблона. Если выполнять указанное требование, то мне бы пришлось выполнять отдельный проход по всем строковым значениям в массиве данных, исключать повторяющиеся, сохранять их в sharedStrings.xml, проиндексировать и вместо значений в исходном массиве вписать их индексы. Медленно и неудобно.

Оказывается, можно обойти требование и сохранять строковые значения ячеек прямо в ячейках. Но в этом случае формат записи будет иной:

Запись числа

Никаких сложностей с записью целых или дробных чисел не возникло. Все просто:

Запись даты и времени

Дата и время хранятся в виде количества секунд прошедших с 01.01.1970 поделенных на количество секунд в сутках. Причем, в вычислении допущена ошибка с определением високосного года. В общем, не вдаваясь в подробности, которые несложно найти в сети, чтобы корректно вычислять дату пришлось объявить в классе две константы:
ZERO_TIMESTAMP – смещение даты в формате Excel от UNIX_TIMESTAMP
SEC_IN_DAY – секунд в сутках.
После вычисления значения даты и времени, целая часть дроби – это дата, дробная часть – время:


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

Применение

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


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

Начиная с версии 2007 в Excel используется XML-формат, на основе которого создаются рабочие книги, шаблоны и надстройки. Фактически эти файлы представляют собой ZIP-архивы. При необходимости они могут быть разархивированы и просмотрены.[1] В версиях, предшествующих Excel 2007, применялся двоичный файловый формат. И, хотя спецификации этого формата известны, работать с двоичными файлами совсем непросто. С другой стороны, файловый XML-формат относится к категории так называемых открытых форматов. Подобные файлы могут создаваться и обрабатываться с помощью любых программ, не относящихся к Office 2010.

В качестве примера используется файл с поддержкой макросов Excel (XLSM). Он состоит из одного рабочего листа, одного листа диаграммы и простого макроса на языке VBA. Рабочий лист включает таблицу, кнопку (из группы элементов управления Формы), рисунок Smart Art, а также фотографию цветка (рис. 1).


Рис. 1. Пример листа рабочей книги

Структура Excel-файлов

Для просмотра «внутренностей» файла Excel откройте Проводник Windows и добавьте расширение ZIP к файлу. После этого файл sample.xlsm будет переименован в sample.xlsm.zip. Затем можно открыть этот файл с помощью встроенного в Windows архиватора (рис. 2). Если вы установите архиватор 7-zip, то сможете открывать файлы Excel непосредственно, не переименовывая их (рис. 3).


Рис. 2. Структура каталогов файла рабочей книги при просмотре во встроенном архиваторе Windows; чтобы увеличить изображение кликните на нем правой кнопкой мыши и выберите Открыть картинку в новой вкладке


Рис. 3. Непосредственное открытие файла Excel, как архива в 7-zip

Первое, что бросается в глаза при просмотре файла (см. рис. 2), — это наличие структуры каталогов. Почти все используемые файлы являются текстовыми XML-файлами. Их можно просматривать в окне текстового редактора, XML-редактора, веб-браузера либо даже в окне Excel. На рис. 4 показано содержимое такого файла, просматриваемого в окне браузера Microsoft Edge. Файлы формата, отличного от XML, включают графические файлы и VBA-проекты (хранятся в двоичном формате).


Рис. 4. Просмотр XML-файла в окне веб-браузера

Рассматриваемый XML-файл (см. рис. 2) включает три корневые папки; некоторые из них включают подпапки. Обратите внимание, что многие папки включают папку _rels. Здесь находятся XML-файлы, которые определяют связи с другими компонентами пакета.

Папки, входящие в состав файла рабочей книги sample.xlsm (см. рис. 2).

  • Здесь можно найти сведения о связях в пакете.
  • XML-файлы, которые описывают свойства файла и настройки приложения.
  • Эта папка является «сердцем» файла. Ее имя изменяется в зависимости от типа документа Office (xl, ppt, word и т.д.). Здесь находится несколько XML-файлов, содержащих настройки для рабочей книги. Если в состав рабочей книги включен VBA-код, он будет находиться в двоичном файле с расширением BIN. Эта папка включает несколько подпапок (количество подпапок изменяется в зависимости от выбранной рабочей книги):
  • Здесь находится XML-файл для каждой диаграммы, включающий описание ее настроек.
  • Здесь содержится XML-файл, включающий данные для каждого листа диаграммы в рабочей книге.
  • Здесь находятся XML-файлы, в которых содержится описание диаграмм (рисунков SmartArt) в рабочей книге.
  • Здесь содержится XML-файл, включающий данные для каждого «рисунка». Здесь под этим термином подразумеваются кнопки, диаграммы и изображения. Любопытно, что иногда такое содержимое является мусорным. Удаляю эту папку, мы удаляем весь мусор. Правда, может пострадать и ценная информация. Подробнее см. Excel «тормозит». Что делать? Дубль 2.
  • Здесь содержатся внедренные медиаклипы, например, GIF- и JPG-файлы.
  • Включает XML-файл, содержащий данные для каждой таблицы.
  • Содержит XML-файл, включающий данные о теме рабочей книги.
  • Включает XML-файл для каждого рабочего листа в книге.

Любопытно, что добавление расширения ZIP к файлу Excel, не мешает открытию его в Excel, поскольку работа этой программы не зависит от расширения открываемого файла. Также можно сохранить рабочую книгу с расширением ZIP. Для этого в диалоговом окне Сохранение документа добавьте расширение ZIP и заключите имя файла в двойные кавычки, например, “Пример.xlsx.zip”.

Почему файловый формат столь важен

«Открытые» файловые XML-форматы, появившиеся в Microsoft Office 2007, представляют собой огромный шаг вперед, важный для всего компьютерного сообщества. Самое главное — рабочие книги Excel в этих форматах относительно легко считывать и записывать посредством ряда программ, отличных от Excel. Например, вполне возможно написать такую программу, которая будет изменять тысячи рабочих книг Excel, причем сама программа Excel не потребуется. Подобная программа может вставлять новые рабочие листы в каждый такой файл.


Рис. 5. Программа Excel может сама «отремонтировать» поврежденный файл рабочей книги

Кроме того, размер заархивированного XML-файла зачастую меньше размера соответствующего двоичного файла. И еще одно преимущество заключается в том, что структурированная природа файла позволяет извлекать отдельные его элементы (например, графику). Как правило, у пользователя Excel не возникает потребности в просмотре либо изменении XML-компонентов файла рабочей книги. Но если вы являетесь разработчиком, то вам придется создавать код, который изменяет компоненты пользовательского «ленточного» интерфейса Excel. При этом следует хотя бы поверхностно знать структуру XML-файла рабочей книги.

Файл OfficeUI

В файле Excel.officeUI сохраняются результаты изменений, внесенных на панель быстрого доступа и ленту. Этот XML-файл можно найти в следующей папке: C:\Users\<имя_пользователя>\AppData\Local\Microsoft\Office

Если вы не нашли в этой папке такого файла, это означает, что вы не изменяли в Excel, ни ленту, ни панель быстрого доступа, установленные по умолчанию. Добавьте любую команду на панель быстрого доступа, и файл появится. Причем изменения вносятся в файл незамедлительно, еще до закрытия Excel. Для просмотра файла Excel.officeUI можно воспользоваться редактором XML-кода, веб-браузером или Excel. Выполните следующие действия.

  1. Создайте копию файла Excel.officeUI.
  2. Добавьте расширение XML к копии файла, в результате чего название файла примет вид Excel.officeUI.xml.
  3. Перейдите в Excel, выполните команду Файл –> Открыть.
  4. Отобразится диалоговое окно, включающее ряд параметров; выберите XML-таблица.

На рис. 6 показан импортированный файл Excel.officeUI.xml. В рассматриваемом примере на панель быстрого доступа добавлено пять команд (строки 3, 8, 9, 12, 13).


Рис. 6. Просмотр файла данных Excel.officeUl.xml в Excel

Один и тот же файл Excel.OfficeUI может применяться несколькими пользователями одновременно. Например, панель быстрого доступа нетрудно снабдить двумя-тремя десятками полезных инструментов, а ленту — несколькими полезными вкладками, включающими ряд пользовательских групп. Если подобная обновленная панель произведет впечатление на ваших коллег, просто передайте им копию файла Excel.OfficeUI и расскажите, куда ее нужно скопировать. Учтите, что в случае копирования переданной вами копии поверх существующего файла Excel.OfficeUI все изменения, ранее внесенные в интерфейс пользователя, будут утеряны.

Файл XLB

Программа Excel хранит настройки панелей инструментов и меню в файле с расширением XLB. Даже несмотря на то, что Excel 2010 (и более поздние версии) официально не поддерживает панели инструментов и меню так, как в предыдущих версиях, файл XLB по-прежнему используется. Если вы не можете его найти, значит, программа до сих пор не сохранила ни одно из пользовательских меню или панелей инструментов. В момент закрытия Excel 2010 текущая конфигурация панелей инструментов сохраняется в файле Excel14.xlb (в версии 2013 г. – в файле Excel15.xlb). Этот файл (обычно) находится в следующем каталоге: C:\Users\<имя_пользователя>\AppData\Roaming\Microsoft\Excel

Этот двоичный файл содержит сведения о положении и видимости всех пользовательских панелей инструментов и меню, а также изменения, которые были добавлены во встроенные панели инструментов и меню.

Файлы надстроек

Надстройка фактически является рабочей книгой Excel, имеющей некоторые особенности:

  • Значение свойства рабочей книги IsAddin равно Истина. Это означает, что надстройка может быть загружена и выгружена с помощью диалогового окна Надстройки.
  • Эта рабочая книга скрыта, причем подобное состояние не может изменяться пользователем. Следовательно, надстройка никогда не может быть активной рабочей книгой.
  • Если вы работаете с VBA, имейте в виду, что надстройка не входит в коллекцию Workbooks.

Для получения доступа к диалоговому окну Надстройки выберите команду Файл –> Параметры. Выберите раздел Надстройки в левом списке, выберите пункт Надстройки Excel, и щелкните на кнопке Перейти (рис. 7). Альтернативные методы. Если в рабочем окне Excel отображается вкладка Разработчик, перейдите на нее, и кликните Надстройки. И, наконец, если установлена вкладка Разработчик, можно воспользоваться комбинацией клавиш: нажмите и удерживайте клавишу Alt, последовательно нажимайте Р – З (буква) – 2.

Рис. 7. Надстройки в меню Параметры Excel

Настройки Excel в системном реестре

В диалоговом окне Параметры находятся десятки настроек, определенных пользователем. Для хранения этих настроек и обращения к ним во время запуска Excel используется реестр Windows, который еще называют системным реестром. Он представляет собой централизованную иерархическую базу данных, используемую операционной системой и приложениями. Реестр появился еще в Windows 95, в которой заменил прежние INI-файлы с хранящимися в них настройками Windows и приложений.

Для просмотра и редактирования системного реестра можно использовать редактор реестра – regedit.ехе, расположенной в папке C:\Windows. Прежде чем начать эксперименты, используйте команду Файл –> Экспорт редактора реестра. Эта команда позволяет сохранить ASCII-версию всего реестра, либо выбранную вами ветвь. Чтобы вернуть реестр в первоначальное состояние, импортируйте ASCII-файл, после чего реестр примет свой исходный вид (команда Файл –> Импорт).

Системный реестр содержит ключи и значения, расположенные в иерархическом порядке. Ключи верхнего уровня: HKEY_CLASSES_ROOT; HKEY_CURRENT_USER; HKEY_LOCAL_MACHINE; HKEY_USERS; HKEY CURRENT CONFIG. Информация, используемая Excel 2013, хранится в следующем разделе реестра: HKEY_CURRENT_USER\Software\Microsoft\Office\15.0\Excel. Настройки реестра обновляются автоматически после закрытия Excel.

Рис. 8. Редактор реестра позволяет просматривать и изменять системный реестр

Учтите, что Excel считывает содержимое реестра Windows один раз — при запуске. Кроме того, Excel единственный раз обновляет настройки реестра — при нормальном завершении. Если Excel завершается аварийно (такое бывает), информация в реестре не обновляется. Если изменить одну из настроек Excel, например, отображение строки формул, это изменение не зафиксируется в системном реестре до тех пор, пока Excel не завершит свою работу без эксцессов.

В таблице (рис. 9) перечислены настройки реестра, имеющие отношение к Excel 2013. Учтите, что некоторых из них вы можете не найти в своей базе данных реестра.

Рис. 9. Информация о конфигурации Excel в системном реестре

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

  1. Откройте редактор реестра и найдите раздел HKEY_CURRENT_USER\Software\Microsoft\Office\15.0\Excel\Options.
  2. Щелкните правой кнопкой мыши и выберите пункт Создать –> Параметр QWORD (64 бита).
  3. Назовите создаваемое значение Options6.
  4. Щелкните правой кнопкой мыши на ключе Options6 и выберите пункт Изменить.
  5. В диалоговом окне Изменение параметраQWORD установите переключатель Десятичная и введите значение 16 (рис. 10).


Рис. 10. Ввод значения для параметра системного реестра

После перезагрузки Excel ячейки выделяются черным цветом (следует отметить, что я не заметил изменений). Если вас это не устраивает, удалите запись реестра Options6.

Если появляются проблемы при запуске Excel, причина может быть в повреждении ключей системного реестра. Возможно, придется с помощью редактора реестра удалить следующий раздел реестра: HKEY_CURRENT_USER\Software\Microsoft\Office\15.0\Excel. При следующем запуске Excel удаленные ключи реестра будут созданы вновь. При этом существует риск потери некоторой информации.

[1] По материалам книги Джон Уокенбах. Excel 2010. Профессиональное программирование на VBA. – М: Диалектика, 2013. – С. 112–121.

Файл, созданный в Excel, называется рабочей книгой . Книга содержит рабочие листы . Каждый рабочий лист представляет собой таблицу , куда можно вводить данные и выполнять расчёты.

Для перехода с одного рабочего листа на другой надо щёлкнуть по ярлычку листа, расположенному под таблицей.

Screenshot_46.jpg

Электронная таблица разделена на клетки, которые называются ячейками . Строки обычно обозначаются числами, столбцы — латинскими буквами, а затем их сочетаниями. Ячейка имеет имя (адрес), состоящее из имени столбца и строки.

Screenshot_41.jpg

Таблица максимального размера может содержать 1 048 576 строк и 16 384 столбца. Для обозначения столбцов при этом не хватает букв английского алфавита, и они после буквы \(Z\) обозначаются сочетаниями двух букв, например, \(AA\), \(AB\). На экран вся таблица не помещается, но её можно прокрутить с помощью полос прокрутки.

В ячейку можно ввести текст, числовое значение, дату или формулу. Excel сам распознает, что введено в ячейку по введенным данным.

Текст, вводимый в ячейку, может быть произвольной длины (на самом деле он может содержать до \(65\) тысяч символов).

Если текст слишком длинный, он может не поместиться в ячейку или «залезть» на соседнюю ячейку.

Но, если ячейку сделать текущей, то в строке формул будет виден весь текст.

Screenshot_44.jpg

Формула может содержать знаки арифметических операций \(+ , – , * , / \) (сложение, вычитание, умножение и деление).

Если формула содержит адреса ячеек, то в вычислении участвует содержимое ячейки.

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

Читайте также: