Comments 8
Не бинарная каша, а COM Storage. Объект со своей внутренней файловой системой.
А по существу статьи — ну да, можно свой zlib написать, хоть без сжатия, хоть с ним. И XML — это вообще текст, если на то пошло. Не совсем понятно, в чём достижение. И зачем. Формат ZIP прекрасно описан, как и алгоритмы сжатия. Это можно самому написать на любом ЯП.
А как же очень старые версии эксель? Там, вроде, OLE1. А OLE1 !≈ COM :)
Формат zip допускает сценарий, когда в zip файл дописывают данные. По указанной вами ссылке это упоминается
Иногда бывает невозможно вычислить данные на момент записи
LocalFileHeader
, тогда вcrc32
,compressedSize
иuncompressedSize
записываются нули, третий бит вgeneralPurposeBitFlag
ставится в единицу, а послеLocalFileHeader
добавляется структура типаDataDescriptor
.
но подробно не описано.
В случае с формированием xlsx, docx и pptx, наверное его лучше использовать? Создаёшь заготовку xlsx; удаляешь из него xl\worksheets\sheet1.xml; подготавливаешь архив; а потом при отдаче в поток дописываешь xl\worksheets\sheet1.xml с нужными данными.
Если есть задача формировать документы для отдачи, напр. по http, то да, можно использовать и способ дописывания размера в DataDescriptor. С другой стороны приведенный способ, пойдет только для небольших файлов, т.к. не используется sharedStrings и компрессию, а для таких файлов объем занимаемой памяти десяток килобайт (из них шаблон - 7Кб), так что не проблема сформировать целый документ прямо в памяти.
Генерация Excel-файлов как zip-архива