При добавлении в конвертер Excel возможности читать и записывать разделители страниц мне в глаза бросилось то, что в описании формата ни слова не сказано о том, как следует записывать большое количество разделителей. Дело в том, что поток данных в книге Excel хранится в виде записей. Максимальная длина одной записи составляет 8224 байта. Разделители страниц сохраняются в виде записей VERTICALPAGEBREAKS и HORIZONTALPAGEBREAKS. В начале записи идет двухбайтовое поле, содержащее количество разделителей. На каждый разделитель уходит 6 байт. Таким образом, всего в одну запись влезает 1370 разделителей. А что делать, когда разделителей больше 1370?
Т.к. подобная ситуация не описана в документации, то наиболее логичным было бы разбиение записи xPAGEBREAKS на несколько записей CONTINUE. Т.е. сначала идет запись xPAGEBREAKS, все данные, не влезающие в максимальный объем записи, идут следующими записями с типом CONTINUE. Т.к. при написании программ полагаться на одни предположения не следует, то пришлось подготовить специальный табличный документ, содержащий 10000 разделителей страниц. Данный документ был записан в книгу Excel. При открытии книги Excel упал. Значит, подобный алгоритм разбиения не работает.
Есть еще один вариант, который Excel использует, например, для сохранения объединений ячеек: записи CONTINUE после основной записи не используются. Вместо записи CONTINUE идет запись с тем же кодом. Т.е. в отличие от вышеприведенного алгоритма, все записи, на которые разбивается набор данных о разделителях, имеют тип xPAGEBREAKS. Этот алгоритм был реализован. Тестовый документ опять был записан в книгу Excel. На этот раз Excel не упал. Только количество страниц оказалось гораздо меньше, чем 10000... Оказалось, что Excel воспринял только последнюю запись HORIZONTALPAGEBREAKS.
В итоге экспериментов получаем следующее. Количество вертикальных или горизонтальных разделителей не может быть больше 1370. Разделители должны записываться ОДНОЙ записью. Если записей несколько, то воспринята будет только последняя. Вот такое занятное ограничение. Если кому надо более 1370 страниц, то имейте в виду – будут проблемы :)
Правда, учитывая, что в листе может быть только 65536 строк и 256 столбцов, понятно, что данное ограничение не такое уж страшное.
Кстати, если кто думает, что с ВЕРТИКАЛЬНЫМИ разделителями проблем уж точно нет, то он ошибается. Казалось бы, даже если перед каждой колонкой впихнуть разделитель, то получим только 255 страниц – до ограничения совсем далеко. Однако следует учитывать, что разделители страниц в Excel могут иметь ограниченную область действия. Например, для некоторого вертикального разделителя можно установить, что он будет находиться перед 20-й колонкой и будет действовать, начиная с 30-й и заканчивая 50-й строкой. Аналогично и для горизонтальных разделителей. Я с трудом представляю себе документ с подобными разделителями страниц, но допускаю, что в определенных ситуациях это может быть полезным.
Ссылок на эту страницу нет