Препарирование файлов .XLSX: строковые значения, разметка ячеек
Итак, продолжаем разговор. На всякий случай уточню, что начало здесь.
Про строковые значения и метод их хранения я уже вскользь упоминал в первой части, а сейчас поговорим подробнее. Представим, что у нас есть таблица, заполненная строковыми данными, и что она большая. При этом крайне маловероятно, что все значения в ней будут уникальны. Некоторые из них нет-нет, да повторятся где-нибудь в разных частях таблицы. Хранить такой массив «как есть» внутри XML-разметки листа нерационально с точки зрения ресурсов ПК. Поэтому все строковые значения вынесены в отдельный файл, %file%/xl/sharedStrings.xml. Часть его, которая нас интересует, выглядит, допустим, так:
Вася
Петя
Саша
Обратите внимание на атрибуты тега
Здесь же можно сказать, что здесь, внутри тега
Мама
мыла
раму
Обратите внимание: в корневой тег
В этом примере строковое значение содержит 3 пробега. Чтобы было удобнее их рассматривать, я, пожалуй, вынесу их отдельными сорсами.
Первый:
Мама
Этот пробег не содержит секции
Второй:
мыла
Здесь нет атрибута xml: space=«preserve». Нам без разницы, что Excel сделает с концевыми пробелами, которых нет. Зато есть блок
Третий:
раму
А здесь у нас есть и блок настроек шрифта и сохранение концевых пробелов.
Ну и еще коротенькая ремарка. Если есть необходимость сделать многострочную запись в ячейке, то здесь в строке просто будет обычный символ переноса, chr (10). Сам атрибут многострочности ячейки расположен в файле разметки листа. В однострочной ячейке символ переноса будет проигнорирован. Excel просто сделает вид, что его нет.
Перейдем в папку %file%/xl/worksheets. Здесь, как говорилось выше, каждый лист, содержащийся в книге, представлен файлом .xml.
Файл разметки листа содержит следующие ключевые элементы (и, что важно, желательно располагать их именно в таком порядке):
1. Тег
2. Тег . Необязателен, но иногда полезен. Я его использовал для указания на необходимость закрепления верхней строки: это полезно для больших отчетов. Выглядит это примерно так:
Здесь надо дать пояснение. Собственно закрепление строки — тег
- ySplit — показывает количество закрепленных строк. Для закрепления столбцов есть аналогичный атрибут xSplit;
- topLeftCell — указание левой верхней ячейки видимой по умолчанию НЕзакрепленной области;
- activePane — указание местонахождения НЕзакрепленной области. В руководствах сказано, что этот атрибут регулирует, с какой стороны будет НЕзакрепленная область. Правда, попробовав разные значения, я почему-то получил одинаковый результат. Как вариант «by default» я для себя выбрал bottomRight;
- state — указатель состояния закрепленной области. Для простого закрепления строки используется значение frozen
3. Тег
Интересен нам здесь в основном атрибут defaultRowHeight, то есть высота столбца по умолчанию. Стандартный, привычный нам вариант — 15 у.е. Если назначить его, скажем, 30 у.е., то строки, для которых высота не указана отдельно, станут в 2 раза выше. Однако, для того чтоб применить значение, отличное от дефолтного, необходимо указать атрибут customHeight со значением «true». Выглядит это примерно так:
4. Тег . Помогает установить ширину столбцов отличную от дефолтной. В заполненном виде выглядит примерно так:
Вложенные теги обозначают не каждый один столбец, как могло показаться, а группу столбцов, идущих подряд и имеющих единую ширину.
- Атрибут min — первый столбец группы;
- Атрибут max — последний столбец группы;
- Атрибут width — ширина столбца из группы;
- Атрибут customWidth — флаг применения кастомной ширины, без него ширина все равно будет дефолтной;
5. Тег
0
1
2
1
37539
14
2
33227
21
Как видно, в тег
«Букв, что ли, пожалели?» — спросите вы. «Экономия памяти» — ответит Microsoft. Если вспомнить про ограничение в 16 миллионов с гаком ячеек, становится понятна их мотивация. Выходит, в теории один (!) лишний символ в имени атрибута может привести к миллионам лишних символов при чтении всего файла.
В тег
- r — адрес ячейки;
- s — стиль ячейки. Вспоминаем первую часть данной статьи: в файле styles.xml есть раздел
, в котором перечислены зарегистрированные стили оформления ячеек. атрибут «s» тега <с /> — как раз ссылка на элемент этого списка, начиная с 0; - t — указание на необходимость обращения к таблице строковых значений в файле sharedStrings.xml. Если атрибут указан — обращаемся, если нет — пишем как есть то, что в теле тега. Примечательно, что при попытке вписать в тело тега текст без указания данного атрибута, Excel при открытии файла ругнется, но послушно перенесет нашу фразу туда, где ей место (хотя я на его сообразительность рекомендую не полагаться и сразу писать строки в sharedStrings.xml);
Когда я говорил про файл sharedStrings.xml, я упомянул, что многострочные ячейки помечаются в файле разметки листа. Делается это, к примеру, так:
3
То есть, строго говоря, нам надо указать кастомную высоту ячейки и поставить флаг применения этой самой кастомной высоты.
6. Тег
Как видно, одна объединенная ячейка обозначена одним тегом
7. Тег
Нетрудно понять, что атрибут «ref» задает зону, занимаемую активными ячейками фильтров.
Ну и «на сладкое» в файле идут настройки страницы для печати. Вот пример из одного моего файла:
Тег
В комментариях к первой части была просьба поговорить собственно о редактировании этого чуда техники средствами PL/SQL. Следующая часть будет именно об этом.