Кожна книга Excel зберігається в складеному файлі [один з форматів OLE - прим. перев.].
Якщо ви вирішили прочитати цю документацію в надії за вихідні написати імпорт документів Word для вашого блог-движка, або вивести ваші особисті фінанси в вигляді таблиці Excel - складність і довжина специфікації швидко відіб'ють у вас це полювання. Нормальний програміст прийде до висновку, що виконавчі формати Office 1) навмисно зроблені складними і темними; 2) таке міг вигадати тільки божевільний кіборг; 3) були створені вкрай невмілими програмістами; і 4) неможливо коректно вважати і записати.
Смію вас запевнити: все це невірно. Подумаємо разом, і я вам покажу, чому ці формати стали такими складними, чому це не говорить про непрофесіоналізм Microsoft і як обійти все це.
Вони розраховані на дуже слабкі комп'ютери. У перших версіях Excel для Windows. 1 мегабайт ОЗУ був звичайним обсягом пам'яті, і 80386 з 20 мегагерцами міг з комфортом ганяти Excel. У форматах Microsoft було багато оптимізації, яка дозволяла швидше відкривати і зберігати файли.
Вони були розраховані на широке використання бібліотек. Якщо ви хочете написати з нуля двійковий імпортер, вам потрібно підтримувати такі речі, як Windows Metafile (для векторних малюнків), складові контейнери OLE і т. Д. Якщо ви на Windows. все це тривіально - воно є в Windows API. Але якщо ви пишете все з цілковитого нуля, все це доводиться реалізовувати. У Office реалізована широка підтримка складених документів: наприклад, в Word можна вставити таблицю Excel. Справжній імпортер Word повинен зробити щось розумне з впровадженої через OLE таблицею.
Вони повинні відображати всю історію Office. Багато особливості формату пов'язані з функціями, які дуже старі, складні і рідко використовуються. Вони все ще залишилися заради зворотної сумісності - адже Microsoft нічого не варто залишити старий код. Але якщо ви хочете розбирати і писати ці файли, вам доведеться пройти весь той шлях, який пройшли безвісні програмісти з Microsoft 15 років тому. У поточні версії Word 'а й Excel' я вкладені вже тисячі людино-років - і якщо ви хочете зробити їх клон, вам доведеться працювати тисячі років. Формат файлу - це всього лише короткий опис того, що програма робить.
Для прикладу розглянемо докладно один маленький приклад. Файл Excel - це купа записів в форматі BIFF. Найперша запис в цьому файлі називається 1904.
І це тільки перша з сотень записів BIFF, які вам доведеться підтримувати, і одна з найпростіших. Багато з них настільки складні, що здатні збентежити навіть вмілого програміста.
З цього тільки один висновок. Випустити формат файлів Office - це корисно і для Microsoft. і для її продукту, але це не робить імпорт або збереження в файли Office простіше. Програми Office шалено складні і багатогранні, і неможливо реалізувати тільки 20% найбільш популярних функцій і ощасливити 80% народу. Специфікація довічних файлів, по суті, збереже тільки кілька хвилин, витрачених на «копирсання» у надзвичайно складній системі.
Так, я обіцяв обхідні шляхи. Хороша новина: для більшості видів ПО писати читання або запис документів Office - невірне рішення. Є дві великі альтернативи: змусити Office робити всю брудну роботу за вас, або скористатися більш простими форматами.
Змусити Office робити брудну роботу за вас.Word і Excel зав'язані на складних об'єктних моделях, заснованих на автоматизації COM, що дозволяє програмно робити все, що завгодно. У багатьох ситуаціях простіше буде використовувати код Office. ніж намагатися реалізувати його з нуля. Ось кілька прикладів.
Такий підхід працює для більшості офісних завдань, які можуть виконуватися на вашому сервері. наприклад:
- Відкрити книгу Excel. записати дані у вхідні осередки, перерахувати і отримати результат у вихідний осередку.
- Використовувати Excel для генерації діаграм в форматі GIF.
- Витягнути будь-яку інформацію з будь-якої таблиці, не думаючи і хвилини про форматах файлів.
- Здійснити конвертацію файл Excel в формат CSV (інший підхід - використовувати ODBC-драйвери Excel і витягнути дані через SQL-запит).
- Редагувати документи Word 'а.
- Заповнювати форми Word 'а.
- Конвертувати дані між десятками різних форматів, які підтримуються Office 'ом.
У всіх цих випадках є способи повідомити об'єктів Officе. що вони працюють не в інтерактивному режимі і перемальовувати екран не потрібно. До речі, якщо ви хочете йти цим шляхом, є кілька пасток, так що перед тим, як почати, прочитайте базу знань Microsoft.
Записувати файли в більш прості формати. Якщо вам потрібно програмно створювати документи, що читаються в Office. є багато інших форматів, які Office впевнено відкриє, не пропустивши жодного байта.
- Якщо вам потрібно переводити табличні дані в Excel. спробуйте CSV.
- Якщо потрібні табличні розрахунки, які CSV не підтримує, формат WK1 (Lotus 1-2-3) набагато простіше і відкривається Excel 'ем.
- Якщо дуже-дуже потрібно створювати саме файли Excel 'я, знайдіть дуже стару версію ... наприклад, версію 3.0, в якій немає всіх цих складових документів - і збережіть мінімальний файл, в якому є тільки ті функції, які вам потрібні. У цьому файлі буде той мінімум BIFF-записів, які вам буде потрібно записувати; так що вам доведеться реалізувати тільки цю частину специфікації.
- Якщо потрібна взаємодія з Word 'ом, можна використовувати HTML. Word добре відкриває його.
- А якщо потрібно складне оформлення, ваш вибір - RTF. Все, що є в Word. можна записати в RTF. Але це текстовий формат, а не двійковий - так що можна замінити частину даних, і файл залишиться коректним. Наприклад, створюєте в Word 'е красиво відформатований документ з «заглушками» на місці даних, і за допомогою простої текстової заміни підміняєте їх на льоту. Цей RTF буде відмінно відкриватися в будь-якої версії Word.
У будь-якому випадку, якщо ви дійсно збираєтеся створити конкурента Office. який буде зчитувати і записувати всі документи Office. у вас попереду тисячі людино-років роботи. А якщо немає - зчитування і запис двійкових форматів Office буде найбільш трудомістким етапом у вашій роботі, але без нього цілком можна обійтися.