<?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 vs XLSX on File Format Blog</title>
    <link>https://blog.fileformat.com/ms/tag/xlsb-vs-xlsx/</link>
    <description>Recent content in XLSB vs XLSX on File Format Blog</description>
    <generator>Hugo -- gohugo.io</generator>
    <language>ms</language>
    <lastBuildDate>Wed, 30 Sep 2026 00:00:00 +0000</lastBuildDate><atom:link href="https://blog.fileformat.com/ms/tag/xlsb-vs-xlsx/index.xml" rel="self" type="application/rss+xml" />
    <item>
      <title>XLSB vs XLSX untuk Set Data Besar: Panduan Prestasi Pembangun</title>
      <link>https://blog.fileformat.com/ms/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/ms/spreadsheet/xlsb-vs-xlsx-for-large-data-sets-a-developers-performance-guide/</guid>
      <description>Temui mengapa XLSB mengatasi XLSX untuk set data besar. Selidiki mekanisme pemampatan, penggunaan memori, penanda aras Python/C#, dan bila harus memilih binari berbanding XML.</description>
      <content:encoded><![CDATA[<p><strong>Terakhir Dikemas Kini</strong>: 30 Sep, 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-untuk-set-data-besar-panduan-prestasi-pembangun">XLSB vs XLSX untuk Set Data Besar: Panduan Prestasi Pembangun</h2>
<p>Jika anda membina paip data, enjin pelaporan backend, atau alat analitik yang berinteraksi dengan Microsoft Excel, anda mungkin telah menemui &ldquo;halangan&rdquo;.</p>
<p>Seorang pengguna memuat naik buku kerja 450,000 baris. Pelayan anda memulakan thread pekerja, penggunaan memori melonjak ke gigabait, pengumpulan sampah membekukan masa jalan, dan pelaksanaan anda tamat masa. Anda memeriksa muatan: ia adalah fail <code>.xlsx</code> standard.</p>
<p>Untuk menyelesaikan ini, pemaju sering menghabiskan hari-hari melaksanakan pemecahan, pengurai aliran, atau memindahkan fail ke pekerja latar belakang. Namun, salah satu pengoptimuman paling berkesan memerlukan tiada reka bentuk semula seni bina: menukar sambungan fail dari <code>.xlsx</code> kepada <code>.xlsb</code>.</p>
<p>Dalam panduan ini, kami menyelami selok-belok kedua-dua format, meneliti mengapa seni bina dalaman mereka menghasilkan ciri prestasi yang berbeza secara radikal, membandingkan penanda aras konkrit merentasi Python dan .NET, serta menggariskan peraturan jelas bila menggunakan buku kerja binari dalam produksi.</p>
<h2 id="1-di-sebalik-tabir-openxml-vs-biff12">1. Di Sebalik Tabir: OpenXML vs. BIFF12</h2>
<p>Untuk memahami mengapa prestasi berbeza begitu dramatik pada set data besar, kita mesti melihat bagaimana setiap format menyimpan rekod pada cakera.</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>Kedua-dua fail <code>.xlsx</code> dan <code>.xlsb</code> adalah kontena ZIP termampat yang mematuhi Open Packaging Conventions (OPC). Jika anda menamakan semula mana-mana fail kepada <code>.zip</code> dan mengekstraknya, anda akan melihat susun atur direktori yang biasa: <code>_rels</code>, <code>docProps</code>, dan <code>xl/worksheets/</code>.</p>
<p>Perbezaan kritikal terletak di dalam folder <code>xl/worksheets/</code>:</p>
<ul>
<li><strong>XLSX menyimpan helaian sebagai teks XML biasa (<code>sheet1.xml</code>).</strong></li>
<li><strong>XLSB menyimpan helaian sebagai aliran binari proprietari (<code>sheet1.bin</code>), yang dikodkan menggunakan BIFF12 Microsoft (Binary Interchange File Format 12).</strong></li>
</ul>
<h3 id="bagaimana-xlsx1-menyandikan-data-xml-dom-beban">Bagaimana <a href="https://docs.fileformat.com/spreadsheet/xlsx/">XLSX</a> Menyandikan Data (XML DOM Beban)</h3>
<p>Dalam helaian kerja XLSX, setiap sel diisytiharkan dengan tag XML yang jelas:</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>Apabila membaca baris ini, masa jalan anda mesti:</p>
<ol>
<li>Menyahmampat aliran deflate mentah menjadi teks.</li>
<li>Menjanakan token dan menghurai aksara rentetan ke dalam DOM XML atau aliran acara SAX.</li>
<li>Sahkan tag pembuka dan penutup (<code>&lt;c&gt;</code>, <code>&lt;/c&gt;</code>, <code>&lt;v&gt;</code>, <code>&lt;/v&gt;</code>).</li>
<li>Selesaikan carian rentetan dari jadual <code>sharedStrings.xml</code> yang berasingan.</li>
<li>Huraikan teks ASCII <code>&quot;98234.55&quot;</code> menjadi nombor titik terapung 64-bit IEEE 754.</li>
</ol>
<p>Setiap sel tunggal menyebabkan beban CPU untuk penguraian rentetan, peruntukan rentetan, dan analisis leksikal. Gandakan ini ke atas 500,000 baris dan 30 lajur (15 juta sel), dan CPU membelanjakan jauh lebih banyak kitaran untuk menguraikan sintaks berbanding memproses nilai domain.</p>
<h3 id="bagaimana-xlsb3-menyandikan-data-biff12-binary-stream">Bagaimana <a href="https://docs.fileformat.com/spreadsheet/xlsb/">XLSB</a> Menyandikan Data (BIFF12 Binary Stream)</h3>
<p>BIFF12 membuang penserialan teks sepenuhnya. Daripada penanda rentetan, data disusun sebagai urutan berurutan rekod binari bersaiz berubah:</p>
<pre tabindex="0"><code>[Record Type: 2 bytes] [Record Length: 4 bytes] [Payload: N bytes]
</code></pre><p>Sel titik terapung dalam BIFF12 tidak menggunakan representasi rentetan seperti <code>&quot;98234.55&quot;</code>. Ia diwakili secara langsung:</p>
<ul>
<li>2 bait untuk ID rekod (contoh, <code>BrtCellRk</code> atau <code>BrtCellReal</code>)</li>
<li>4 bait untuk indeks lajur/baris</li>
<li>8 bait yang mengandungi struktur bait mentah IEEE 754 berpresisi berganda</li>
</ul>
<p>Apabila pengurai anda membaca fail XLSB, ia melangkau penguraian leksikal sepenuhnya. Ia membaca pengepala rekod, mengambil 8 bait mentah dari penimbal, menyalinnya terus ke memori, dan menggerakkan penunjuk ke hadapan. Tiada tag untuk disahkan, tiada penukaran jenis rentetan-ke-nombor, dan tiada beban penyahkodan UTF-8 untuk data berangka.</p>
<h2 id="2-penanda-kuantitatif-cakera-memori-dan-kelajuan">2. Penanda Kuantitatif: Cakera, Memori, dan Kelajuan</h2>
<p>Untuk menggambarkan kesan dunia sebenar, pertimbangkan set data simulasi yang mengandungi <strong>750,000 baris dan 25 lajur</strong> (campuran cap masa, nombor titik apung, integer, dan kod kategori).</p>
<p>Ujian di bawah menilai data tabular yang serupa disimpan sebagai XLSX dan XLSB.</p>
<h3 id="persekitaran-ujian">Persekitaran Ujian</h3>
<ul>
<li><strong>CPU:</strong> AMD Ryzen 9 5900X (12 teras, 24 utas)</li>
<li><strong>RAM:</strong> 64 GB DDR4-3600</li>
<li><strong>Storan:</strong> PCIe 4.0 NVMe SSD</li>
<li><strong>Masa Jalan:</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="metrik-prestasi-utama">Metrik Prestasi Utama</h3>
<table>
<thead>
<tr>
<th style="text-align:left">Metrik</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 / Penambahbaikan</th>
</tr>
</thead>
<tbody>
<tr>
<td style="text-align:left"><strong>Saiz Fail pada Cakera</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% lebih kecil</strong></td>
</tr>
<tr>
<td style="text-align:left"><strong>Masa Simpan / Serialisasi</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.0x lebih cepat</strong></td>
</tr>
<tr>
<td style="text-align:left"><strong>Masa Baca (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>4.3x lebih cepat</strong></td>
</tr>
<tr>
<td style="text-align:left"><strong>Masa Baca (Enjin Rust/C)</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 lebih cepat</strong></td>
</tr>
<tr>
<td style="text-align:left"><strong>Peruntukan Heap Puncak semasa Membaca</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% pengurangan</strong></td>
</tr>
</tbody>
</table>
<h3 id="mengapa-fail-xlsx-lebih-kecil">Mengapa Fail XLSX Lebih Kecil</h3>
<p>Walaupun kedua-dua format menggunakan pemampatan ZIP standard, aliran binari memampatkan dengan jauh lebih cekap berbanding teks XML yang berlebihan:</p>
<ol>
<li><strong>Sintaks berlebihan dihapuskan:</strong> XML mengandungi tag berulang (<code>&lt;c r=\&quot;AA1\&quot; s=\&quot;1\&quot;&gt;</code>) pada setiap rekod. Walaupun pemampatan ZIP mengurangkan rentetan yang berulang, aliran data yang tidak dimampatkan sangat besar.</li>
<li><strong>Ketumpatan numerik:</strong> Dalam XML, nombor <code>12345678.9012</code> memerlukan 14 bait teks ASCII. Dalam BIFF12, ia disimpan sebagai double 8-bait (atau dipak dalam rekod <code>RK</code> 4-bait jika ia memenuhi peraturan ketepatan tertentu).</li>
</ol>
<h2 id="3-jejak-memori-dan-tekanan-pengumpulan-sampah">3. Jejak Memori dan Tekanan Pengumpulan Sampah</h2>
<p>Untuk perkhidmatan web dan mikroperkhidmatan yang mengendalikan permintaan serentak, kelajuan CPU hanyalah separuh daripada perjuangan; <strong>jejak memori</strong> adalah tempat aplikasi sebenarnya gagal.</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>Apabila pengurai XML memproses fail XLSX 100 MB, ia mesti mencipta beribu-ribu token rentetan sementara, penampan kepingan rentetan, dan carian kamus. Dalam bahasa yang mengumpul sampah (Java, C#, Go, Node.js, Python), ini menghasilkan fragmentasi timbunan yang melampau dan memaksa masa jalan ke jeda Pengumpulan Sampah (GC) yang kerap.</p>
<p>Kerana penapisan XLSB beroperasi secara langsung pada kepingan bait lebar tetap, parser dapat membaca data ke dalam struktur yang dialokasikan pada stack atau penampung bait yang boleh digunakan semula. Hasilnya ialah jejak memori yang berkurang secara dramatik dan tiada gangguan pada pengagih masa jalan.</p>
<h2 id="4-contoh-pelaksanaan-pembangun">4. Contoh Pelaksanaan Pembangun</h2>
<p>Mari kita lihat bagaimana memanfaatkan XLSB dalam rantaian alat pemaju yang biasa.</p>
<h3 id="python-berpindah-dari-openpyxl-ke-calamine--pyxlsb">Python: Berpindah dari OpenPyXL ke Calamine / PyXLSB</h3>
<p>Standard <code>pandas.read_excel('data.xlsx')</code> secara lalai menggunakan <code>openpyxl</code>, yang membina pokok berat dalam memori.</p>
<p>Untuk memproses fail XLSB yang besar dengan kelajuan maksimum, gunakan enjin <code>calamine</code> yang dikuasakan oleh Rust (tersedia melalui <code>python-calamine</code> dan terintegrasi dalam Pandas moden):</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>Jika anda mengulangi set data besar baris demi baris tanpa memuatkan seluruh matriks ke dalam DataFrame, <code>pyxlsb</code> menyediakan iterator penstriman ringan:</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-pengambilan-aliran-berprestasi-tinggi">C# / .NET: Pengambilan Aliran Berprestasi Tinggi</h3>
<p>Dalam .NET, perpustakaan seperti <code>ClosedXML</code> atau <code>EPPlus</code> sangat baik untuk penjanaan standard, tetapi untuk memasukkan fail besar tanpa kehabisan memori, <code>ExcelDataReader</code> dengan sokongan XLSB sangat pantas:</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-pertukaran-seni-bina-bila-tidak-perlu-menggunakan-xlsb">5. Pertukaran Seni Bina: Bila TIDAK Perlu Menggunakan XLSB</h2>
<p>Walaupun mempunyai kelebihan prestasi yang luar biasa, XLSB bukanlah penyelesaian ajaib. Anda harus menimbang beberapa pertukaran operasi sebelum menguatkannya di seluruh tumpukan anda:</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-ekosistem-dan-sokongan-pustaka">1. Ekosistem dan Sokongan Pustaka</h3>
<ul>
<li><strong>XLSX:</strong> Serbaguna. Hampir setiap bahasa, perpustakaan, alat SaaS (Google Sheets, Airtable, Tableau), dan pengurai web menyokong OpenXML secara asli.</li>
<li><strong>XLSB:</strong> Kurang meluas. Walaupun Excel, LibreOffice, dan perpustakaan pembangun matang (<code>ExcelDataReader</code>, <code>pyxlsb</code>, <code>calamine</code>, <code>Aspose</code>) menyokongnya, banyak pakej ringan atau pengurai JavaScript berasaskan web murni (seperti versi lama <code>SheetJS</code>) mempunyai sokongan terhad atau hanya baca.</li>
</ul>
<h3 id="2-git--perbezaan-kawalan-versi">2. Git &amp; Perbezaan Kawalan Versi</h3>
<ul>
<li><strong>XLSX:</strong> Oleh kerana ia mengandungi teks XML di dalam kontena ZIP, utiliti baris perintah dan hook Git dapat mengekstrak dan memformat XML untuk menghasilkan perbezaan struktur yang boleh dibaca antara komit.</li>
<li><strong>XLSB:</strong> Data binari tulen. Sistem kawalan versi menganggapnya secara ketat sebagai blob binari yang tidak dapat dilihat, menghapuskan sebarang kemungkinan perbezaan terperinci atau gabungan pada peringkat baris.</li>
</ul>
<h3 id="3-rendering-klien-web">3. Rendering Klien Web</h3>
<p>Jika seni bina anda bergantung pada rendering hamparan kerja secara langsung dalam penyemak imbas melalui WebAssembly atau JavaScript sisi klien, pengurai XLSX jauh lebih matang dan kurang terdedah kepada pepijat rendering kes-kes tepi berbanding pengurai binari sisi klien.</p>
<h3 id="4-saluran-pengambilan-pihak-ketiga">4. Saluran Pengambilan Pihak Ketiga</h3>
<p>Jika anda mengeksport fail untuk pelanggan perusahaan luar, banyak dasar keselamatan korporat yang ketat menandakan fail <code>.xlsb</code>. Oleh kerana fail BIFF12 boleh menyimpan makro VBA dengan cara yang sama seperti fail <code>.xlsm</code> (tanpa memerlukan sambungan berasingan), beberapa penapis mel dan pengimbas firewall mengkarantina muatan naik <code>.xlsb</code> sebagai ancaman berpotensi yang mengandungi makro.</p>
<h2 id="6-perbandingan-ringkas-format-mana-yang-menang">6. Perbandingan Ringkas: Format Mana yang Menang?</h2>
<table>
<thead>
<tr>
<th style="text-align:left">Ciri</th>
<th style="text-align:left">XLSX</th>
<th style="text-align:left">XLSB</th>
<th style="text-align:left">Pemenang</th>
</tr>
</thead>
<tbody>
<tr>
<td style="text-align:left"><strong>Kelajuan Baca / Huraikan</strong></td>
<td style="text-align:left">Sederhana hingga Lemah</td>
<td style="text-align:left">Sangat Cepat</td>
<td style="text-align:left"><strong>XLSB</strong></td>
</tr>
<tr>
<td style="text-align:left"><strong>Kelajuan Tulis / Penjanaan</strong></td>
<td style="text-align:left">Berintensiti CPU</td>
<td style="text-align:left">Pantas</td>
<td style="text-align:left"><strong>XLSB</strong></td>
</tr>
<tr>
<td style="text-align:left"><strong>Pemampatan Fail</strong></td>
<td style="text-align:left">Baik</td>
<td style="text-align:left">Cemerlang (~40-50% lebih kecil)</td>
<td style="text-align:left"><strong>XLSB</strong></td>
</tr>
<tr>
<td style="text-align:left"><strong>Peruntukan Memori</strong></td>
<td style="text-align:left">Tinggi (Tekanan GC berat)</td>
<td style="text-align:left">Rendah (Pembacaan bait langsung)</td>
<td style="text-align:left"><strong>XLSB</strong></td>
</tr>
<tr>
<td style="text-align:left"><strong>Interoperabiliti Alat</strong></td>
<td style="text-align:left">Sejagat</td>
<td style="text-align:left">Tinggi, tetapi selektif</td>
<td style="text-align:left"><strong>XLSX</strong></td>
</tr>
<tr>
<td style="text-align:left"><strong>Geseran Pengimbasan Keselamatan</strong></td>
<td style="text-align:left">Minimum</td>
<td style="text-align:left">Positif palsu sesekali</td>
<td style="text-align:left"><strong>XLSX</strong></td>
</tr>
<tr>
<td style="text-align:left"><strong>Keupayaan Makro</strong></td>
<td style="text-align:left">Tidak (<code>.xlsm</code> diperlukan)</td>
<td style="text-align:left">Ya (Menyokong makro secara asli)</td>
<td style="text-align:left"><strong>Ikatan</strong></td>
</tr>
</tbody>
</table>
<h2 id="7-keputusan-pembangun">7. Keputusan Pembangun</h2>
<p>Gunakan <strong>XLSX</strong> apabila:</p>
<ul>
<li>Fail bersaiz kecil hingga sederhana (&lt; 50,000 baris).</li>
<li>Fail anda mesti diambil oleh platform SaaS pihak ketiga atau aplikasi pengguna (contoh, Google Sheets).</li>
<li>Anda tidak dapat mengawal persekitaran klien akhir yang membaca fail.</li>
</ul>
<p>Beralih kepada <strong>XLSB</strong> apabila:</p>
<ul>
<li>Anda sedang membina paip dalaman, kerja batch, sistem ETL, atau tugas pekerja yang mengendalikan ekstrak data besar (&gt; 100,000 baris).</li>
<li>Pelayan anda mengalami ralat memori habis (OOM) semasa penserialan atau penyahserian hamparan kerja.</li>
<li>Anda perlu meminimumkan jejak storan S3/blob dan masa transit rangkaian untuk model kewangan berulang yang besar atau eksport data.</li>
</ul>
<p>Pertukaran kepada XLSB selalunya semudah menukar rentetan konfigurasi dalam perkhidmatan eksport anda, namun ia memberikan peningkatan throughput sebanyak 3x hingga 5x yang biasanya memerlukan minggu-minggu pengoptimuman kod.</p>
<h2 id="soalan-lazim-faq">Soalan Lazim (FAQ)</h2>
<p>**Q1: Adakah fail <a href="https://docs.fileformat.com/spreadsheet/xlsb/">XLSB</a> menyokong had baris dan lajur yang tepat sama seperti fail <a href="https://docs.fileformat.com/spreadsheet/xlsx/">XLSX</a>?
Ya; kedua-dua XLSB dan XLSX berkongsi had atas grid yang sama tepat iaitu 1,048,576 baris dengan 16,384 lajur bagi setiap helaian kerja.</p>
<p>**Q2: Bolehkah fail XLSB menyimpan makro VBA dengan selamat tanpa menukar sambungan failnya?
Ya, tidak seperti XLSX (yang memerlukan penyimpanan sebagai XLSM untuk menjalankan kod), XLSB menyokong penyimpanan makro VBA binari secara asli dalam format fail <code>.xlsb</code> yang sama.</p>
<p>**Q3: Mengapa menyimpan fail sebagai XLSB mengurangkan saiznya jika kedua-dua format sudah dimampatkan dengan ZIP?
XLSB menghapuskan tag penanda teks yang berlebihan dan mengekod kedudukan sel, rekod, dan nilai numerik mentah ke dalam aliran bait binari yang ketat yang memampatkan jauh lebih padat berbanding rentetan XML biasa.</p>
<p>**Q4: Bolehkah Google Sheets mengimport dan menyunting fail XLSB secara langsung?
Tidak; Google Sheets tidak dapat membuka atau menukar fail <code>.xlsb</code> secara asli, memerlukan anda menukarnya kepada <code>.xlsx</code> atau CSV sebelum mengimport.</p>
<p>**Q5: Adakah fail XLSB lebih cenderung kepada kerosakan data berbanding fail XLSX?
Walaupun fail XML kadang-kadang boleh diperiksa atau dibaiki secara manual dengan penyunting teks apabila sebahagiannya rosak, aliran binari BIFF12 memerlukan offset bait yang ketat dan sukar dipulihkan secara manual jika sektor struktur rosak.</p>
<h2 id="lihat-juga">Lihat Juga</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 pada 2026: Format Hamparan Terbaik untuk Pembangun</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 - Memilih Format Hamparan yang Betul</a></li>
<li><a href="https://blog.fileformat.com/spreadsheet/what-is-excel/">Apakah Excel? Maklumat Utama yang Perlu Anda Ketahui</a></li>
<li><a href="https://blog.fileformat.com/spreadsheet/excel-file-extensions-xlsx-xlsm-xls-xltx-xltm/">Format Fail Excel: XLSX, XLSM, XLS, XLTX, XLTM</a></li>
<li><a href="https://blog.fileformat.com/spreadsheet/xls-vs-xlsx/">Perbezaan Antara XLS dan XLSX</a></li>
</ul>
<!-- raw HTML omitted -->
]]></content:encoded>
    </item>
    
  </channel>
</rss>
