<?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 vượt trội hơn XLSX on File Format Blog</title>
    <link>https://blog.fileformat.com/vi/tag/xlsb-v%C6%B0%E1%BB%A3t-tr%E1%BB%99i-h%C6%A1n-xlsx/</link>
    <description>Recent content in XLSB vượt trội hơn XLSX on File Format Blog</description>
    <generator>Hugo -- gohugo.io</generator>
    <language>vi</language>
    <lastBuildDate>Wed, 30 Sep 2026 00:00:00 +0000</lastBuildDate><atom:link href="https://blog.fileformat.com/vi/tag/xlsb-v%C6%B0%E1%BB%A3t-tr%E1%BB%99i-h%C6%A1n-xlsx/index.xml" rel="self" type="application/rss+xml" />
    <item>
      <title>XLSB vs XLSX cho Bộ Dữ Liệu Lớn: Hướng Dẫn Hiệu Suất Dành Cho Nhà Phát Triển</title>
      <link>https://blog.fileformat.com/vi/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/vi/spreadsheet/xlsb-vs-xlsx-for-large-data-sets-a-developers-performance-guide/</guid>
      <description>Khám phá lý do tại sao XLSB vượt trội hơn XLSX đối với các bộ dữ liệu lớn. Tìm hiểu cơ chế nén, việc sử dụng bộ nhớ, các bài kiểm tra hiệu năng Python/C#, và khi nào nên chọn định dạng nhị phân thay vì XML.</description>
      <content:encoded><![CDATA[<p><strong>Cập nhật lần cuối</strong>: 30 Sept, 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-cho-bộ-dữ-liệu-lớn-hướng-dẫn-hiệu-suất-dành-cho-nhà-phát-triển">XLSB vs XLSX cho Bộ Dữ Liệu Lớn: Hướng Dẫn Hiệu Suất Dành Cho Nhà Phát Triển</h2>
<p>Nếu bạn xây dựng các pipeline dữ liệu, công cụ báo cáo backend, hoặc công cụ phân tích giao tiếp với Microsoft Excel, bạn có thể đã gặp phải &ldquo;bức tường&rdquo;.</p>
<p>Một người dùng tải lên một workbook có 450.000 dòng. Máy chủ của bạn khởi tạo các luồng công nhân, mức tiêu thụ bộ nhớ tăng lên tới gigabyte, quá trình thu gom rác làm đóng băng thời gian chạy, và quá trình thực thi của bạn bị hết thời gian. Bạn kiểm tra payload: đó là một tệp <code>.xlsx</code> tiêu chuẩn.</p>
<p>Để giải quyết vấn đề này, các nhà phát triển thường mất hàng ngày để triển khai việc chia thành các khối, các bộ phân tích luồng, hoặc chuyển tải tệp sang các worker nền. Tuy nhiên, một trong những tối ưu hóa hiệu quả nhất không yêu cầu thiết kế kiến trúc lại: thay đổi phần mở rộng tệp từ <code>.xlsx</code> sang <code>.xlsb</code>.</p>
<p>Trong hướng dẫn này, chúng tôi sẽ khám phá sâu bên trong cả hai định dạng, xem xét lý do tại sao kiến trúc nội bộ của chúng tạo ra các đặc tính hiệu năng khác nhau một cách đáng kể, so sánh các benchmark cụ thể trên Python và .NET, và đưa ra các quy tắc rõ ràng về thời điểm triển khai workbook nhị phân trong môi trường sản xuất.</p>
<h2 id="1-bên-trong-openxml-vs-biff12">1. Bên Trong: OpenXML vs. BIFF12</h2>
<p>Để hiểu tại sao hiệu năng lại khác biệt đến mức đáng kể trên các bộ dữ liệu lớn, chúng ta phải xem xét cách mỗi định dạng lưu trữ các bản ghi trên đĩa.</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>Cả các tệp <code>.xlsx</code> và <code>.xlsb</code> đều là các container ZIP được nén tuân theo Open Packaging Conventions (OPC). Nếu bạn đổi tên bất kỳ tệp nào thành <code>.zip</code> và giải nén, bạn sẽ thấy cấu trúc thư mục quen thuộc: <code>_rels</code>, <code>docProps</code>, và <code>xl/worksheets/</code>.</p>
<p>Sự khác biệt quan trọng nằm trong thư mục <code>xl/worksheets/</code>:</p>
<ul>
<li><strong>XLSX lưu các sheet dưới dạng văn bản XML thuần (<code>sheet1.xml</code>).</strong></li>
<li><strong>XLSB lưu các sheet dưới dạng luồng nhị phân độc quyền (<code>sheet1.bin</code>), được mã hoá bằng BIFF12 của Microsoft (Binary Interchange File Format 12).</strong></li>
</ul>
<h3 id="cách-xlsx1-mã-hoá-dữ-liệu-xml-dom-overhead">Cách <a href="https://docs.fileformat.com/spreadsheet/xlsx/">XLSX</a> Mã hoá Dữ liệu (XML DOM Overhead)</h3>
<p>Trong một worksheet XLSX, mỗi ô được khai báo bằng các thẻ XML rõ ràng:</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>Khi đọc hàng này, môi trường thực thi của bạn phải:</p>
<ol>
<li>Giải nén luồng deflate thô thành văn bản.</li>
<li>Phân tách và phân tích các ký tự chuỗi thành một DOM XML hoặc luồng sự kiện SAX.</li>
<li>Xác thực các thẻ mở và đóng (<code>&lt;c&gt;</code>, <code>&lt;/c&gt;</code>, <code>&lt;v&gt;</code>, <code>&lt;/v&gt;</code>).</li>
<li>Giải quyết việc tra cứu chuỗi từ bảng <code>sharedStrings.xml</code> riêng biệt.</li>
<li>Phân tích văn bản ASCII <code>&quot;98234.55&quot;</code> thành số thực dấu phẩy động 64-bit IEEE 754.</li>
</ol>
<p>Mỗi ô riêng lẻ đều gây tốn tài nguyên CPU cho việc phân tích chuỗi, cấp phát chuỗi và phân tích từ vựng. Nhân điều này với 500.000 hàng và 30 cột (15 triệu ô), và CPU tiêu tốn rất nhiều chu kỳ hơn cho việc phân tích cú pháp so với xử lý các giá trị miền.</p>
<h3 id="cách-xlsb3-mã-hoá-dữ-liệu-biff12-binary-stream">Cách <a href="https://docs.fileformat.com/spreadsheet/xlsb/">XLSB</a> Mã hoá Dữ liệu (BIFF12 Binary Stream)</h3>
<p>BIFF12 loại bỏ hoàn toàn việc tuần tự hoá văn bản. Thay vì đánh dấu chuỗi, dữ liệu được sắp xếp thành một chuỗi tuần tự các bản ghi nhị phân có độ dài biến đổi:</p>
<pre tabindex="0"><code>[Record Type: 2 bytes] [Record Length: 4 bytes] [Payload: N bytes]
</code></pre><p>Một ô số thực trong BIFF12 không sử dụng biểu diễn chuỗi như <code>&quot;98234.55&quot;</code>. Nó được biểu diễn trực tiếp:</p>
<ul>
<li>2 byte cho ID bản ghi (ví dụ: <code>BrtCellRk</code> hoặc <code>BrtCellReal</code>)</li>
<li>4 byte cho chỉ số cột/hàng</li>
<li>8 byte chứa cấu trúc byte thô, độ chính xác đôi IEEE 754</li>
</ul>
<p>Khi trình phân tích của bạn đọc một tệp XLSB, nó bỏ qua hoàn toàn việc phân tích từ vựng. Nó đọc tiêu đề bản ghi, lấy 8 byte thô từ bộ đệm, sao chép chúng trực tiếp vào bộ nhớ và di chuyển con trỏ lên. Không có thẻ nào cần xác thực, không có chuyển đổi kiểu chuỗi sang số, và không có chi phí giải mã UTF-8 cho dữ liệu số.</p>
<h2 id="2-các-tiêu-chuẩn-định-lượng-đĩa-bộ-nhớ-và-thông-lượng">2. Các tiêu chuẩn định lượng: Đĩa, Bộ nhớ và Thông lượng</h2>
<p>Để minh họa tác động thực tế, hãy xem xét một bộ dữ liệu mô phỏng chứa <strong>750,000 hàng và 25 cột</strong> (sự kết hợp của dấu thời gian, số thực dấu chấm động, số nguyên và mã danh mục).</p>
<p>Các bài kiểm tra dưới đây đánh giá dữ liệu bảng giống nhau được lưu dưới dạng XLSX và XLSB.</p>
<h3 id="môi-trường-kiểm-thử">Môi trường Kiểm thử</h3>
<ul>
<li><strong>CPU:</strong> AMD Ryzen 9 5900X (12 lõi, 24 luồng)</li>
<li><strong>RAM:</strong> 64 GB DDR4-3600</li>
<li><strong>Lưu trữ:</strong> PCIe 4.0 NVMe SSD</li>
<li><strong>Thời gian chạy:</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="các-chỉ-số-hiệu-suất-chính">Các chỉ số Hiệu suất chính</h3>
<table>
<thead>
<tr>
<th style="text-align:left">Chỉ số</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">Delta / Cải thiện</th>
</tr>
</thead>
<tbody>
<tr>
<td style="text-align:left"><strong>Kích thước tệp trên đĩa</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% nhỏ hơn</strong></td>
</tr>
<tr>
<td style="text-align:left"><strong>Thời gian Lưu / Tuần tự hoá</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>Nhanh hơn 3.0x</strong></td>
</tr>
<tr>
<td style="text-align:left"><strong>Thời gian Đọc (Python DOM parser)</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>Nhanh hơn 4.3x</strong></td>
</tr>
<tr>
<td style="text-align:left"><strong>Thời gian đọc (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 nhanh hơn</strong></td>
</tr>
<tr>
<td style="text-align:left"><strong>Bộ nhớ Heap tối đa trong quá trình đọc</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% giảm</strong></td>
</tr>
</tbody>
</table>
<h3 id="tại-sao-tệp-xlsb-nhỏ-hơn">Tại sao Tệp XLSB Nhỏ hơn</h3>
<p>Trong khi cả hai định dạng đều sử dụng nén ZIP tiêu chuẩn, các luồng nhị phân nén hiệu quả hơn nhiều so với văn bản XML phình to:</p>
<ol>
<li><strong>Cú pháp dư thừa được loại bỏ:</strong> XML chứa các thẻ lặp lại (<code>&lt;c r=\&quot;AA1\&quot; s=\&quot;1\&quot;&gt;</code>) trên mỗi bản ghi. Trong khi nén ZIP giảm bớt các chuỗi lặp lại, luồng dữ liệu chưa nén vẫn rất lớn.</li>
<li><strong>Mật độ số:</strong> Trong XML, số <code>12345678.9012</code> cần 14 byte văn bản ASCII. Trong BIFF12, nó được lưu dưới dạng số thực 8-byte (hoặc nén vào bản ghi <code>RK</code> 4-byte nếu phù hợp với các quy tắc độ chính xác cụ thể).</li>
</ol>
<h2 id="3-dấu-chân-bộ-nhớ-và-áp-lực-thu-gom-rác">3. Dấu chân bộ nhớ và áp lực thu gom rác</h2>
<p>Đối với các dịch vụ web và microservice xử lý các yêu cầu đồng thời, tốc độ CPU chỉ là một nửa cuộc chiến; <strong>dấu chân bộ nhớ</strong> là nơi các ứng dụng thực sự gặp khó khăn.</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>Khi một trình phân tích XML xử lý tệp XLSX 100 MB, nó phải tạo ra hàng ngàn token chuỗi tạm thời, bộ đệm cắt chuỗi và tra cứu từ điển. Trong các ngôn ngữ có thu gom rác (Java, C#, Go, Node.js, Python), điều này tạo ra sự phân mảnh heap cực độ và đẩy thời gian chạy vào các khoảng dừng Thu Gom Rác (GC) thường xuyên.</p>
<p>Vì việc phân tích XLSB hoạt động trực tiếp trên các đoạn byte có độ rộng cố định, các bộ phân tích có thể đọc dữ liệu vào các cấu trúc được cấp phát trên stack hoặc các bộ đệm byte có thể tái sử dụng. Kết quả là dung lượng bộ nhớ giảm đáng kể và không gây thrashing cho bộ cấp phát runtime.</p>
<h2 id="4-ví-dụ-triển-khai-cho-nhà-phát-triển">4. Ví dụ triển khai cho nhà phát triển</h2>
<p>Hãy xem cách tận dụng XLSB trong các chuỗi công cụ phổ biến của nhà phát triển.</p>
<h3 id="python-di-chuyển-từ-openpyxl-sang-calamine--pyxlsb">Python: Di chuyển từ OpenPyXL sang Calamine / PyXLSB</h3>
<p>Mặc định <code>pandas.read_excel('data.xlsx')</code> sử dụng <code>openpyxl</code>, tạo ra một cây dữ liệu nặng trong bộ nhớ.</p>
<p>Để xử lý các tệp XLSB lớn với tốc độ tối đa, hãy sử dụng engine <code>calamine</code> được hỗ trợ bởi Rust (có sẵn qua <code>python-calamine</code> và được tích hợp vào Pandas hiện đại):</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>Nếu bạn đang duyệt qua các tập dữ liệu khổng lồ theo từng hàng mà không tải toàn bộ ma trận vào DataFrame, <code>pyxlsb</code> cung cấp một iterator streaming nhẹ:</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-nhập-luồng-hiệu-suất-cao">C# / .NET: Nhập luồng hiệu suất cao</h3>
<p>Trong .NET, các thư viện như <code>ClosedXML</code> hoặc <code>EPPlus</code> rất tốt cho việc tạo file tiêu chuẩn, nhưng để nhập các tệp lớn mà không gây cạn kiệt bộ nhớ, <code>ExcelDataReader</code> hỗ trợ XLSB lại cực kỳ nhanh:</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-các-đánh-đổi-kiến-trúc-khi-không-nên-sử-dụng-xlsb">5. Các đánh đổi kiến trúc: Khi không nên sử dụng XLSB</h2>
<p>Mặc dù có những lợi thế về hiệu năng vượt trội, XLSB không phải là giải pháp toàn diện. Bạn nên cân nhắc một số đánh đổi vận hành trước khi áp dụng nó trên toàn bộ hệ thống của mình:</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-hệ-sinh-thái-và-hỗ-trợ-thư-viện">1. Hệ sinh thái và hỗ trợ thư viện</h3>
<ul>
<li><strong>XLSX:</strong> Phổ biến. Hầu như mọi ngôn ngữ, thư viện, công cụ SaaS (Google Sheets, Airtable, Tableau), và bộ phân tích web đều hỗ trợ OpenXML một cách tự nhiên.</li>
<li><strong>XLSB:</strong> Ít phổ biến hơn. Trong khi Excel, LibreOffice và các thư viện phát triển trưởng thành (<code>ExcelDataReader</code>, <code>pyxlsb</code>, <code>calamine</code>, <code>Aspose</code>) hỗ trợ nó, nhiều gói nhẹ hoặc các bộ phân tích JavaScript thuần web (như các phiên bản cũ của <code>SheetJS</code>) chỉ có hỗ trợ hạn chế hoặc chỉ đọc.</li>
</ul>
<h3 id="2-so-sánh-diff-git--kiểm-soát-phiên-bản">2. So sánh (diff) Git &amp; Kiểm soát phiên bản</h3>
<ul>
<li><strong>XLSX:</strong> Vì nó chứa XML dạng văn bản bên trong một container ZIP, các tiện ích dòng lệnh và hook Git có thể giải nén và định dạng XML để tạo ra các diff cấu trúc có thể đọc được giữa các commit.</li>
<li><strong>XLSB:</strong> Dữ liệu nhị phân thuần. Các hệ thống kiểm soát phiên bản coi nó hoàn toàn là một khối nhị phân không trong suốt, loại bỏ mọi khả năng diff chi tiết hoặc hợp nhất ở mức dòng.</li>
</ul>
<h3 id="3-kết-xuất-trên-trình-duyệt-web">3. Kết xuất trên trình duyệt web</h3>
<p>Nếu kiến trúc của bạn dựa vào việc hiển thị bảng tính trực tiếp trong trình duyệt qua WebAssembly hoặc JavaScript phía client, các bộ phân tích XLSX đáng kể hơn về độ trưởng thành và ít gặp lỗi hiển thị trường hợp đặc biệt hơn so với các bộ phân tích nhị phân phía client.</p>
<h3 id="4-các-pipeline-nhập-liệu-của-bên-thứ-ba">4. Các pipeline nhập liệu của bên thứ ba</h3>
<p>Nếu bạn đang xuất tệp cho khách hàng doanh nghiệp bên ngoài, nhiều chính sách bảo mật doanh nghiệp nghiêm ngặt sẽ đánh dấu các tệp <code>.xlsb</code>. Vì các tệp BIFF12 có thể lưu trữ macro VBA giống hệt các tệp <code>.xlsm</code> (mà không cần phần mở rộng riêng), một số bộ lọc thư và trình quét tường lửa sẽ cách ly các tệp tải lên <code>.xlsb</code> như là các mối đe dọa tiềm năng có macro.</p>
<h2 id="6-so-sánh-tổng-quan-định-dạng-nào-thắng">6. So sánh tổng quan: Định dạng nào thắng?</h2>
<table>
<thead>
<tr>
<th style="text-align:left">Tính năng</th>
<th style="text-align:left">XLSX</th>
<th style="text-align:left">XLSB</th>
<th style="text-align:left">Thắng</th>
</tr>
</thead>
<tbody>
<tr>
<td style="text-align:left"><strong>Tốc độ Đọc / Phân tích</strong></td>
<td style="text-align:left">Trung bình đến Kém</td>
<td style="text-align:left">Rất nhanh</td>
<td style="text-align:left"><strong>XLSB</strong></td>
</tr>
<tr>
<td style="text-align:left"><strong>Tốc độ Ghi / Tạo</strong></td>
<td style="text-align:left">Yêu cầu CPU cao</td>
<td style="text-align:left">Nhanh</td>
<td style="text-align:left"><strong>XLSB</strong></td>
</tr>
<tr>
<td style="text-align:left"><strong>Nén Tập Tin</strong></td>
<td style="text-align:left">Tốt</td>
<td style="text-align:left">Xuất sắc (~40-50% smaller)</td>
<td style="text-align:left"><strong>XLSB</strong></td>
</tr>
<tr>
<td style="text-align:left"><strong>Phân bổ bộ nhớ</strong></td>
<td style="text-align:left">Cao (Áp lực GC nặng)</td>
<td style="text-align:left">Thấp (Đọc byte trực tiếp)</td>
<td style="text-align:left"><strong>XLSB</strong></td>
</tr>
<tr>
<td style="text-align:left"><strong>Tính tương thích công cụ</strong></td>
<td style="text-align:left">Toàn cầu</td>
<td style="text-align:left">Cao, nhưng có chọn lọc</td>
<td style="text-align:left"><strong>XLSX</strong></td>
</tr>
<tr>
<td style="text-align:left"><strong>Ma sát trong quét bảo mật</strong></td>
<td style="text-align:left">Tối thiểu</td>
<td style="text-align:left">Thỉnh thoảng có kết quả dương tính giả</td>
<td style="text-align:left"><strong>XLSX</strong></td>
</tr>
<tr>
<td style="text-align:left"><strong>Khả năng macro</strong></td>
<td style="text-align:left">Không (<code>.xlsm</code> required)</td>
<td style="text-align:left">Có (Hỗ trợ macro một cách tự nhiên)</td>
<td style="text-align:left"><strong>Hòa</strong></td>
</tr>
</tbody>
</table>
<h2 id="7-phán-quyết-của-nhà-phát-triển">7. Phán quyết của nhà phát triển</h2>
<p>Sử dụng <strong>XLSX</strong> khi:</p>
<ul>
<li>Các tệp có kích thước nhỏ đến vừa (&lt; 50,000 rows).</li>
<li>Các tệp của bạn phải được nhập bởi các nền tảng SaaS của bên thứ ba hoặc các ứng dụng tiêu dùng (ví dụ: Google Sheets).</li>
<li>Bạn không thể kiểm soát môi trường của khách hàng cuối khi đọc tệp.</li>
</ul>
<p>Chuyển sang <strong>XLSB</strong> khi:</p>
<ul>
<li>Bạn đang xây dựng các pipeline nội bộ, công việc batch, hệ thống ETL, hoặc các tác vụ worker xử lý các trích xuất dữ liệu khổng lồ (&gt; 100,000 rows).</li>
<li>Các máy chủ của bạn đang gặp lỗi hết bộ nhớ (OOM) trong quá trình tuần tự hoá hoặc giải tuần tự hoá bảng tính.</li>
<li>Bạn cần giảm thiểu dung lượng lưu trữ S3/blob và thời gian truyền mạng cho các mô hình tài chính định kỳ lớn hoặc việc xuất dữ liệu.</li>
</ul>
<p>Việc chuyển sang XLSB thường chỉ đơn giản là thay đổi một chuỗi cấu hình trong dịch vụ xuất dữ liệu của bạn, nhưng nó mang lại mức tăng năng suất từ 3x đến 5x, thường đòi hỏi hàng tuần tối ưu mã.</p>
<h2 id="câu-hỏi-thường-gặp-faq">Câu hỏi thường gặp (FAQ)</h2>
<p>**Q1: Một tệp <a href="https://docs.fileformat.com/spreadsheet/xlsb/">XLSB</a> có hỗ trợ cùng giới hạn hàng và cột chính xác như tệp <a href="https://docs.fileformat.com/spreadsheet/xlsx/">XLSX</a> không?
Có; cả XLSB và XLSX đều có cùng giới hạn lưới chính xác là 1,048,576 hàng và 16,384 cột cho mỗi bảng tính.</p>
<p>**Q2: Liệu tệp XLSB có thể lưu trữ macro VBA một cách an toàn mà không cần thay đổi phần mở rộng tệp không?
Có, không giống như XLSX (cần lưu dưới dạng XLSM để thực thi mã), XLSB hỗ trợ lưu trữ macro VBA nhị phân một cách nguyên bản trong cùng định dạng tệp <code>.xlsb</code>.</p>
<p>**Q3: Tại sao lưu tệp dưới dạng XLSB lại giảm kích thước nếu cả hai định dạng đã được nén ZIP?
XLSB loại bỏ các thẻ đánh dấu văn bản dài dòng và mã hoá vị trí ô, bản ghi và các giá trị số thô thành các luồng byte nhị phân chặt chẽ, nén lại dày đặc hơn nhiều so với các chuỗi XML thuần.</p>
<p>**Q4: Google Sheets có thể nhập và chỉnh sửa tệp XLSB trực tiếp không?
Không; Google Sheets không thể mở hoặc chuyển đổi tệp <code>.xlsb</code> một cách tự nhiên, yêu cầu bạn phải chuyển chúng sang <code>.xlsx</code> hoặc CSV trước khi nhập.</p>
<p>**Q5: Các tệp XLSB có dễ bị hỏng dữ liệu hơn so với tệp XLSX không?
Trong khi các tệp XML đôi khi có thể được kiểm tra hoặc sửa chữa thủ công bằng trình soạn thảo văn bản khi bị hỏng một phần, các luồng nhị phân BIFF12 yêu cầu các offset byte chặt chẽ và rất khó khôi phục thủ công nếu các sector cấu trúc bị hỏng.</p>
<h2 id="xem-thêm">Xem Thêm</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 năm 2026: Định dạng bảng tính tốt nhất cho nhà phát triển</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 - Lựa chọn định dạng bảng tính phù hợp</a></li>
<li><a href="https://blog.fileformat.com/spreadsheet/what-is-excel/">Excel là gì? Thông tin quan trọng bạn cần biết</a></li>
<li><a href="https://blog.fileformat.com/spreadsheet/excel-file-extensions-xlsx-xlsm-xls-xltx-xltm/">Định dạng tệp Excel: XLSX, XLSM, XLS, XLTX, XLTM</a></li>
<li><a href="https://blog.fileformat.com/spreadsheet/xls-vs-xlsx/">Sự khác biệt giữa XLS và XLSX</a></li>
</ul>
<!-- raw HTML omitted -->
]]></content:encoded>
    </item>
    
  </channel>
</rss>
