Чому формати microsoft office такі складні (і як це обійти) - the joel on software translation

Кожна книга 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 буде найбільш трудомістким етапом у вашій роботі, але без нього цілком можна обійтися.

Схожі статті