Софт-Архив

Формат Xls img-1

Формат Xls

Рейтинг: 4.6/5.0 (1890 проголосовавших)

Категория: Windows: Печать

Описание

ЧТО такое формат xls и чем его открыть

Что такое формат xls и чем его открыть Что такое xls

Разрешение .xls имеют файлы, созданные программой Microsoft Excel 2003 или более ранними. Начиная с версии 2007 года в Excel используется другой формат - OOXML, и файлы таблиц имеют разрешение .xlsx.

Прародителем Excel, как и многих других табличных редакторов, послужила программа Visicalc, разработанная компанией Software Arts в 1979 году. Всего было продано около 700 тысяч экземпляров.

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

Интересным нововведением был «умный» пересчет значений таблицы — обновлялись значения ячеек, которых коснулись изменения, в то время, как другие редакторы пересчитывали таблицу целиком, что могло занимать значительное время.

В 1993 году Excel был объединен с программами Microsoft Word и Microsoft PowerPoint, что положило начало пакету Microsoft Office.

Чем открыть

Помимо Microsoft Excel, существует ряд программ, с помощью которых можно открыть файлы с расширением .xls для просмотра и редактирования.

Microsoft Excel Viewer — бесплатная утилита от производителя Excel, позволяющая просматривать и распечатывать таблицы.

Microsoft Excel вплоть до версии 2003 года отличается собственным двоичным форматом — BIFF. В 2008 году компания опубликовала спецификацию формата, которая заняла 349 страниц.

OpenOffice — пакет офисных приложений, аналогичный Microsoft, но распространяемый свободно под лицензией Apache. Разработку в разное время вели корпорации

LibreOffice — также свободный офисный пакет. Часть разработчиков OpenOffice из-за административных разногласий основали собственный проект, распространяется под лизензией GNU LGPL.

Gnumeric — кроссплатформенный табличный редактор, выпускаемый под лицензией GNU GPL, то есть является свободным программным обеспечением.

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

Активно разрабатывают приложения для просмотра и редактирования файлов Excel под мобильные ОС — Android и iOS.

К примеру, Calc XLS или Office HD можно установить на устройство Apple. OfficeSuite, Docs To Go, Kingsoft Office — неплохие варианты для Android OS.

Другие статьи, обзоры программ, новости

Каталоги запасных запчастей для китайских грузовиков Foton (6 моделей, формат XLS)

Каталоги запасных запчастей для китайских грузовиков Foton (6 моделей. формат XLS)

Каталоги запасных запчастей для китайских грузовиков Foton (6 моделей )

Платформа. любая

Системные требования. Офис

Таблэтка. Не требуется

Язык. Русский,английский

Год выпуска. не известен

Жанр :каталоги запасных частей

Формат файлов. XLS

Описание. Каталог запчастей грузового автомобиля Foton BJ1039. Язык: русский, английский, китайский. Формат: XLS

Каталог запчастей грузового автомобиля Foton BJ1049A. Язык: русский, английский, китайский. Формат: XLS

Каталог запчастей грузового автомобиля Foton BJ1049C. Язык: русский, английский, китайский. Формат: XLS

Каталог запчастей грузового автомобиля Foton BJ1069. Язык: русский, английский, китайский. Формат: XLS

Каталог запчастей грузового автомобиля Foton BJ1099. Язык: русский, английский, китайский. Формат: XLS

Каталог запчастей самосвала FOTON BJ3251DLPJB. Язык: русский, английский, китайский. Формат: XLS

Сохранение таблиц

FineReader 12 Сохранение электронных таблиц

ABBYY FineReder позволяет сохранить электронные таблицы в форматах XLSX, XLS и CSV .

Форматы XLSX и XLS

Как сохранить текст в формат XLS/XLSX:

  • Нажмите на стрелку возле кнопки сохранения результатов на главной панели инструментов и выберите из списка формат сохранения. Если нужного формата в списке нет, выберите пункт Сохранить в других форматах…. и в открывшемся диалоге сохранения выберите требуемый формат. Вы также можете сохранить документы, используя команду меню Файл >Сохранить документ как >Рабочая книга Microsoft Excel 97-2003 .

Совет. В случае необходимости вы можете настроить дополнительные опции сохранения на закладке Сохранить >XLSX диалога Настройки (меню Сервис >Настройки… ).

  1. Форматированный текст

В полученном документе сохранятся начертание и размер шрифта, разбиение на абзацы, но не сохранится расположение объектов на странице и межстрочные интервалы. Таким образом, будет получен сплошной текст с выравниванием по левому краю. Для текста, в котором порядок чтения справа налево, выравнивание будет по правому краю.

