วิธีทำงานกับการบรรจุ OOXML ใน .NET

วิธีทำงานกับการบรรจุ 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.

ดูเพิ่มเติม

 ภาษาไทย