<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:content="http://purl.org/rss/1.0/modules/content/">
  <channel>
    <title>XLSB превосходит XLSX on File Format Blog</title>
    <link>https://blog.fileformat.com/ru/tag/xlsb-%D0%BF%D1%80%D0%B5%D0%B2%D0%BE%D1%81%D1%85%D0%BE%D0%B4%D0%B8%D1%82-xlsx/</link>
    <description>Recent content in XLSB превосходит XLSX on File Format Blog</description>
    <generator>Hugo -- gohugo.io</generator>
    <language>ru</language>
    <lastBuildDate>Wed, 30 Sep 2026 00:00:00 +0000</lastBuildDate><atom:link href="https://blog.fileformat.com/ru/tag/xlsb-%D0%BF%D1%80%D0%B5%D0%B2%D0%BE%D1%81%D1%85%D0%BE%D0%B4%D0%B8%D1%82-xlsx/index.xml" rel="self" type="application/rss+xml" />
    <item>
      <title>XLSB vs XLSX для больших наборов данных: Руководство разработчика по производительности</title>
      <link>https://blog.fileformat.com/ru/spreadsheet/xlsb-vs-xlsx-for-large-data-sets-a-developers-performance-guide/</link>
      <pubDate>Wed, 30 Sep 2026 00:00:00 +0000</pubDate>
      
      <guid>https://blog.fileformat.com/ru/spreadsheet/xlsb-vs-xlsx-for-large-data-sets-a-developers-performance-guide/</guid>
      <description>Узнайте, почему XLSB превосходит XLSX при работе с большими наборами данных. Исследуйте механизмы сжатия, использование памяти, бенчмарки Python/C#, и когда выбирать бинарный формат вместо XML.</description>
      <content:encoded><![CDATA[<p><strong>Последнее обновление</strong>: 30 сент., 2026</p>
<figure class="align-center ">
    <img loading="lazy" src="images/xlsb-vs-xlsx-for-large-data-sets-a-developers-performance-guide.png#center"
         alt="XLSB vs XLSX for Large Data Sets: A Developer’s Performance Guide"/> 
</figure>

<h2 id="xlsb-vs-xlsx-для-больших-наборов-данных-руководство-разработчика-по-производительности">XLSB vs XLSX для больших наборов данных: Руководство разработчика по производительности</h2>
<p>Если вы создаёте конвейеры данных, серверные движки отчетности или аналитические инструменты, взаимодействующие с Microsoft Excel, вы, вероятно, столкнулись с «стеной».</p>
<p>Пользователь загружает книгу с 450 000 строками. Ваш сервер поднимает рабочие потоки, потребление памяти резко возрастает до гигабайтов, сборка мусора замораживает выполнение, и ваш процесс истекает по времени. Вы проверяете полезные данные: это стандартный файл <code>.xlsx</code>.</p>
<p>Чтобы решить эту проблему, разработчики часто тратят дни на внедрение разбиения на части, потоковых парсеров или перенаправление файлов в фоновые задачи. Однако одна из самых эффективных оптимизаций не требует никакого переосмысления архитектуры: изменение расширения файла с <code>.xlsx</code> на <code>.xlsb</code>.</p>
<p>В этом руководстве мы заглянем под капот обоих форматов, изучим, почему их внутренние архитектуры дают радикально разные характеристики производительности, сравним конкретные бенчмарки для Python и .NET и изложим чёткие правила, когда использовать бинарные книги в продакшене.</p>
<h2 id="1-под-капотом-openxml-vs-biff12">1. Под капотом: OpenXML vs. BIFF12</h2>
<p>Чтобы понять, почему производительность так резко различается на больших наборах данных, нам нужно посмотреть, как каждый формат хранит записи на диске.</p>
<pre tabindex="0"><code>       ┌────────────────────────┐         ┌────────────────────────┐
       │     sample.xlsx        │         │      sample.xlsb       │
       │ (ZIP Archive Wrapper)  │         │ (ZIP Archive Wrapper)  │
       └───────────┬────────────┘         └───────────┬────────────┘
                   │                                  │
       ┌───────────▼────────────┐         ┌───────────▼────────────┐
       │   sheet1.xml (UTF-8)   │         │    sheet1.bin (BIFF12) │
       │  Verbose ASCII Tags    │         │ Structured Byte Stream │
       │  &lt;c r=&#34;A1&#34;&gt;&lt;v&gt;42&lt;/v&gt;   │         │ [Opcode][Len][Payload] │
       └────────────────────────┘         └────────────────────────┘
</code></pre><p>Оба файла <code>.xlsx</code> и <code>.xlsb</code> являются сжатыми ZIP‑контейнерами, соответствующими Open Packaging Conventions (OPC). Если переименовать любой из файлов в <code>.zip</code> и извлечь его, вы увидите знакомую структуру каталогов: <code>_rels</code>, <code>docProps</code> и <code>xl/worksheets/</code>.</p>
<p>Ключевое различие находится внутри папки <code>xl/worksheets/</code>:</p>
<ul>
<li><strong>XLSX хранит листы как обычный XML‑текст (<code>sheet1.xml</code>).</strong></li>
<li><strong>XLSB хранит листы как проприетарные бинарные потоки (<code>sheet1.bin</code>), закодированные с использованием BIFF12 от Microsoft (Binary Interchange File Format 12).</strong></li>
</ul>
<h3 id="как-xlsx1-кодирует-данные-xml-dom-overhead">Как <a href="https://docs.fileformat.com/spreadsheet/xlsx/">XLSX</a> кодирует данные (XML DOM Overhead)</h3>
<p>В листе XLSX каждая ячейка объявляется с помощью явных XML‑тегов:</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-xml" data-lang="xml"><span style="display:flex;"><span><span style="color:#f92672">&lt;row</span> <span style="color:#a6e22e">r=</span><span style="color:#e6db74">&#34;1&#34;</span> <span style="color:#a6e22e">spans=</span><span style="color:#e6db74">&#34;1:2&#34;</span><span style="color:#f92672">&gt;</span>
</span></span><span style="display:flex;"><span>    <span style="color:#f92672">&lt;c</span> <span style="color:#a6e22e">r=</span><span style="color:#e6db74">&#34;A1&#34;</span> <span style="color:#a6e22e">t=</span><span style="color:#e6db74">&#34;s&#34;</span><span style="color:#f92672">&gt;</span>
</span></span><span style="display:flex;"><span>        <span style="color:#f92672">&lt;v&gt;</span>142<span style="color:#f92672">&lt;/v&gt;</span>
</span></span><span style="display:flex;"><span>    <span style="color:#f92672">&lt;/c&gt;</span>
</span></span><span style="display:flex;"><span>    <span style="color:#f92672">&lt;c</span> <span style="color:#a6e22e">r=</span><span style="color:#e6db74">&#34;B1&#34;</span><span style="color:#f92672">&gt;</span>
</span></span><span style="display:flex;"><span>        <span style="color:#f92672">&lt;v&gt;</span>98234.55<span style="color:#f92672">&lt;/v&gt;</span>
</span></span><span style="display:flex;"><span>    <span style="color:#f92672">&lt;/c&gt;</span>
</span></span><span style="display:flex;"><span><span style="color:#f92672">&lt;/row&gt;</span>
</span></span></code></pre></div><p>При чтении этой строки ваша среда выполнения должна:</p>
<ol>
<li>Разжать исходный поток deflate в текст.</li>
<li>Токенизировать и разобрать символьные строки в XML‑DOM или поток событий SAX.</li>
<li>Проверьте открывающие и закрывающие теги (<code>&lt;c&gt;</code>, <code>&lt;/c&gt;</code>, <code>&lt;v&gt;</code>, <code>&lt;/v&gt;</code>).</li>
<li>Разрешите поиск строк в отдельной таблице <code>sharedStrings.xml</code>.</li>
<li>Разберите ASCII‑текст <code>\&quot;98234.55\&quot;</code> в 64‑битное число с плавающей запятой по стандарту IEEE 754.</li>
</ol>
<p>Каждая отдельная ячейка требует затрат процессора на разбор строк, их выделение и лексический анализ. Умножьте это на 500 000 строк и 30 столбцов (15 млн ячеек), и процессор тратит значительно больше тактов на разбор синтаксиса, чем на обработку значений домена.</p>
<h3 id="как-xlsb3-кодирует-данные-biff12-binary-stream">Как <a href="https://docs.fileformat.com/spreadsheet/xlsb/">XLSB</a> кодирует данные (BIFF12 Binary Stream)</h3>
<p>BIFF12 полностью отбрасывает сериализацию текста. Вместо разметки строк данные располагаются в виде последовательной последовательности бинарных записей переменной длины:</p>
<pre tabindex="0"><code>[Record Type: 2 bytes] [Record Length: 4 bytes] [Payload: N bytes]
</code></pre><p>Ячейка с плавающей точкой в BIFF12 не использует строковые представления, такие как <code>\&quot;98234.55\&quot;</code>. Она представлена напрямую:</p>
<ul>
<li>2 байта для идентификатора записи (например, <code>BrtCellRk</code> или <code>BrtCellReal</code>)</li>
<li>4 байта для индексов столбца/строки</li>
<li>8 байт, содержащих необработанную структуру байтов двойной точности IEEE 754</li>
</ul>
<p>Когда ваш парсер читает файл XLSB, он полностью обходится без лексического разбора. Он читает заголовок записи, захватывает 8 необработанных байт из буфера, копирует их напрямую в память и перемещает указатель вперёд. Нет тегов для проверки, нет преобразований строк в числа, и нулевые затраты на декодирование UTF-8 для числовых данных.</p>
<h2 id="2-количественные-бенчмарки-диск-память-и-пропускная-способность">2. Количественные бенчмарки: диск, память и пропускная способность</h2>
<p>Чтобы проиллюстрировать реальное влияние, рассмотрим симулированный набор данных, содержащий <strong>750,000 строк и 25 столбцов</strong> (смесь меток времени, чисел с плавающей точкой, целых чисел и кодов категорий).</p>
<p>Ниже приведённые тесты оценивают одинаковые табличные данные, сохранённые как в формате XLSX, так и в XLSB.</p>
<h3 id="тестовая-среда">Тестовая среда</h3>
<ul>
<li><strong>CPU:</strong> AMD Ryzen 9 5900X (12 ядер, 24 потока)</li>
<li><strong>RAM:</strong> 64 ГБ DDR4-3600</li>
<li><strong>Хранилище:</strong> PCIe 4.0 NVMe SSD</li>
<li><strong>Среда выполнения:</strong> Python 3.11 (<code>openpyxl</code>, <code>pyxlsb</code>, <code>calamine</code>) &amp; .NET 8 (<code>ExcelDataReader</code>, <code>ClosedXML</code>)</li>
</ul>
<h3 id="ключевые-метрики-производительности">Ключевые метрики производительности</h3>
<table>
<thead>
<tr>
<th style="text-align:left">Метрика</th>
<th style="text-align:left"><a href="https://docs.fileformat.com/spreadsheet/xlsx/">XLSX</a> (OpenXML)</th>
<th style="text-align:left"><a href="https://docs.fileformat.com/spreadsheet/xlsb/">XLSB</a> (BIFF12)</th>
<th style="text-align:left">Изменение / Улучшение</th>
</tr>
</thead>
<tbody>
<tr>
<td style="text-align:left"><strong>Размер файла на диске</strong></td>
<td style="text-align:left">128.4 MB</td>
<td style="text-align:left">68.2 MB</td>
<td style="text-align:left"><strong>~47% меньше</strong></td>
</tr>
<tr>
<td style="text-align:left"><strong>Сохранение / Время сериализации</strong></td>
<td style="text-align:left">42.6 s</td>
<td style="text-align:left">14.1 s</td>
<td style="text-align:left"><strong>в 3,0 раза быстрее</strong></td>
</tr>
<tr>
<td style="text-align:left"><strong>Время чтения (парсер DOM на Python)</strong></td>
<td style="text-align:left">38.2 s</td>
<td style="text-align:left">8.9 s</td>
<td style="text-align:left"><strong>в 4,3 раза быстрее</strong></td>
</tr>
<tr>
<td style="text-align:left"><strong>Время чтения (Rust/C Engine)</strong></td>
<td style="text-align:left">6.4 s</td>
<td style="text-align:left">1.9 s</td>
<td style="text-align:left"><strong>3.3x быстрее</strong></td>
</tr>
<tr>
<td style="text-align:left"><strong>Пиковое распределение кучи во время чтения</strong></td>
<td style="text-align:left">~1.85 GB</td>
<td style="text-align:left">~510 MB</td>
<td style="text-align:left"><strong>~72% сокращение</strong></td>
</tr>
</tbody>
</table>
<h3 id="почему-файлы-xlsb-меньше">Почему файлы XLSB меньше</h3>
<p>Хотя оба формата используют стандартное ZIP-сжатие, бинарные потоки сжимаются гораздо эффективнее, чем раздутый XML‑текст:</p>
<ol>
<li><strong>Избыточный синтаксис устранён:</strong> XML содержит повторяющиеся теги (<code>&lt;c r=&quot;AA1&quot; s=&quot;1&quot;&gt;</code>) в каждой записи. Хотя ZIP‑сжатие уменьшает повторяющиеся строки, несжатый поток данных огромен.</li>
<li><strong>Плотность чисел:</strong> В XML число <code>12345678.9012</code> требует 14 байт ASCII‑текста. В BIFF12 оно хранится как 8‑байтовый double (или упаковано в 4‑байтовую запись <code>RK</code>, если соответствует определённым правилам точности).</li>
</ol>
<h2 id="3-потребление-памяти-и-нагрузка-сборки-мусора">3. Потребление памяти и нагрузка сборки мусора</h2>
<p>Для веб‑сервисов и микросервисов, обрабатывающих одновременные запросы, скорость процессора — лишь половина задачи; <strong>потребление памяти</strong> — то, где приложения действительно терпят неудачу.</p>
<pre tabindex="0"><code>XLSX Parsing Heap Profile:
[ String Buffer ] -&gt; [ Tokenizer ] -&gt; [ XML DOM Nodes ] -&gt; [ Object Boxing ]
▲ Massive Gen 0/1 heap allocation -&gt; Triggers aggressive Garbage Collection

XLSB Parsing Heap Profile:
[ Byte Buffer ] -&gt; [ Fixed Struct Copy ] -&gt; [ Destination Array ]
▲ Minimal allocations -&gt; Low GC overhead
</code></pre><p>Когда XML‑парсер обрабатывает файл XLSX размером 100 МБ, ему приходится создавать тысячи эфемерных строковых токенов, буферов срезов строк и словарных запросов. В языках с автоматическим управлением памяти (Java, C#, Go, Node.js, Python) это приводит к сильной фрагментации кучи и заставляет среду выполнения часто делать паузы для сборки мусора (GC).</p>
<p>Поскольку разбор XLSB работает напрямую с фиксированными по ширине байтовыми срезами, парсеры могут считывать данные в структуры, размещённые в стеке, или в переиспользуемые байтовые буферы. В результате значительно снижается потребление памяти и нулевое &ldquo;thrashing&rdquo; рантайм‑аллокатора.</p>
<h2 id="4-примеры-реализации-разработчика">4. Примеры реализации разработчика</h2>
<p>Рассмотрим, как использовать XLSB в типичных цепочках инструментов разработчика.</p>
<h3 id="python-переход-от-openpyxl-к-calamine--pyxlsb">Python: переход от OpenPyXL к Calamine / PyXLSB</h3>
<p>Стандартный вызов <code>pandas.read_excel('data.xlsx')</code> по умолчанию использует <code>openpyxl</code>, который создает тяжёлое дерево в памяти.</p>
<p>Чтобы обрабатывать большие файлы XLSB с максимальной скоростью, используйте движок <code>calamine</code>, написанный на Rust (доступен через <code>python-calamine</code> и интегрирован в современные версии Pandas):</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-python" data-lang="python"><span style="display:flex;"><span><span style="color:#f92672">import</span> pandas <span style="color:#66d9ef">as</span> pd
</span></span><span style="display:flex;"><span><span style="color:#f92672">import</span> time
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>filename_xlsx <span style="color:#f92672">=</span> <span style="color:#e6db74">&#34;large_dataset.xlsx&#34;</span>
</span></span><span style="display:flex;"><span>filename_xlsb <span style="color:#f92672">=</span> <span style="color:#e6db74">&#34;large_dataset.xlsb&#34;</span>
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span><span style="color:#75715e"># Reading standard XLSX (uses openpyxl by default)</span>
</span></span><span style="display:flex;"><span>t0 <span style="color:#f92672">=</span> time<span style="color:#f92672">.</span>perf_counter()
</span></span><span style="display:flex;"><span>df_xlsx <span style="color:#f92672">=</span> pd<span style="color:#f92672">.</span>read_excel(filename_xlsx, engine<span style="color:#f92672">=</span><span style="color:#e6db74">&#34;openpyxl&#34;</span>)
</span></span><span style="display:flex;"><span>print(<span style="color:#e6db74">f</span><span style="color:#e6db74">&#34;XLSX loaded in </span><span style="color:#e6db74">{</span>time<span style="color:#f92672">.</span>perf_counter() <span style="color:#f92672">-</span> t0<span style="color:#e6db74">:</span><span style="color:#e6db74">.2f</span><span style="color:#e6db74">}</span><span style="color:#e6db74">s&#34;</span>)
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span><span style="color:#75715e"># Reading XLSB with Calamine (Rust engine)</span>
</span></span><span style="display:flex;"><span>t0 <span style="color:#f92672">=</span> time<span style="color:#f92672">.</span>perf_counter()
</span></span><span style="display:flex;"><span>df_xlsb <span style="color:#f92672">=</span> pd<span style="color:#f92672">.</span>read_excel(filename_xlsb, engine<span style="color:#f92672">=</span><span style="color:#e6db74">&#34;calamine&#34;</span>)
</span></span><span style="display:flex;"><span>print(<span style="color:#e6db74">f</span><span style="color:#e6db74">&#34;XLSB loaded in </span><span style="color:#e6db74">{</span>time<span style="color:#f92672">.</span>perf_counter() <span style="color:#f92672">-</span> t0<span style="color:#e6db74">:</span><span style="color:#e6db74">.2f</span><span style="color:#e6db74">}</span><span style="color:#e6db74">s&#34;</span>)
</span></span></code></pre></div><p>Если вы перебираете огромные наборы данных построчно, не загружая всю матрицу в DataFrame, <code>pyxlsb</code> предоставляет лёгкий потоковый итератор:</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-python" data-lang="python"><span style="display:flex;"><span><span style="color:#f92672">from</span> pyxlsb <span style="color:#f92672">import</span> open_workbook
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>total_sum <span style="color:#f92672">=</span> <span style="color:#ae81ff">0.0</span>
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span><span style="color:#66d9ef">with</span> open_workbook(<span style="color:#e6db74">&#34;massive_export.xlsb&#34;</span>) <span style="color:#66d9ef">as</span> wb:
</span></span><span style="display:flex;"><span>    <span style="color:#66d9ef">with</span> wb<span style="color:#f92672">.</span>get_sheet(<span style="color:#ae81ff">1</span>) <span style="color:#66d9ef">as</span> sheet:
</span></span><span style="display:flex;"><span>        <span style="color:#66d9ef">for</span> row <span style="color:#f92672">in</span> sheet:
</span></span><span style="display:flex;"><span>            <span style="color:#75715e"># Cell 0 contains an RK integer or Double float</span>
</span></span><span style="display:flex;"><span>            val <span style="color:#f92672">=</span> row[<span style="color:#ae81ff">0</span>]<span style="color:#f92672">.</span>v
</span></span><span style="display:flex;"><span>            <span style="color:#66d9ef">if</span> val <span style="color:#f92672">is</span> <span style="color:#f92672">not</span> <span style="color:#66d9ef">None</span>:
</span></span><span style="display:flex;"><span>                total_sum <span style="color:#f92672">+=</span> val
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>print(<span style="color:#e6db74">f</span><span style="color:#e6db74">&#34;Aggregated Total: </span><span style="color:#e6db74">{</span>total_sum<span style="color:#e6db74">}</span><span style="color:#e6db74">&#34;</span>)
</span></span></code></pre></div><h3 id="c--net-высокопроизводительное-потоковое-потребление">C# / .NET: Высокопроизводительное потоковое потребление</h3>
<p>В .NET библиотеки такие как <code>ClosedXML</code> или <code>EPPlus</code> отлично подходят для стандартной генерации, но для чтения больших файлов без исчерпания памяти <code>ExcelDataReader</code> с поддержкой XLSB работает исключительно быстро:</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-csharp" data-lang="csharp"><span style="display:flex;"><span><span style="color:#66d9ef">using</span> System;
</span></span><span style="display:flex;"><span><span style="color:#66d9ef">using</span> System.IO;
</span></span><span style="display:flex;"><span><span style="color:#66d9ef">using</span> ExcelDataReader;
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span><span style="color:#66d9ef">public</span> <span style="color:#66d9ef">class</span> <span style="color:#a6e22e">XlsbProcessor</span>
</span></span><span style="display:flex;"><span>{
</span></span><span style="display:flex;"><span>    <span style="color:#66d9ef">public</span> <span style="color:#66d9ef">static</span> <span style="color:#66d9ef">void</span> ProcessBinarySheet(<span style="color:#66d9ef">string</span> filePath)
</span></span><span style="display:flex;"><span>    {
</span></span><span style="display:flex;"><span>        <span style="color:#75715e">// ExcelDataReader automatically identifies BIFF12 from file headers</span>
</span></span><span style="display:flex;"><span>        <span style="color:#66d9ef">using</span> var stream = File.Open(filePath, FileMode.Open, FileAccess.Read, FileShare.Read);
</span></span><span style="display:flex;"><span>        <span style="color:#66d9ef">using</span> var reader = ExcelReaderFactory.CreateReader(stream);
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>        <span style="color:#66d9ef">long</span> rowCount = <span style="color:#ae81ff">0</span>;
</span></span><span style="display:flex;"><span>        <span style="color:#66d9ef">double</span> aggregateValue = <span style="color:#ae81ff">0</span>;
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>        <span style="color:#66d9ef">while</span> (reader.Read())
</span></span><span style="display:flex;"><span>        {
</span></span><span style="display:flex;"><span>            rowCount++;
</span></span><span style="display:flex;"><span>            
</span></span><span style="display:flex;"><span>            <span style="color:#75715e">// Read column directly without boxing overhead where possible</span>
</span></span><span style="display:flex;"><span>            <span style="color:#66d9ef">if</span> (!reader.IsDBNull(<span style="color:#ae81ff">0</span>))
</span></span><span style="display:flex;"><span>            {
</span></span><span style="display:flex;"><span>                aggregateValue += reader.GetDouble(<span style="color:#ae81ff">0</span>);
</span></span><span style="display:flex;"><span>            }
</span></span><span style="display:flex;"><span>        }
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>        Console.WriteLine(<span style="color:#e6db74">$&#34;Processed {rowCount:N0} rows. Sum: {aggregateValue:F2}&#34;</span>);
</span></span><span style="display:flex;"><span>    }
</span></span><span style="display:flex;"><span>}
</span></span></code></pre></div><h2 id="5-архитектурные-компромиссы-когда-не-следует-использовать-xlsb">5. Архитектурные компромиссы: Когда НЕ следует использовать XLSB</h2>
<p>Несмотря на его огромные преимущества в производительности, XLSB не является панацеей. Перед тем как внедрять его во всей инфраструктуре, следует оценить несколько эксплуатационных компромиссов:</p>
<pre tabindex="0"><code>                      DECISION MATRIX
                      
               Is file size &gt; 50MB OR 
               rows &gt; 100,000?
                    │
         ┌──────────┴──────────┐
        YES                    NO
         │                     │
   Do third-party        Use standard XLSX
   tools strictly        (Maximum compatibility)
   require OpenXML?
         │
    ┌────┴────┐
   YES        NO
    │         │
Use XLSX   Use XLSB
(Stream)   (Max speed &amp; efficiency)
</code></pre><h3 id="1-экосистема-и-поддержка-библиотек">1. Экосистема и поддержка библиотек</h3>
<ul>
<li><strong>XLSX:</strong> Универсальный. Практически каждый язык, библиотека, SaaS‑инструмент (Google Sheets, Airtable, Tableau) и веб‑парсер поддерживают OpenXML из коробки.</li>
<li><strong>XLSB:</strong> Менее распространённый. Хотя Excel, LibreOffice и зрелые библиотеки разработчиков (<code>ExcelDataReader</code>, <code>pyxlsb</code>, <code>calamine</code>, <code>Aspose</code>) поддерживают его, многие лёгкие пакеты или чисто веб‑ориентированные JavaScript‑парсеры (например, более старые сборки <code>SheetJS</code>) имеют ограниченную или только для чтения поддержку.</li>
</ul>
<h3 id="2-сравнение-в-git-и-системах-контроля-версий">2. Сравнение в Git и системах контроля версий</h3>
<ul>
<li><strong>XLSX:</strong> Поскольку он содержит текстовый XML внутри ZIP‑контейнера, утилиты командной строки и Git‑хуки могут распаковывать и форматировать XML, создавая читаемые структурные различия между коммитами.</li>
<li><strong>XLSB:</strong> Чисто бинарные данные. Системы контроля версий рассматривают его как непрозрачный бинарный блоб, исключая любую возможность детального сравнения различий или слияний на уровне строк.</li>
</ul>
<h3 id="3-отображение-в-вебклиенте">3. Отображение в веб‑клиенте</h3>
<p>Если ваша архитектура полагается на непосредственное отображение электронных таблиц в браузере через WebAssembly или клиентский JavaScript, парсеры XLSX значительно более зрелые и менее подвержены ошибкам рендеринга в крайних случаях по сравнению с клиентскими бинарными парсерами.</p>
<h3 id="4-сторонние-конвейеры-потребления">4. Сторонние конвейеры потребления</h3>
<p>Если вы экспортируете файлы для внешних корпоративных клиентов, многие строгие политики корпоративной безопасности помечают файлы <code>.xlsb</code>. Поскольку файлы BIFF12 могут хранить макросы VBA так же, как файлы <code>.xlsm</code> (без необходимости отдельного расширения), некоторые почтовые фильтры и сканеры межсетевых экранов помещают загрузки <code>.xlsb</code> в карантин как потенциальные угрозы с макросами.</p>
<h2 id="6-сводное-сравнение-какой-формат-выигрывает">6. Сводное сравнение: Какой формат выигрывает?</h2>
<table>
<thead>
<tr>
<th style="text-align:left">Функция</th>
<th style="text-align:left">XLSX</th>
<th style="text-align:left">XLSB</th>
<th style="text-align:left">Победитель</th>
</tr>
</thead>
<tbody>
<tr>
<td style="text-align:left"><strong>Скорость чтения / разбора</strong></td>
<td style="text-align:left">Умеренно до плохой</td>
<td style="text-align:left">Молниеносно быстро</td>
<td style="text-align:left"><strong>XLSB</strong></td>
</tr>
<tr>
<td style="text-align:left"><strong>Скорость записи / генерации</strong></td>
<td style="text-align:left">Требовательный к процессору</td>
<td style="text-align:left">Быстро</td>
<td style="text-align:left"><strong>XLSB</strong></td>
</tr>
<tr>
<td style="text-align:left"><strong>Сжатие файлов</strong></td>
<td style="text-align:left">Хорошо</td>
<td style="text-align:left">Отлично (~40-50% smaller)</td>
<td style="text-align:left"><strong>XLSB</strong></td>
</tr>
<tr>
<td style="text-align:left"><strong>Выделение памяти</strong></td>
<td style="text-align:left">Высокий (Сильное давление GC)</td>
<td style="text-align:left">Низкий (Прямое чтение байтов)</td>
<td style="text-align:left"><strong>XLSB</strong></td>
</tr>
<tr>
<td style="text-align:left"><strong>Взаимодействие инструментов</strong></td>
<td style="text-align:left">Универсальная</td>
<td style="text-align:left">Высокий, но избирательный</td>
<td style="text-align:left"><strong>XLSX</strong></td>
</tr>
<tr>
<td style="text-align:left"><strong>Трудности сканирования безопасности</strong></td>
<td style="text-align:left">Минимальный</td>
<td style="text-align:left">Редкие ложные срабатывания</td>
<td style="text-align:left"><strong>XLSX</strong></td>
</tr>
<tr>
<td style="text-align:left"><strong>Возможности макросов</strong></td>
<td style="text-align:left">Нет (<code>.xlsm</code> требуется)</td>
<td style="text-align:left">Да (Поддерживает макросы из коробки)</td>
<td style="text-align:left"><strong>Связать</strong></td>
</tr>
</tbody>
</table>
<h2 id="7-вердикт-разработчика">7. Вердикт разработчика</h2>
<p>Используйте <strong>XLSX</strong>, когда:</p>
<ul>
<li>Файлы небольшие‑среднего размера (&lt; 50 000 строк).</li>
<li>Ваши файлы должны быть импортированы сторонними SaaS‑платформами или потребительскими приложениями (например, Google Sheets).</li>
<li>Вы не можете контролировать среду конечного клиента, читающего файл.</li>
</ul>
<p>Перейдите на <strong>XLSB</strong>, когда:</p>
<ul>
<li>Вы создаёте внутренние конвейеры, пакетные задания, ETL‑системы или рабочие задачи, обрабатывающие огромные извлечения данных (&gt; 100 000 строк).</li>
<li>Ваши серверы сталкиваются с ошибками нехватки памяти (OOM) во время сериализации или десериализации таблиц.</li>
<li>Вам необходимо минимизировать объём хранилища S3/blob и время передачи по сети для больших периодических финансовых моделей или экспорта данных.</li>
</ul>
<p>Переход на XLSB часто сводится к простому изменению строки конфигурации в вашем сервисе экспорта, однако он обеспечивает прирост пропускной способности от 3 до 5 раз, который обычно требует недель оптимизации кода.</p>
<h2 id="часто-задаваемые-вопросы-faq">Часто задаваемые вопросы (FAQ)</h2>
<p>**Q1: Поддерживает ли файл <a href="https://docs.fileformat.com/spreadsheet/xlsb/">XLSB</a> те же самые ограничения по строкам и столбцам, что и файл <a href="https://docs.fileformat.com/spreadsheet/xlsx/">XLSX</a>?
Да; оба формата XLSB и XLSX имеют одинаковый предел сетки — 1 048 576 строк и 16 384 столбца на лист.</p>
<p>**Q2: Может ли файл XLSB безопасно хранить макросы VBA без изменения расширения файла?
Да, в отличие от XLSX (для выполнения кода требуется сохранять как XLSM), XLSB нативно поддерживает бинарное хранение макросов VBA внутри того же формата файла <code>.xlsb</code>.</p>
<p>**Q3: Почему сохранение файла в формате XLSB уменьшает его размер, если оба формата уже сжаты ZIP?
XLSB устраняет громоздкие текстовые теги разметки и кодирует позиции ячеек, записи и необработанные числовые значения в компактные бинарные потоки байтов, которые сжимаются гораздо плотнее, чем обычные строки XML.</p>
<p>**Q4: Может ли Google Sheets импортировать и редактировать файлы XLSB напрямую?
Нет; Google Sheets не может напрямую открывать или конвертировать файлы <code>.xlsb</code>, поэтому необходимо преобразовать их в <code>.xlsx</code> или CSV перед импортом.</p>
<p>**Q5: Склонны ли файлы XLSB к более частому повреждению данных, чем файлы XLSX?
В то время как XML‑файлы иногда можно вручную просмотреть или восстановить с помощью текстового редактора при частичном повреждении, бинарные потоки BIFF12 требуют точных байтовых смещений и их сложно восстановить вручную, если повреждены структурные сектора.</p>
<h2 id="см-также">См. также</h2>
<ul>
<li><a href="https://blog.fileformat.com/en/spreadsheet/csv-vs-xlsx-vs-ods-in-2026-best-spreadsheet-format-for-developers/">CSV vs XLSX vs ODS в 2026 году: лучший формат таблиц для разработчиков</a></li>
<li><a href="https://blog.fileformat.com/en/spreadsheet/xls-vs-xlsx-vs-xlsm-vs-xlsb-choosing-the-right-spreadsheet-format/">XLS vs XLSX vs XLSM vs XLSB — выбор правильного формата таблиц</a></li>
<li><a href="https://blog.fileformat.com/spreadsheet/what-is-excel/">Что такое Excel? Ключевая информация, которую вам нужно знать</a></li>
<li><a href="https://blog.fileformat.com/spreadsheet/excel-file-extensions-xlsx-xlsm-xls-xltx-xltm/">Форматы файлов Excel: XLSX, XLSM, XLS, XLTX, XLTM</a></li>
<li><a href="https://blog.fileformat.com/spreadsheet/xls-vs-xlsx/">Разница между XLS и XLSX</a></li>
</ul>
<!-- raw HTML omitted -->
]]></content:encoded>
    </item>
    
  </channel>
</rss>
