<?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/fa/tag/xlsb-%D8%AF%D8%B1-%D9%85%D9%82%D8%A7%D8%A8%D9%84-xlsx/</link>
    <description>Recent content in XLSB در مقابل XLSX on File Format Blog</description>
    <generator>Hugo -- gohugo.io</generator>
    <language>fa</language>
    <lastBuildDate>Wed, 30 Sep 2026 00:00:00 +0000</lastBuildDate><atom:link href="https://blog.fileformat.com/fa/tag/xlsb-%D8%AF%D8%B1-%D9%85%D9%82%D8%A7%D8%A8%D9%84-xlsx/index.xml" rel="self" type="application/rss+xml" />
    <item>
      <title>XLSB در مقابل XLSX برای مجموعه‌های داده بزرگ: راهنمای عملکرد برای توسعه‌دهندگان</title>
      <link>https://blog.fileformat.com/fa/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/fa/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 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-در-مقابل-xlsx-برای-مجموعههای-داده-بزرگ-راهنمای-عملکرد-برای-توسعهدهندگان">XLSB در مقابل XLSX برای مجموعه‌های داده بزرگ: راهنمای عملکرد برای توسعه‌دهندگان</h2>
<p>اگر شما خطوط داده، موتورهای گزارش‌گیری بک‌اند، یا ابزارهای تحلیلی که با Microsoft Excel ارتباط دارند را می‌سازید، احتمالاً به &ldquo;دیوار&rdquo; برخورد کرده‌اید.</p>
<p>کاربری یک کتاب‌کار ۴۵۰,۰۰۰ ردیفی آپلود می‌کند. سرور شما نخ‌های کاری را فعال می‌کند، مصرف حافظه به گیگابایت‌ها می‌رسد، جمع‌آوری زباله زمان اجرا را متوقف می‌کند و اجرای شما زمان‌سنجی می‌شود. شما بار را بررسی می‌کنید: این یک فایل استاندارد <code>.xlsx</code> است.</p>
<p>برای حل این مشکل، توسعه‌دهندگان اغلب روزها را صرف پیاده‌سازی تقسیم‌بندی، تجزیه‌کننده‌های جریان‌دار یا انتقال فایل‌ها به کارگرهای پس‌زمینه می‌کنند. با این حال، یکی از مؤثرترین بهینه‌سازی‌ها بدون نیاز به بازطراحی معماری انجام می‌شود: تغییر پسوند فایل از <code>.xlsx</code> به <code>.xlsb</code>.</p>
<p>در این راهنما، به عمق هر دو قالب می‌پردازیم، دلیل تفاوت‌های اساسی در معماری داخلی آن‌ها که منجر به ویژگی‌های عملکردی متفاوت می‌شود را بررسی می‌کنیم، بنچمارک‌های ملموس را در Python و .NET مقایسه می‌کنیم و قوانین واضحی برای زمان استفاده از کتاب‌کارهای باینری در محیط تولید ارائه می‌دهیم.</p>
<h2 id="1-زیر-پوسته-openxml-در-مقابل-biff12">1. زیر پوسته: OpenXML در مقابل 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 مایکروسافت (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>جریان فشرده‌سازی raw deflate را به متن باز کنید.</li>
<li>کاراکترهای رشته را توکنیزه و تجزیه کنید تا به یک DOM XML یا جریان رویدادهای 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> را به عدد شناور ۶۴ بیتی IEEE 754 تجزیه کنید.</li>
</ol>
<p>هر سلول به‌تنهایی هزینه پردازش CPU برای تجزیه رشته، تخصیص رشته و تجزیه‌لغوی را به‌همراه دارد. این را در ۵۰۰,۰۰۰ ردیف و ۳۰ ستون (۱۵ میلیون سلول) ضرب کنید و CPU به‌مراتب بیشتر سیکل‌ها را صرف تجزیه سینتکس می‌کند تا پردازش مقادیر دامنه.</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>۲ بایت برای شناسه رکورد (مثلاً <code>BrtCellRk</code> یا <code>BrtCellReal</code>)</li>
<li>۴ بایت برای شاخص‌های ستون/ردیف</li>
<li>۸ بایت شامل ساختار بایت خام، IEEE 754 با دقت دو برابر</li>
</ul>
<p>وقتی تجزیه‌کننده شما یک فایل XLSB را می‌خواند، به‌طور کامل از تجزیه لغوی عبور می‌کند. هدر رکورد را می‌خواند، ۸ بایت خام را از بافر می‌گیرد، مستقیماً در حافظه کپی می‌کند و اشاره‌گر را به جلو می‌برد. هیچ برچسبی برای اعتبارسنجی وجود ندارد، هیچ تبدیل نوع رشته به عددی نیست و هزینه‌ای برای رمزگشایی UTF-8 داده‌های عددی وجود ندارد.</p>
<h2 id="۲-معیارهای-کمی-دیسک-حافظه-و-سرعت">۲. معیارهای کمی: دیسک، حافظه، و سرعت</h2>
<p>برای نشان دادن تأثیر واقعی، یک مجموعه داده شبیه‌سازی‌شده شامل <strong>750,000 ردیف و 25 ستون</strong> (ترکیبی از زمان‌مهرها، اعداد شناور، اعداد صحیح و کدهای دسته‌بندی) را در نظر بگیرید.</p>
<p>آزمون‌های زیر داده‌های جدولی یکسان ذخیره‌شده به‌صورت XLSX و XLSB را ارزیابی می‌کنند.</p>
<h3 id="محیط-تست">محیط تست</h3>
<ul>
<li><strong>CPU:</strong> AMD Ryzen 9 5900X (۱۲ هسته، ۲۴ رشته)</li>
<li><strong>RAM:</strong> ۶۴ گیگابایت 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>~۴۷٪ کوچکتر</strong></td>
</tr>
<tr>
<td style="text-align:left"><strong>ذخیره / زمان سریال‌سازی</strong></td>
<td style="text-align:left">42.6 ثانیه</td>
<td style="text-align:left">14.1 ثانیه</td>
<td style="text-align:left"><strong>۳.۰× سریع‌تر</strong></td>
</tr>
<tr>
<td style="text-align:left"><strong>زمان خواندن (Python DOM parser)</strong></td>
<td style="text-align:left">38.2 ثانیه</td>
<td style="text-align:left">8.9 ثانیه</td>
<td style="text-align:left"><strong>۴.۳× سریع‌تر</strong></td>
</tr>
<tr>
<td style="text-align:left"><strong>زمان خواندن (موتور 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>۳٫۳ برابر سریع‌تر</strong></td>
</tr>
<tr>
<td style="text-align:left"><strong>حداکثر تخصیص Heap در حین خواندن</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>~۷۲٪ کاهش</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> به ۱۴ بایت متن ASCII نیاز دارد. در BIFF12، این عدد به صورت یک عدد دوگانهٔ ۸ بایتی ذخیره می‌شود (یا در صورتی که با قوانین دقت خاص سازگار باشد، در یک رکورد <code>RK</code> ۴ بایتی فشرده می‌شود).</li>
</ol>
<h2 id="۳-ردپای-حافظه-و-فشار-جمعآوری-زباله">۳. ردپای حافظه و فشار جمع‌آوری زباله</h2>
<p>برای سرویس‌های وب و میکروسرویس‌هایی که درخواست‌های همزمان را مدیریت می‌کنند، سرعت CPU تنها نیمی از مسأله است؛ <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 به حجم ۱۰۰ مگابایت را پردازش می‌کند، باید هزاران توکن رشته‌ای موقت، بافرهای برش رشته و جستجوهای دیکشنری ایجاد کند. در زبان‌های جمع‌آوری زباله (Java، C#، Go، Node.js، Python) این امر منجر به تکه‌تکه شدن شدید هپ می‌شود و زمان اجرا را به توقف‌های مکرر جمع‌آوری زباله (GC) می‌کشاند.</p>
<p>به دلیل اینکه تجزیه XLSB مستقیماً بر روی برش‌های بایتی با عرض ثابت عمل می‌کند، تجزیه‌کننده‌ها می‌توانند داده‌ها را به ساختارهای اختصاص‌یافته به پشته یا بافرهای بایتی قابل استفاده مجدد بخوانند. نتیجه، کاهش چشمگیر مصرف حافظه و عدم ایجاد فشار بر تخصیص‌دهنده زمان اجرا است.</p>
<h2 id="۴-مثالهای-پیادهسازی-توسعهدهنده">۴. مثال‌های پیاده‌سازی توسعه‌دهنده</h2>
<p>بیایید نگاهی بیندازیم به اینکه چگونه می‌توان از XLSB در زنجیره ابزارهای رایج توسعه‌دهندگان بهره‌برداری کرد:</p>
<h3 id="پایتون-مهاجرت-از-openpyxl-به-calamine--pyxlsb">پایتون: مهاجرت از 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>) از آن پشتیبانی می‌کنند، بسیاری از بسته‌های سبک یا تجزیه‌کننده‌های وب‑محور جاوااسکریپت خالص (مانند نسخه‌های قدیمی <code>SheetJS</code>) پشتیبانی محدودی یا فقط‑خواندنی دارند.</li>
</ul>
<h3 id="2-مقایسه-تغییرات-در-git-و-کنترل-نسخه">2. مقایسه تغییرات در Git و کنترل نسخه</h3>
<ul>
<li><strong>XLSX:</strong> چون حاوی XML متنی داخل یک بسته ZIP است، ابزارهای خط فرمان و هوک‌های Git می‌توانند آن را unzip کرده و XML را قالب‌بندی کنند تا تفاوت‌های ساختاری قابل خواندن بین کمیت‌ها تولید شود.</li>
<li><strong>XLSB:</strong> داده‌های باینری خالص. سیستم‌های کنترل نسخه آن را به‌صورت یک بلوک باینری نامشخص در نظر می‌گیرند و هر گونه امکان مقایسه جزئی یا ادغام سطح خطی را از بین می‌برند.</li>
</ul>
<h3 id="3-رندرینگ-کلاینت-وب">3. رندرینگ کلاینت وب</h3>
<p>اگر معماری شما به رندر کردن مستقیم صفحات‌گسترده در مرورگر از طریق WebAssembly یا جاوااسکریپت سمت‌کلاینت وابسته باشد، تجزیه‌کننده‌های 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% کوچکتر)</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">بالا، اما انتخابی</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; ۵۰۰۰۰ ردیف).</li>
<li>فایل‌های شما باید توسط پلتفرم‌های SaaS شخص ثالث یا برنامه‌های مصرف‌کننده (مثلاً Google Sheets) پردازش شوند.</li>
<li>شما نمی‌توانید محیط مشتری نهایی که فایل را می‌خواند کنترل کنید.</li>
</ul>
<p>به <strong>XLSB</strong> تغییر دهید زمانی که:</p>
<ul>
<li>در حال ساخت خطوط لوله داخلی، کارهای دسته‌ای، سیستم‌های ETL یا وظایف کاری هستید که استخراج‌های داده‌ای بزرگ (&gt; ۱۰۰۰۰۰ ردیف) را مدیریت می‌کنند.</li>
<li>سرورهای شما در هنگام سریال‌سازی یا دی‌سریال‌سازی جدول‌های صفحه‌گسترده با خطاهای کمبود حافظه (OOM) مواجه می‌شوند.</li>
<li>شما باید ردپای ذخیره‌سازی S3/blob و زمان انتقال شبکه برای مدل‌های مالی بزرگ یا صادرات داده‌های مکرر را به حداقل برسانید.</li>
</ul>
<p>تغییر به XLSB اغلب به سادگی تغییر یک رشته پیکربندی در سرویس خروجی شما است، اما افزایش توان پردازشی ۳ تا ۵ برابر را فراهم می‌کند که معمولاً نیاز به هفته‌ها بهینه‌سازی کد دارد.</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 سقف شبکه‌ای یکسانی برابر با ۱٬۰۴۸٬۵۷۶ ردیف در ۱۶٬۳۸۴ ستون برای هر کاربرگ دارند.</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/">قالب‌های فایل اکسل: 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>
