วิธีทำงานกับการบรรจุ OOXML ใน .NET
ไฟล์ XLSX เป็นไฟล์ ZIP ตามมาตรฐาน Open Packaging Convention (OPC) Aspose.Cells FOSS for .NET เปิดเผยโครงสร้างแพ็กเกจพื้นฐานผ่าน PackageModel, PackagePartDescriptor, IPackageReader, และ IPackageWriter. สิ่งเหล่านี้เป็น API ระดับโครงสร้างพื้นฐานที่มีประโยชน์เป็นหลักสำหรับการวินิจฉัยและการนำไปใช้กับการจัดเก็บแบบกำหนดเอง. ติดตั้งด้วย dotnet add package Aspose.Cells_FOSS.
คู่มือแบบขั้นตอนต่อขั้นตอน
ขั้นตอนที่ 1: ติดตั้งแพ็กเกจ
dotnet add package Aspose.Cells_FOSSขั้นตอนที่ 2: นำเข้าเนมสเปซ
using Aspose.Cells_FOSS;ขั้นตอนที่ 3: จัดการ PackageStructureException
PackageStructureException จะถูกโยนเมื่อแพคเกจ XLSX มีโครงสร้าง OPC ที่ไม่ถูกต้อง (เช่น ขาดความสัมพันธ์ที่จำเป็น) ให้จับข้อยกเว้นนี้พร้อมกับ WorkbookLoadException เมื่อโหลดไฟล์จากแหล่งที่ไม่เชื่อถือได้.
using Aspose.Cells_FOSS;
var opts = new LoadOptions { TryRepairPackage = true };
try
{
var wb = new Workbook("suspect.xlsx", opts);
Console.WriteLine("Loaded: " + wb.Worksheets.Count + " sheet(s)");
}
catch (PackageStructureException ex)
{
Console.WriteLine("OPC structure invalid: " + ex.Message);
}
catch (WorkbookLoadException ex)
{
Console.WriteLine("Load error: " + ex.Message);
}ขั้นตอนที่ 4: ทำความเข้าใจ IPackageReader และ IPackageWriter
IPackageReader กำหนดวิธี Read() สำหรับการอ่านแพ็กเกจ OPC; IPackageWriter กำหนดวิธี Write() สำหรับการเขียนหนึ่ง. ไลบรารีให้การนำไปใช้เริ่มต้นที่สนับสนุนโดย ZIP. การนำไปใช้แบบกำหนดเองสามารถจัดหาได้เมื่อโหลดจากหรือบันทึกไปยังที่เก็บข้อมูลที่ไม่ใช่ระบบไฟล์ (เช่น cloud blobs หรือ in‑memory buffers).
// Signature reference
// public interface IPackageReader { void Read(/* ... */); }
// public interface IPackageWriter { void Write(/* ... */); }
//
// Standard usage: pass a Stream to the Workbook constructor
using Aspose.Cells_FOSS;
using System.IO;
byte[] fileBytes = File.ReadAllBytes("data.xlsx");
using var ms = new MemoryStream(fileBytes);
var wb = new Workbook(ms);
Console.WriteLine("Loaded from stream: " + wb.Worksheets.Count + " sheet(s)");ขั้นตอนที่ 5: ตรวจสอบส่วนที่ไม่รองรับ
เมื่อโหลดไฟล์ XLSX, PackageModel.UnsupportedParts แสดงส่วนที่ไลบรารีไม่ได้ประมวลผล ส่วนเหล่านี้จะถูกเก็บไว้แต่ไม่ได้ตีความ เข้าถึง PackageLoadContext ระหว่างกระบวนการโหลดแบบกำหนดเองเพื่อสำรวจโมเดล.
// PackageModel is populated internally during Workbook construction.
// Use LoadDiagnostics to detect load-time structural warnings without
// dropping to the PackageModel level directly.
using Aspose.Cells_FOSS;
var opts = new LoadOptions { TryRepairPackage = true, TryRepairXml = true };
var wb = new Workbook("file.xlsx", opts);
var diag = wb.LoadDiagnostics;
if (diag.HasRepairs)
Console.WriteLine("Package had " + diag.Issues.Count() + " repair entries.");ปัญหาทั่วไปและการแก้ไข
PackageStructureException ถูกโยนออกแม้จะมี TryRepairPackage = true.
ความล้มเหลวเชิงโครงสร้างบางอย่างของ OPC อยู่เหนือการซ่อมแซมอัตโนมัติ (เช่น แผนที่ content-type ที่หายไปอย่างสมบูรณ์) ตรวจสอบว่าไฟล์เป็น ZIP ที่ถูกต้องด้วย unzip -t file.xlsx หากเป็นไฟล์ที่ถูกต้อง อาจถูกเข้ารหัส — ไฟล์ที่มีการป้องกันด้วยรหัสผ่านไม่รองรับ
Workbook โหลดแล้วแต่บางส่วนของเนื้อหาขาดหายไป.
ตรวจสอบ LoadDiagnostics.Issues สำหรับรายการ DataLossRisk = true. สิ่งเหล่านี้บ่งชี้ส่วนที่ถูกตัดออกระหว่างการซ่อมแซม.
Custom IPackageReader ไม่ได้ถูกเรียกใช้.
ตรวจสอบให้แน่ใจว่าได้ใช้ตัวโอเวอร์โหลดของคอนสตรัคเตอร์ที่รับตัวอ่านแบบกำหนดเอง. ตัวโอเวอร์โหลดคอนสตรัคเตอร์ Workbook ทั้งหมดไม่ได้รับตัวอ่านแพ็กเกจแบบกำหนดเอง.
คำถามที่พบบ่อย
ฉันควรทำการ implement IPackageReader หรือ IPackageWriter เมื่อใด?
เฉพาะเมื่อแบ็กเอนด์การจัดเก็บของคุณไม่ใช่ระบบไฟล์ในเครื่อง — ตัวอย่างเช่น การโหลดโดยตรงจากสตรีมการจัดเก็บบนคลาวด์โดยไม่สร้างไฟล์ชั่วคราว.
ส่วนที่ไม่รองรับใน PackageModel จะถูกเก็บไว้เมื่อบันทึกหรือไม่?
ส่วนที่ไม่เป็นมาตรฐานใน UnsupportedParts ไม่รับประกันว่าจะถูกเขียนกลับคืน สำหรับความแม่นยำในการทำรอบกลับของส่วนที่ไม่เป็นมาตรฐาน ให้ทำการประมวลผลต่อไฟล์ XLSX ที่บันทึกไว้ในระดับ ZIP.
ความแตกต่างระหว่าง PackageStructureException กับ WorkbookLoadException คืออะไร?
PackageStructureException คือความล้มเหลวระดับ OPC/ZIP (ขาดประเภทเนื้อหา, ความสัมพันธ์เสียหาย). WorkbookLoadException คือความล้มเหลวระดับสูงกว่าในการแยกวิเคราะห์เนื้อหา XML ของ XLSX.