<?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/th/tag/xlsb-%E0%B9%80%E0%B8%97%E0%B8%B5%E0%B8%A2%E0%B8%9A%E0%B8%81%E0%B8%B1%E0%B8%9A-xlsx/</link>
    <description>Recent content in XLSB เทียบกับ XLSX on File Format Blog</description>
    <generator>Hugo -- gohugo.io</generator>
    <language>th</language>
    <lastBuildDate>Wed, 30 Sep 2026 00:00:00 +0000</lastBuildDate><atom:link href="https://blog.fileformat.com/th/tag/xlsb-%E0%B9%80%E0%B8%97%E0%B8%B5%E0%B8%A2%E0%B8%9A%E0%B8%81%E0%B8%B1%E0%B8%9A-xlsx/index.xml" rel="self" type="application/rss+xml" />
    <item>
      <title>XLSB vs XLSX สำหรับชุดข้อมูลขนาดใหญ่: คู่มือประสิทธิภาพสำหรับนักพัฒนา</title>
      <link>https://blog.fileformat.com/th/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/th/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, คุณอาจเคยเจอ &quot;กำแพง&quot;.</p>
<p>ผู้ใช้อัปโหลดสมุดงานที่มี 450,000 แถว เซิร์ฟเวอร์ของคุณสร้างเธรดทำงาน, การใช้หน่วยความจำพุ่งขึ้นเป็นกิกะไบต์, การเก็บกวาดหน่วยความจำทำให้เวลารันหยุดชะงัก, และการดำเนินการของคุณหมดเวลา คุณตรวจสอบข้อมูลที่ส่งมา: เป็นไฟล์ <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 ของ 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>เมื่ออ่านแถวนี้ runtime ของคุณต้อง:</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> ให้เป็นจำนวนจุดลอย IEEE 754 ขนาด 64 บิต.</li>
</ol>
<p>แต่ละเซลล์จะทำให้เกิดภาระงานของ CPU สำหรับการแยกวิเคราะห์สตริง การจัดสรรสตริง และการวิเคราะห์เชิงไวยากรณ์ หากคูณกับ 500,000 แถวและ 30 คอลัมน์ (รวม 15 ล้านเซลล์) 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>2 ไบต์สำหรับ ID ของเรคคอร์ด (เช่น <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 GB 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>เวลาในการอ่าน (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.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.3 เท่า</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>การลดลง ~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> ต้องใช้ข้อความ ASCII ขนาด 14 ไบต์. ใน BIFF12 จะถูกเก็บเป็น double ขนาด 8 ไบต์ (หรือบรรจุเป็นระเบียน <code>RK</code> ขนาด 4 ไบต์ หากตรงตามกฎความแม่นยำเฉพาะ).</li>
</ol>
<h2 id="3-การใชหนวยความจำและแรงกดดนการเกบกวาด">3. การใช้หน่วยความจำและแรงกดดันการเก็บกวาด</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 ขนาด 100 MB มันต้องสร้างโทเคนสตริงชั่วคราวหลายพัน, บัฟเฟอร์สไลซ์สตริง, และการค้นหาพจนานุกรม. ในภาษาที่มีการจัดการหน่วยความจำอัตโนมัติ (Java, C#, Go, Node.js, Python) สิ่งนี้ทำให้เกิดการกระจายฮีปอย่างรุนแรงและทำให้รันไทม์ต้องหยุดทำงานบ่อยครั้งเพื่อการเก็บกวาดหน่วยความจำ (GC).</p>
<p>เนื่องจากการแยกวิเคราะห์ XLSB ทำงานโดยตรงบนส่วนของไบต์ที่มีความกว้างคงที่ พาร์เซอร์สามารถอ่านข้อมูลเข้าไปในโครงสร้างที่จัดสรรบนสแตกหรือบัฟเฟอร์ไบต์ที่ใช้ซ้ำได้ ผลลัพธ์คือการใช้หน่วยความจำที่ลดลงอย่างมากและไม่มีการสลับหน่วยจัดสรรเวลาเรียกใช้</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 &amp; ระบบควบคุมเวอร์ชัน</h3>
<ul>
<li><strong>XLSX:</strong> เนื่องจากมันมี XML ข้อความอยู่ภายในคอนเทนเนอร์ ZIP, เครื่องมือบรรทัดคำสั่งและ Git hooks สามารถแตกไฟล์และจัดรูปแบบ 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">ใช้ CPU อย่างหนัก</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>คุณกำลังสร้าง pipeline ภายใน งานแบบ batch, ระบบ ETL หรืองานของ worker ที่จัดการการสกัดข้อมูลขนาดใหญ่ (&gt; 100,000 แถว).</li>
<li>เซิร์ฟเวอร์ของคุณกำลังเจอข้อผิดพลาด out-of-memory (OOM) ระหว่างการทำ serialization หรือ deserialization ของสเปรดชีต</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>