Замечание. Любой текст с вертикальной ориентацией в данном режиме будет отображаться горизонтально.

  • Простой текст

    Сохранять числовые данные в формате "Цифры"

    Указывает, что при сохранении распознанного текста в формате XLS числа будут сохранены в формате «Цифры». Этот формат в Excel используется для выполнения арифметических операций над ячейками, содержащими числа.

  • Сохранять колонтитулы

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

    • Для того чтобы задать параметры сохранения картинок, выберите пункт Пользовательское…. В открывшемся диалоговом окне Пользовательские настройки выберите необходимые значения и нажмите кнопку ОК .
    • Если вы не хотите сохранять иллюстрации в распознанном тексте, убедитесь, что опция Сохранять картинки (только XLSX) не отмечена.
    Как сохранить текст в формат CSV:
    • Нажмите на стрелку возле кнопки сохранения результатов на главной панели инструментов и выберите из списка формат сохранения. Если нужного формата в списке нет, выберите пункт Сохранить в других форматах…. и в открывшемся диалоге сохранения выберите требуемый формат. Вы также можете сохранить документы, используя команду меню Файл >Сохранить документ как >Документ CSV .

    Совет. В случае необходимости вы можете настроить дополнительные опции сохранения на закладке Сохранить >CSV диалога Настройки (меню Сервис >Настройки… ).

    Данная закладка содержит следующие группы настроек:

    Параметры сохранения текста

    • Игнорировать текст вне таблицы

    Указывает, что в файл будут сохранены только таблицы.
  • Разделять страницы символом конца страницы (#12) Указывает, что при сохранении распознанного текста в формате CSV деление на страницы будет таким же, как и в исходном документе.
  • Разделитель

    Указывает символ, который будет разделять столбцы данных в файле формата CSV.

  • Программа ABBYY FineReader автоматически подбирает кодовую страницу. Если вы хотите изменить кодовую страницу, выберите нужное значение в выпадающем списке в секции Кодировка .

    Бинарный формат XLS-файлов

    Бинарный формат XLS-файлов. Создание xls-файлов. (beta-версия) Для кого предназначена эта статья

    Статья для тех, кто хочет узнать, как программным способом создать xls-файл.

    Прежде всего, выясните: возможно, не надо изобретать велосипед, и ваш язык программирования поддерживает связь с COM(OLE)-серверами MS Office. Что-то вроде такого:

    CreateObject("Excel.Application")

    Или такое, для VC++:

    CLSID clsid;

    CLSIDFromProgID(L"Excel.Application", &clsid);

    HRESULT hRes = CoCreateInstance(clsid, NULL, CLSCTX_LOCAL_SERVER,

    IID_IDispatch, (void**)&exceldispatch);

    По крайней мере, можно воспользоваться поисковыми системами с запросом:

    "Excel.Application" и можете добавить ваш язык программирования.

    Практически любая современная система разработки программ поддерживает создание таких объектов. Такие объекты имеют огромное количество методов, чтобы создать любой сложности документ MS Office. Значит, всё, что будет описано в этой статье – вам не понадобится, разве что для праздного любопытства.

    Для кого же нужна эта статья? Для тех, кто хочет программно создать xls-файл, но:

    1) Используется старый язык программирования (16-разрядный), который, скорее всего, не поддерживает связи с COM-объектами. Может и есть какой-то способ для 16-битных программ связаться с COM-сервером, но я лично этот вопрос не выяснял.

    2) Используется какой-то ограниченный метаязык в специализированной программе (но этот метаязык должен уметь работать с файлами!).

    3) У вас просто не установлен пакет программ MS Office (из-за дороговизны лицензий, например). В этом случае, да, при любом языке программирования быстро создать какой-то xls-файл не получится.

    4) а возможно вы просто хакер, который хочет попутать данные в электронных таблицах.

    Документация, использованная для написания этой статьи

    Документация Microsoft (рекомендую, англ): http://t-lar.narod.ru/Excel97-2007.zip (Excel97-2007BinaryFileFormat(xls)Specification.pdf)

    Введение в структуру xls-файлов

    На самом деле xls-файл это файл в файле. Внешний файл называют OLE2. Он, вроде, общий для всех офисных программ. Внутренний файл называют BIFF.

    Формат OLE2 представляет собою целую файловую систему. Там также есть заголовок в 512 байт. Также есть FAT, который описывает какие блоки используются в файле!

    BIFF - внутренний файл. Он уже описывает свойства книги, свойства листов, свойства и содержимое ячеек электронной таблицы. BIFF бывает разных версий. Последняя версия - BIFF8 для xls-файлов используется в MS Excel 2003. Именно её и будем реализовывать. Хотя, сама программа MS Excel может работать практически с любой версией BIFF. (уже есть и BIFF9, но это уже, скорее всего, xlsx).

    BIFF как внутренний файл может быть фрагментирован - разбит на куски, которые будут находится в разном порядке в файле OLE2.

    Собственно, из этого делаем вывод, что создать файл xls и прочитать xls две разных по сложности задачи. При создании xls-файла мы будем использовать идеальный случай, когда всё идёт друг за другом. Если же вы хотите прочитать другой xls-файл, то можете столкнуться с такими проблемами:

    1) разные версии BIFF.

    2) BIFF файл разбросан по всему OLE2. Значит, придётся сперва прочитать FAT, где какие ячейки используются, собрать те ячейки в единый цельный временный файл, а уже потом с ним и работать.

    В принципе, не так всё страшно. Excel сам старается создать "нормальные" не разбитые BIFF-файлы в файле OLE2.

    (то, что я описал, конечно, очень поверхностные данные о структуре. Всё намного сложнее, и чтобы не повторяться, читайте документацию, которая приведена выше. Здесь же, я опишу только то, что создаст хоть какой-то рабочий xls-файл).

    Структура OLE2

    Кроме "FAT" и "BIFF8", практически все эти блоки будут тупо вписаны статическим кодом (за исключением нескольких байт, которые надо будет подправить).

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

    Здесь, кстати, всё у нас идеально и идёт одно за другим.

    Давайте вернёмся к заголовку, и взглянем на первые 512 байт файла xls (заголовок OLE2):

    То, что подчёркнуто красным (3 числа длиною 4 байта) мы будем изменять во время работы программы. Остальное же можно оставить как есть. Надеюсь, вы в курсе, что байты числа записываются в память (оперативную или постоянную) в обратном порядке (little-endian)?

    Первое число 00000001 - количество секторов, в которых размещается сам FAT. Сектор у нас равен 2 9 = 512 байт (эту девятку вы можете увидеть в этом же заголовке, найдите!).

    Второе число 0000001A - номер сектора, в котором размещается Root Directory Entry (важная опция в OLE2-файле).

    Третье число 00000019 - номер сектора, в котором находится FAT.

    То есть, первое число, это сколько секторов FAT, а третье число, где эти сектора. И тут надо обратить внимание на неясность в русской документации, которую я вам советовал. Там насчёт адреса 0x0000004С написано:

    "Номера первых 109 секторов, в которых располагается FAT. Если файл /*Нам придётся записывать, иногда, большие куски байт-потока, поэтому, прежде всего, надо определиться каким образом можно записать целый поток в файл. Можно, конечно завести массив, его статично проинициализировать, а потом просто записывать через fwrite(ссылка_на_массив, размер_элемента_массива, длина_массива, файловый_указатель). Но тогда нам надо в самом начале программы создать большое количество таких массивов, а потом в тысячной какой-то строке его использовать. Это будет просто малоинформативно. Поэтому я выбрал другой путь. Я создал функцию SetBlob, которая будет "на лету" заносить в массив нужные числа в любом количестве, например SetBlob(a, 5, 20, 56, 24, 100, 234); - первый параметр массив, второй параметр - количество последующих чисел, остальные параметры - те числа */

    Теперь мы оставим заголовок OLE2 и начнём писать полностью BIFF8. И записав BIFF8, запишем всё остальное.

    Структура BIFF8

    У нас будет всего 1 Лист. Количество Листов указывается в Глобальном блоке (см. комментарии в коде). Все опции (и описания строк, описания ячеек, DBCELL) состоят из:

    1) 2 байта - код опции.

    2) 2 байта - длина данных в этой опции. Длина учитывает только длину данных.

    3) n-байт данных.

    Это важно, запомните!

    Пишем BIFF8

    Тут нам надо серьезно оговориться насчёт того, откуда мы будем брать данные для ячеек таблицы Excel?!

    И действительно, где будут лежать данные для записи в Excel? Это ведь может быть dbf-файл, это может быть текстовый файл. Это может быть визуальная таблица в 32-разрядных программах, в которую, вручную можно внести данные. В зависимости от выбранного метода наша программа будет отличаться. Так или иначе, я в своей реализации считаю, что у меня есть двумерный массив data, заполненный данными. Причём это не просто массив данных, а массив структур (см.ниже). Структура будет содержать: данные ячейки, и тип этих данных (числовой, текстовый и т.д.) Дело в том, что сам Excel поддерживает ячейки такого вида:

    BOOLERR - ячейка с логическим значением "ИСТИНА" или "ЛОЖЬ". Может также содержать "ошибка".

    NUMBER - ячейка с числом (64-битный double)

    RK - ячейка с целым числом, либо число с 1-м или 2-мя знаками после запятой. (очень часто встречаются). На число отводится 30 бит. Остальные 2 бита являются флагами: целое число или нет; надо ли число делить на 100 или нет. Таким образом и достигается 2 знака после запятой. Например, RK ячейка может содержать число 110. Но при флаге, что надо делить на 100 получаем число 1.10. Если числа небольшие, то эти 30 бит намного сэкономят место, вместо использования 64-битной ячейки NUMBER.

    LABEL - ячейка со строкой.

    LABELSST - ячейка, в которой содержится номер строки. А сами строки содержатся в блоке SST. (это современный подход, его я и буду использовать, хотя он и более трудоёмкий. ).

    BLANK - пустая ячейка.

    Это не полный перечень ячеек. Я буду использовать ячейки LABELSST, NUMBER, BLANK, BOLERR. При желании, можно использовать только строковые ячейки, занося туда и числа, и логические данные. В коде я покажу как это сделать (в комментариях).

    Вернёмся к нашей программе, пусть будет наш массив data, который мы буде записывать в xls, такого вида:

    то есть, у нас 4 колонки, 5 строк.

    В первой колонке - имя, во второй - возраст, в третьей - признак пола (true - мужчина, false - женщина), в четвертой - некая дата. Первая строка вся типа C. В остальных строках:

    Первая колонка имеет тип C - Character - строковой.

    Вторая колонка имеет тип N - Numeric - число

    Третья колонка имеет тип L - Logical - логический.

    Четвертая колонка имеет тип D - Date - дата. Но мы всё равно дату будем использовать как тип C.

    Обратите внимание, что хотя данные у нас разного типа, но всё равно записаны как строки. Это потому что у меня такая реализация изначального массива данных. Если вы берёте данные для Excel-таблицы из другого источника (например, dbf-файл), то естественно, код программы надо будет немного доработать. Но это несложно. Либо же, если будет использоваться именно мой массив data (но заполненный вашими данными в текстовом виде!), то вообще не надо ничего будет подправлять.

    И так, продолжим писать программу. После заголовка OLE2 мы сразу же начнём описывать BIFF8. Начинается он с описывания самой книги Excel. А потом уже будет каждый Лист описан.

    Прежде чем продолжить глобальный блок нужно кое-что оговорить. Код, доселе приведённый, практически является статическим. То есть, в принципе, его можно было бы заменить одним большим SetBlob().

    Теперь мы подошли к самому сложному моменту в программе: SST

    SST - как, уже говорилось выше, являет собою просто сбор всех существующих строк в ячейках xls-файла.

    Казалось бы. достаточно написать такой код на 3 строки, и всё будет хорошо:

    1) надо ведь в заголовке SST указать длину самого SST. А значит, нам надо вычислить сумму длин всех строк.

    2) также в заголовке SST надо указать количество используемых строк! (см. также п.7). Значит, нам надо посчитать, сколько этих строк.

    3) перед каждой записанной строкой есть 3 байта. Первые 2-байта - длина строки. 3-ий байт:

    если 0 - кодировка ANSI, если 1 - Unicode.

    Причём если Unicode, то это на длину строки не влияет. То есть, если Unicode строка "абв", то её длина 3. Несмотря на то, что в файл надо записать 6 байт!

    И учитывать, что для вычисления общей длины SST надо Unicode-строку "абв" считать как 6 байт, да еще 3 байта перед строкой.

    4) Если язык английский, то используется строка ANSI, если русский, то строка превращается в Unicode. То есть, либо надо писать анализатор, что же у нас за строка, либо все сразу перевести в Unicode и не мучиться. Что я и сделал. Но такой SST будет больше места занимать, чем смесь ANSI и Unicode.

    5) А как же перевести строку в Unicode? Есть вроде стандартные методы из wchar.h, но я написал свою подпрограмму ASCIItoUnicode. У меня ASCII потому что имел дело именно с DOS'овской кодировкой. Можете сами сделать ANSItoUnicode (ниже я расскажу как это сделать). В общем, это дело решаемое.

    6) Самое важное: так как на любую опцию выделяется 2 байта, значит, блок SST не может быть более 65535 байт! Как быть если надо больше строк сохранить в SST?

    Оказывается можно продолжать SST-блок через добавление опции SST continue! Причём, надо учитывать, что в одном блоке строка может начинаться, а в другом закончиться. И я также подозреваю, что если строка Unicode, тогда надо разорвать строку в длине кратной 2 (если "абв" считать длиною 6 байт). Несмотря на запас в 64кб на опцию, почему-то Microsoft использует максимум 8224 байта на блок SST или SST continue.

    Причём размер блока может быть и меньше чем 8224 байта. Даже меньше на 11 байт! Возможно Excel использует какой-то анализатор, чтобы длинную строку уже начать с начала другого нового блока, а не начинать в конце.

    7) Забегая наперёд: после блока SST идёт блок ExtSST. Он, по умолчанию, содержит адреса на каждую восьмую строку в блоке SST! Но так как после записи SST будет нерационально потом возвращаться и искать каждую 8-ую строку и её адрес, значит, прямо при записи SST будем сохранять в массиве эти адреса строк для ExtSST!

    8) SST содержит неповторяющиеся строки! То есть каждая строка уникальна. Это очень может сократить объем файла, если в нём одинаковый текст. Но я этого не реализовывал. Причина довольно проста. Во-первых, придётся осуществлять много дополнительных вычислений программе, что приведёт к уменьшению её скорости работы. Во-вторых, мне придётся создать дополнительный массив в памяти, который будет хранить все правильные ссылки на номера строк.

    Дело в том, что суть алгоритма у меня такова:

    я слева направо, сверху вниз, считываю все строки и записываю их в SST. Потом, при записи содержимого уже самих ячеек Excel таблицы, я, также само, проходя слева направо, сверху вниз, просто укажу номер строки. Для этого достаточно завести переменную numberstr и в каждой ячейке указывать numberstr++.

    Если же все строки буду уникальными, тогда мне нужно заранее подготовить массив, который будет равен количеству всех ячеек исходных данных (у нас исходные данные массив data - 20 ячеек). Потом, выяснив, что строка уже дублировалась (а это еще надо выяснить!), мне надо будет в этот новый массив занести число, указывающее на старую уже существующую строку. Ну а потом, при записи ячеек, указать какой_то_новый_массив[переменная++]

    Это всё реализовать не сложно. Но если у нас будет данных на тысячи текстовых ячеек?

    Вот такой получился незамысловатый SST. Вначале казалось, что работы на 3 строки программного кода. А получилось где-то на 200 строк.

    Даже, кажется, что можно было бы обойтись и без этого SST. Ведь есть ячейки Label, в которых напрямую записан текст. Но, ведь мне надо было сравнивать побайтно мой xls-файл с тем, что создаёт MS Excel. Только так можно найти ошибки, или добавить функциональность программы.

    И так, вернёмся к коду.

    Нам для ExtSST нужно завести 2 массива:

    ExtSST, который следует за SST содержит не просто адрес через каждую 8 строк SST. А он содержит 2 адреса! Один абсолютный, а другой относительный. Абсолютный содержит адрес начиная с глобального блока. Относительный - начиная с SST. Поэтому обратите внимание, что первый массив у нас 4 байт на элемент, а второй всего лишь 2 байта на элемент массива.

    Сколько будет этих ExtSST сложно предсказать заранее. Замечено, что при огромных SST поведение ExtSST меняется. Он уже не на каждые 8 строк собирает адреса. А, например, каждые 64 строки. Там образом этот SST уменьшается. Может, имеет смысл вообще указать, чтобы ExtSST указывал каждые 65535 строк, и не мучиться с ним. ) Так или иначе, но эти массивы желательно было бы сделать динамическими. Но. вы ведь понимаете что динамические массивы это не так просто. Некоторые языки программирования их вообще не поддерживают. поэтому я сделал статические с запасом на 1000 ячеек. То есть, смогу описать 8000 строк SST (при шаге 8 строк).

    Ну а переменные lastelementExtSST1 и lastelementExtSST2 будут указывать на самый последний элемент массива.

    Также введу функцию afields(), возвращающую количество полей (в нашем случае 4) и функцию RecCount, возвращающую количество записей:

    собственно говоря, эти функции не так уж и нужны. Просто нам надо знать, что из себя представляют наши данные data. Первоначально эта программа была создана в FoxPro, оттуда эти функции и берут своё начало. Реального кода в эти функции не могу поместить, так как в С-языке данные data идут линейно в памяти. Поэтому определить сколько там записей и столбцов почти невозможно. Надо писать какой-то анализатор. Но я думаю, когда вы будете программу адаптировать под свои нужны, то вы будете знать сколько у вас столбцов и строк.

    Также мы введём функцию IsBlank() которая сообщит пустые ли данные или нет. В нашем случае IsBlank реализцется довольно просто:

    Но, это у меня всё просто. У вас может быть сложный случай. Если вы будете брать данные из dbf-файла, то поле может быть типа N, и в то же время, в ячейку никаких данных не записано (даже нуля!). Тогда и проверять пустая ли ячейка надо по-другому. strlen() не подойдёт, так как ваше поле будет содержать данные типа N, но и с нулём его сравнить нельзя. Напоминаю, что у меня реально все данные имеют тип строковой. Хотя и обозначены как C, N, L, D. Потому и функция такая простая. Продолжим код:

    Итак, мы закончили описание глобального блока.

    Теперь описываем Лист1

    прежде чем продолжим надо немного рассказать, как описываются ячейки в таблице Excel:

    1. Формат Excel описывает строки по 32 штуки, а потом их ячеек этих 32-х строк. Описание каждой строки ROW состоит из:

    а) её номера;

    б) с какого столбца начинается строка и до какого столбца заканчивается.

    Из этого делаем вывод, что Excel очень экономит место. Например, вот здесь:

    Excel сохранит всего лишь 2 строки! И опишет 3 ячейки. В моей реализации, к сожалению, все данные идут в "квадратном" виде начиная с ячейки (1, 1). Получается, что моя программа создаст 9 строк, и опишет 8*9= 72 ячейки. (большинство из них ячейки типа Empty). Да, это недостаток моего кода. Но, чтобы его исключить тогда надо анализировать таблицу, строки и т.д. Опять же куча дополнительного кода. В принципе, если не делать таблиц подобных рисунку, то лишних несколько Empty особой роли не сыграют.

    2. После описания 32-х строк и их ячеек идёт опция DBCELL, которая содержит смещения для строк, начиная со второй строки. Подробнее читайте документацию, потому что, реально, там много нюансов. Адреса DBCELL надо вернуться и прописать в опцию Index.

    Ну что ж, вот и закончили BIFF8 (то есть, описывать содержимое книги Excel). Теперь продолжим файл OLE2.

    Продолжим писать OLE2

    Только что мы прописали то, что я называл "служебная информация1" и "служебная информация2". На них, как видно, выделяется по 8 секторов! Хотя информация помещается и в один сектор. Поэтому, думаю те 7 секторов забиваемые нулями можно просто опустить. И получим выигрыш в 512*7*2 = 7168 байт. Собственно, перед "служебной информацией1" тоже шли несколько секторов пустыми. Можно еще и их убрать.

    Теперь начнём писать FAT. Но тут кое-что надо о нём рассказать подробнее: Как уже выше показывалось, в нём тупо перечисляются сектора, которые используются для данных. Но, в том секторе, в котором есть Summary Information или Document Summary Information записывается число FFFFFFFE (-2). Если в секторе размещается сам FAT, то он обозначается как FFFFFFFD (-3). Перед FAT, и после FAT секторов обязательно должны быть -2.

    Ну а теперь, последние штрихи - концовка ole2

    Юникод это двухбайтная кодировка для символов. Обычно используется однобайтная досовская (ASCII, кодовая страница для России cp866) или Windows (ANSI, кодовая страница для России cp1251). Для систем Unix обычно Koi-8 (для России Koi-8r). Но такие однобайтные кодировки имеют только 255 символов в своём распоряжении. Туда может поместиться только английский алфавит и национальный (при использовании кодовых страниц). Юникод как двухбайтный способ записи одного символа может вместить 65535 символов! Причём с разными языками! Как же перейти с однобайтных символов в двухбайтные? Тут надо учитывать, что цифры, значки и английские буквы просто дополняются нулями! Например Hello превращается в H0e0l0l0o0. Всего-то делов. Но, с такой строкой именно С-язык не умеет работать, потому что "0" (нуль) он считает признаком конца строки! В принципе, можно попробовать работать с библиотекой wchar.h, которая заточена специально под Юникод. (я в своём коде обошелся без wchar.h просто зная и понимая сколько надо записать байт, хоть есть там нули в строке, хоть нету их. ) Теперь насчёт русских символов. Тут уже сложнее. Коды русских букв в однобайтных кодировках совсем не совпадают с кодами Юникод. Значит, надо сперва сделать какую-то перекодировку. Второй же байт после каждой буквы будет не 0, а 4.

    Функция ChrTran(s, s1, s2) заменяет в строке s все символы из s1 на символы s2. Пример

    strcpy(s, "фыва",)

    ChrTran(s, "ыф", "АБ")

    s будет равно "БАва"

    В языке FoxPro/Clipper функция ChrTran стандартна. В С-языке я её реализовал так:

    А теперь функция ASCIItoUnicode(s). Функция, с помощью ChrTran, перекодирует ASCII символ в нужный код для Юникода. И добавляет после буквы символ 0 или 4 (для русских букв).

    Как сделать функцию ANSItoUnicode? Да запросто! В переменную s2 впишите русский алфавит (в кодировке ANSI).

    С переменной s3 будьте осторожны, она содержит непечатаемые символы, которые при копи-пасте могут утратиться. Хотя, наверное, лучше всю строку кодами записать и не мучиться.

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

    Конечно, вам будет интересно, как же сделать шрифт жирным, курсивом. Как оформить сетку для ячеек. Всё довольно таки просто.

    Если мы хотим нужный шрифт, то просто добавляем еще одну опцию Font:

    А можно и все эти опции, если будете использовать жирный, курсив, и жирный курсив. Можете путём экспериментов (или специальной документации) добавить кучу своих шрифтов.

    Но это еще не всё. Теперь эти шрифты надо прописать в XF.

    После раздела где перечислено 21 XF добавьте:

    Обратите внимание на первый байт в блобе: 0x05 - он показывает номер Font'а, который мы будем использовать. Если вам нужен еще курсив и жирный курсив, то опять таки создайте еще два XF'а, которые будут указывать на нужный Font. (на самом деле номирация Font'ов начинается с нуля, но там вроде в первых четырёх какой-то номер опускается. Поэтому наш пятый Font и идёт как пятый. )

    Ну а теперь всё просто! Когда вы записываете ячейку там всегда есть 2 байта на номер XF (по умолчанию записывается число 15). А теперь, если нужен жирный шрифт мы запишем число 21 (нумерация XF начинается с нуля). Если нужен курсив или жирный курсив запишем число 22 или 23. Похоже, собственной нумерации у XF нет, поэтому просто сами следите за их порядком и номером.

    пример для LabelSST:

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

    if (k == 4) w1 = 21; else w1 = 15; где k - у нас идёт номер строки. Учтите, если вы хотите всю строку сделать жирной, тогда надо повторить это условие не только для LabelSST но и для всех типов ячеек! Или же, надо где-то "выше" описания ячеек создавать условие, которое будет решать где какой будет прописываться XF. Но, а если программа заранее не знает где какой должен быть шрифт? Тут уже надо обдумывать некое наслоение над моей программой. Исходные данные (у нас, массив data), о которых я уже не раз говорил, должны кроме самих данных и типа, содержать еще и признаки шрифта (размера шрифта, цвета шрифта, ячейки, рамки вокруг ячейки и т.д.) Иначе же придётся постоянно лезть в этот исходный код и подправлять условия, чтобы в нужном месте был нужный шрифт!

    И так, вот еще вам заготовка для ячейки, окруженной границами:

    Не забывайте, что первый байт указывает на номер шрифта (у меня здесь 0x07). Значит, указав этот XF у вас будет не только шрифт "жирный курсив", но еще и границы вокруг ячейки!

    Общие сведения о двоичном формате файлов Excel MS-XLS (машинный перевод)

    Общие сведения о двоичном формате файлов Excel MS-XLS (машинный перевод)

    Данная статья переведена с помощью машинного перевода, см. Отказ от ответственности. Используйте английский вариант этой статьи, который находится здесь. в качестве справочного материала.

    Аннотация. Рассматривается двоичный формат файлов MS-XLS, который используется в ранее выпущенных продуктах Microsoft Excel. В статью включены сведения об основных структурах и ключевые концепции для программного взаимодействия с данным форматом файлов.

    Формат двоичных файлов MS XLS используется Microsoft OfficeExcel 2003 г. Microsoft Excel 2002 г. Microsoft Excel 2000 и Microsoft Excel 97. Формат состоит из потоков и потоков. Каждый лист электронной таблицы хранятся в собственной подпотоков. Все данные, содержащиеся в записи, содержащие заголовки, дающие записей типа и длины. Записи ячейки, которые содержат реальные данные ячеек, а также формулы в ячейке свойства, находящиеся в ячейке таблицы. Строковые значения не хранятся записи ячейки, но в таблице общей строки, которая ссылается на ячейку записи. Записи строки содержат сведения о свойствах для ячеек, строк и ячеек. Только ячейки, содержащие данные или форматирование отдельных хранятся в подпотоков.

    Microsoft Office Excel 2007 использует MS-XLSB binary file format. Этот формат аналогичен MS XLS, но явно не рассматривается в данной статье.

    Основные компоненты формата MS XLS

    Формат файла MS XLS содержит потоки, потоков и records. Все записи в документ MS XLS начинаются с 2-байтовое целое число без знака для указания типа записи, а другой для размер записи. Запись не может превышать 8224 байт. В случае больше данных, запись относится к остальной хранится в один или несколько continue records .

    Ниже приведены основные потоки, потоков и записи в файл формата MS XLS.

    Поток Workbook является основной поток в XLS-файла. Он содержит несколько потоков, каждый из которых начинается с начала файла (BOF) записи и заканчивается на запись в конец файла (EOF). Первый поток всегда подпотоков Globals. а остальные подпотоки sheet. К ним относятся листы, листы макросов, листы диаграмм, листы диалогов и листы модулей VBA.

    Globals подпотоков определяет глобальные свойства и данные в книге. Он также включает BoundSheet8 запись для каждого подпотоков Workbook поток.

    Запись BoundSheet8 сведения о подпотоков листа. Это включает в себя имя, расположение, тип и видимости. Первые 4 байта для записи, lbPlyPos FilePointer указывает позицию в потоке Workbook. которой начинается подпотоков листа.

    Worksheet подпотоков указывает листа в книге.

    В таблице ячейка является частью потока лист, где хранятся ячейки. Он содержит ряд строк блоков, каждый из которых обладает емкостью 32 строк ячеек и заполняются последовательно. Каждый блок строка начинается с серии записей Row. следуют ячейки, перейдите в строках, и заканчивается DBCell записи, которая дает начальное смещение первой ячейки каждой строки в блоке.

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

    Все ячейки в строке блока сохраняются после последней строки в блоке. Существует семь типов записей, представляющих фактические ячейки на листе. Большинство записей ячейки начинаются с 6-байтного Cell структуру. Первые 2 эти байты указать строку, следующие два байта указать столбец, а последние 2 байта укажите записи XF в подпотоков Globals. который содержит сведения о форматировании.

    Следующие записи представляют различные виды ячеек. Если не указано иное, первые 6 байтов занимаемое структуру ячеек, а оставшиеся байты содержат значения.

    запись Blank ячейки

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

    запись RK ячейки

    Запись RK ячейка содержит 32-разрядное число. Excel автоматически преобразует числа, которые могут быть представленными в 32 бит или меньше, в этот формат для хранения как способ уменьшить размер файла. Вместо структуры ячейки 6 байтов первые 2 байта определяют строку и второй 2 байта указать столбец. Оставшиеся 6 байт определяют номер в структуре RkRec для оптимизации диска и памяти.

    запись BoolErr ячейки

    Запись ячейки BoolErr содержит структуру Bes 2-байтовое значение типа Boolean или код ошибки.

    запись Number ячейки

    Запись Number ячейка содержит 64-разрядное число с плавающей запятой.

    запись LabelSst ячейки

    Запись LabelSst ячейка содержит 4-байтовое целое число, которое указывает строку в таблице общих строк (SST). В частности целое число, которое соответствует индекс массива в поле RGB SST.

    запись Formula ячейки

    Запись ячейка Formula содержит формулу и полученные данные. В структуре FormulaValue в 8 байт, которые следуют за структуру ячеек определяется значением, отображаемым в ячейке. Следующие 6 байт может игнорируются, а остальная часть записи является CellParsedFormula структуру, содержащую сама формула.

    Запись MulBlank задает набор пустых ячеек в строке.

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

    Запись MulRk подобно MulBlank записи, но вместо пустых ячеек, MulRk запись состоит из RK данных в структуры RkRec .

    Общие строки таблицы (SST) содержит все строковые значения в книге. Эти значения ссылается на листе LabelSst записи ячейки. Первые 8 байт SST предоставить номер ссылки на строки в книге и количество уникальных строковых значений в SST. Остальные представляет собой массив структур XLUnicodeRichExtendedString. содержащих строки, сами по себе в виде массивов знаков. 16 Бит эта структура определяет, должны ли символы 1 байт или 2 байта. SST структура и структура XLUnicodeRichExtendedString можно расширить с помощью Continue записей, если номер или длина строки превышает их границ.

    Извлечение данных из файлов Excel

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

    Как открыть файл

    Как открыть файл .ods?

    Файлы .ods (OpenDocument Spreadsheet ) – это электронные таблицы формата OpenDocument. созданные в программах типа StarOffice или OpenOffice.

    Что такое OpenDocument Format

    OpenDocument Format (ODF – от OASIS Open Document Format for Office Application – открытый формат документов для офисных приложений) – открытый формат файлов документов для хранения и обмена редактируемыми офисными документами, в том числе текстовыми документами (такими, как заметки, отчеты и книги), электронными таблицами, рисунками, базами данных, презентациями.

    Стандарт был разработан индустриальным сообществом OASIS и основан на XML -формате. 1 мая 2006 г. принят как международный стандарт ISO /IEC 26300.

    Стандарт был совместно разработан различными организациями, доступен для всех и может быть использован без ограничений. OpenDocument представляет собой альтернативу частным закрытым форматам, включая DOC. XLS и PPT (форматы, используемые в Microsoft Office 97 – 2007), а также формату Microsoft Office Open XML.

    Установите плагин-конвертер Sun ODF Plugin for Microsoft Office ( см. Как установить Sun ODF Plugin for Microsoft Office ? ).

    Как подключить плагин к Microsoft Office Excel 2000/XP/2003

    – запустите Microsoft Office Excel ;

    – выберите меню Сервис –> Надстройки… (Tools –> Add-Ins );

    – в диалоговом окне Надстройки (Add-Ins ) нажмите кнопку Обзор… (Browse… );

    – в окне О бзор укажите расположение файла odfaddin.xla (\Program Files\Sun\Sun ODF Plugin for Microsoft Office *.*\converter ) –> OK –> OK ;

    – на панели инструментов появится новая панель Sun ODF Plugin с кнопками Импорт файла в формате ODF и Экспорт файла ODF.

    Как открыть файл в формате .ods в Microsoft Office Excel

    – запустите Microsoft Office Excel ;

    Microsoft Office Excel 2000/XP/2003.

    – на панели инструментов нажмите кнопку Импорт файла в формате ODF (или выберите меню Файл –> Импорт электронной таблицы в формате ODF );

    – в окне Импорт электронной таблицы в формате ODF выберите файл .ods. который нужно открыть –> нажмите Открыть.

    Microsoft Office Excel 2007.

    – на ленте инструментов выберите вкладку Надстройки ;

    – нажмите кнопку Импорт файла в формате ODF (или выберите команду меню Импорт электронной таблицы в формате ODF… );

    – в окне Импорт электронной таблицы в формате ODF выберите файл .ods. который нужно открыть –> нажмите Открыть.

    Как сохранить открытый файл .ods в формате .xls

    Microsoft Office Excel 2000/XP/2003.

    – выберите меню Файл –> Сохранить как… ;

    – в окне Сохранение документа выберите место сохранения файла;

    – в выпадающем списке Тип файла выберите Книга Microsoft Office Excel (*.xls) ;

    – в выпадающем списке Имя файла задайте интуитивно понятное имя файла –> Сохранить ;

    – файл будет сохранен в формате .xls.

    Microsoft Office Excel 2007.

    – нажмите кнопку Office –> Сохранить как ;

    – в окне Сохранение документа выберите место сохранения файла;

    – в выпадающем списке Тип файла выберите нужный вам формат (например, Книга Excel (*.xlsx) или Книга Excel 97-2003 (*.xls) ;

    – в выпадающем списке Имя файла задайте интуитивно понятное имя файла –> Сохранить ;

    – файл будет сохранен в формате .xlsx/.xls.

    Как конвертировать (сохранить) файл .xlsx/.xls в формат .ods

    – откройте файл .xls/.xlsx ;

    Microsoft Office Excel 2000/XP/2003.

    – на панели инструментов нажмите кнопку Экспорт файла ODF (или выберите меню Файл –> Экспорт электронной таблицы в формате ODF );

    – в окне Экспорт электронной таблицы в формате ODF выберите место хранения файла;

    – в выпадающем списке Имя файла задайте интуитивно понятное имя файла –> Сохранить ;

    – файл .xls будет конвертирован и сохранен в формате .ods.

    Microsoft Office Excel 2007.

    – нажмите кнопку Экспорт файла ODF (или выберите команду меню Экспорт электронной таблицы в формате ODF… );

    – в окне Экспорт электронной таблицы в формате ODF выберите место хранения файла;

    – в выпадающем списке Имя файла задайте интуитивно понятное имя файла –> Сохранить ;

    – файл .xlsx будет конвертирован и сохранен в формате .ods.