บทความเทคนิค

แก้ไขแผนภูมิ Excel โดยไม่สูญเสีย ChartML ใน HotXLS

HotXLS รักษา ChartML ต้นฉบับของแผนภูมิ Excel ที่นำเข้าแล้วเล่นซ้ำไบต์ต่อไบต์เมื่อไม่มีสิ่งใดใน typed model เปลี่ยนแปลง ทำให้การเปิดและบันทึกเวิร์กบุ๊กใหม่ไม่ลอกส่วนของแผนภูมิที่ object model ไม่แทนออกอย่างเงียบ ๆ แก้ชื่อ ซีรีส์ หรือแกน แล้ว HotXLS จะผสาน typed node ใหม่เข้าไปในต้นไม้เดิมเชิงโครงสร้างแทนที่จะสร้างแผนภูมิใหม่ตั้งแต่ต้น

ความแตกต่างนั้น — เล่นซ้ำเมื่อไม่ถูกแตะ ผสานเมื่อถูกแก้ไข — คือสิ่งที่ทำให้แอปพลิเคชัน Delphi ปลอดภัยที่จะชี้ไปยังแผนภูมิที่นักวิเคราะห์สร้างใน Excel การสร้างแผนภูมิใหม่จาก typed model จะสูญเสียสิ่งที่ model ไม่รู้เสมอ และแผนภูมิ Excel เต็มไปด้วยสิ่งที่ไลบรารีไม่รู้ สไตล์ที่กำหนดเอง extension list สาขา alternate content การจัดรูปแบบที่มีเนมสเปซจาก add-in

ทำไมการบันทึกเวิร์กบุ๊กใหม่จึงทำให้แผนภูมิแบนราบ

เพราะการทำงานปกติอ่านสิ่งที่มันเข้าใจแล้วเขียนสิ่งที่มันเข้าใจ ทุกสิ่งที่อยู่ระหว่าง — extLst จาก Excel build ที่ใหม่กว่า สาขา mc:AlternateContent เอฟเฟกต์รูปร่างที่ model ไม่มีคุณสมบัติให้ — มีอยู่ในไฟล์ ไม่มีบ้านใน object model และหายไปในเวลาบันทึก ผู้ใช้เห็นแผนภูมิที่สูญเสียเกรเดียนต์ ป้ายข้อมูลที่กำหนดเอง หรือเอฟเฟกต์ 3D และเวิร์กบุ๊กอธิบายไม่ได้ว่าเพราะอะไร

เมื่อเปิดใช้ PreserveUnsupportedParts บนเวิร์กบุ๊ก HotXLS จะเก็บไบต์ UTF-8 ต้นฉบับของแผนภูมิตอนนำเข้าพร้อมความยาวและลายนิ้วมือ 64-bit ของเนื้อหาที่ model ไว้ หาก typed model ไม่เปลี่ยนแปลงในเวลาบันทึก มันจะเขียนไบต์ต้นฉบับกลับ ไม่มีการจัดเรียง XML ใหม่ ไม่มีการลอยของช่องว่าง ไม่มีสำเนา UTF-16 ของแผนภูมิที่อาศัยอยู่ในหน่วยความจำสำหรับแผนภูมิที่ไม่มีใครแก้

var
  Workbook: TXLSXWorkbook;
  Chart: TXLSXChart;
begin
  Workbook := TXLSXWorkbook.Create(nil);
  try
    Workbook.PreserveUnsupportedParts := True;   // set before Open
    Workbook.Open('quarterly-review.xlsx');
    Chart := Workbook.Sheets[1].Charts[0];   // Sheets[] is 1-based
    if Chart.HasPreservedXml then
      Log('original ChartML retained; untouched charts replay exactly');
    Chart.Title := 'Revenue by region, Q3 2026';  // now the merge path runs
    Workbook.SaveAs('quarterly-review-out.xlsx');
  finally
    Workbook.Free;
  end;
end;

สิ่งที่การผสานรักษาและสิ่งที่ model เป็นเจ้าของ

กฎคือความเป็นเจ้าของ node model สาธารณะ — ชื่อ ซีรีส์ cache plot group แกน — ถูกตัดสินโดยต้นไม้ที่สร้างใหม่ subtree ที่ไม่ถูก model ถูกนำพาจากต้นฉบับ ความไม่สมมาตรนั้นตั้งใจไว้ และเป็นส่วนที่ต้องใช้เวลาสักครู่เพื่อทำความเข้าใจ การลบซีรีส์ต้องไม้ชุบซีรีส์เก่าจาก XML ที่รักษาไว้ขึ้นมาใหม่ ดังนั้นสิ่งใดที่ model เป็นเจ้าของจะถูกเอามาจาก model แม้เมื่อ model บอกว่า "หายไป"

เนื้อหาที่ไม่มีเจ้าของถูกแทรกกลับข้าง node ที่ตรงกันซึ่งมันเคยนั่งอยู่ข้าง และ extLst ยังคงอยู่ท้ายสุดภายใน parent ของมันเพราะนั่นคือที่ที่ schema กำหนด การล้างคุณสมบัติที่รู้จัก — การเอาสถานะตัวหนาออก การทิ้งสี — ถูกปฏิบัติเป็นการล้าง ไม่ใช่ช่องว่างที่จะถูกเติมจากต้นไม้เดิม แอตทริบิวต์ที่ไม่รู้จักในบริเวณเดียวกันยังคงที่ของมัน

เนื้อหา markup-compatibility ได้รับการจัดการเฉพาะ ในการ parse HotXLS ข้าม mc:Choice แล้วอ่าน mc:Fallback หากสาขา fallback นั้นหุ้ม plot group ที่ model รู้จัก การผสานจะเขียนเนื้อหา typed ใหม่กลับเข้าไปใน subtree fallback หากไม่มีขั้นตอนนั้น การบันทึกจะปล่อย plot group ใหม่และทิ้งของเก่าไว้ใน fallback แล้วแผนภูมิจะพกสองชุด

การยกเว้นแผนภูมิเดียวออก

ClearPreservedXml ทิ้ง XML ต้นฉบับและลายนิ้วมือของแผนภูมิเดียว ทำให้การบันทึกครั้งถัดไปสร้างแผนภูมินั้นใหม่จาก typed model ล้วน เป็นการตัดสินใจรายแผนภูมิ PreserveUnsupportedParts ระดับเวิร์กบุ๊กยังคงควบคุมว่าจะสร้างสถานะการรักษาตอนนำเข้าหรือไม่

เอื้อมไปหามันเมื่อคุณต้องการแผนภูมิที่สะอาดแทนที่จะเป็นแผนภูมิที่ซื่อสัตย์ — ตัวอย่างเช่นเมื่อแผนภูมิเทมเพลตพกการจัดรูปแบบจากธีมองค์กรเก่าและจุดประสงค์ของการดำเนินการคือทิ้งมัน อย่าเอื้อมไปหามันเป็นรีเฟลกซ์การดีบัก แผนภูมิที่เรนเดอร์ผิดหลังแก้ไขมักเป็นคำถามเรื่องการ model มากกว่าคำถามเรื่องการรักษา และการล้าง XML ที่รักษาไว้จะทำลายหลักฐาน

แผนภูมิผสมและแกนที่สอง

AddPlotGroup สร้างแผนภูมิผสมเรียงลำดับ ที่แต่ละ plot group ยังคงตระกูลแผนภูมิและการมอบหมายแกนหลักหรือรองของตัวเอง นั่นคือสิ่งที่แผนภูมิธุรกิจที่พบทุกที่ต้องการ รายได้เป็นคอลัมน์บนแกนซ้าย อัตรากำไรเป็นเปอร์เซ็นต์เป็นเส้นบนแกนขวา

แผนภูมิเปิดเผยแกนหมวดหมู่และค่าหลักและรองบวกซีรีส์แกน พร้อมการตั้งค่าหมวดหมู่ ค่า วันที่ และซีรีส์แกนแบบ typed ครอบคลุมตำแหน่ง ตัวระบุ การตัดกัน หน่วยวันที่ ช่วงป้าย และการมองเห็น API แบนเดิม — ChartType, AddSeries, collection Series แบน — ยังคงตั้งค่า plot group หลัก โค้ดที่มีอยู่จึงยังทำงานขณะที่ model เบื้องล่างถือทุกกลุ่มที่เรียงลำดับ

var
  Chart: TXLSXChart;
  Line: TXLSXChartPlotGroup;
begin
  // Column chart anchored over rows 1..15, columns 5..12
  Chart := Sheet.Charts.Add(xlsxChartColumn, 'Revenue and margin',
    1, 5, 15, 12);
  Chart.AddSeries('Revenue', 'Data!$A$2:$A$13', 'Data!$B$2:$B$13');
  // Second plot group: a line, read against the secondary value axis
  Line := Chart.AddPlotGroup(xlsxChartLine, xlsxAxisSecondary);
  Line.AddSeries('Margin %', 'Data!$A$2:$A$13', 'Data!$C$2:$C$13');
end;

ก่อนที่ model นี้จะมีอยู่ การเปิดและบันทึกแผนภูมิผสมใหม่จะยุบมันลงเป็นตระกูลแผนภูมิเดียวและสูญเสียแกนรอง วันที่ และซีรีส์ ข้อมูลอ้างอิงสูตรแผนภูมิและค่าซีรีส์ที่แคชไว้ตอนนี้รอดผ่านการคัดลอกเวิร์กบุ๊กและวงจรเปิด/บันทึกเช่นกัน และจุดยึดแผนภูมิถูกจับคู่กับส่วนแผนภูมิของมันด้วย relationship identifier — ทำให้แอปพลิเคชันที่จัดเรียง entry ความสัมพันธ์ใหม่ไม่สลับเนื้อหาแผนภูมิระหว่างตำแหน่งเวิร์กชีตอีกต่อไป

กับดัก manual layout

หากคุณจัดตำแหน่ง plot area ชื่อ ชื่อแกน หรือคำอธิบายด้วยมือ ให้เขียนพิกัดทั้งสี่ Office กำหนด x, y, w และ h เป็นกลุ่มสมบูรณ์เมื่อใดก็ตามที่มีอันใดอันหนึ่งอยู่ และไม่สนใจ manualLayout ทั้งหมดในกรณีอื่น HotXLS จึงปล่อยสี่เหลี่ยมผืนผ้าเต็มเสมอด้วยเหตุผลนั้น และ SetPositionAndSize ตั้งและเปิดใช้มันในคำสั่งเดียว

อีกสองรายละเอียดตาม Excel แทนที่จะตามความยืดหยุ่นเต็มของข้อกำหนด ตำแหน่งถูกเขียนด้วย xMode และ yMode ตั้งเป็น edge ขณะที่ขนาดใช้ factor สำหรับ wMode และ hMode เพราะนั่นคือสิ่งที่ Excel เขียนและสิ่งที่มันแปลงชุดค่าผสมอื่นให้กลายเป็น และ layoutTarget ถูกปล่อยเฉพาะสำหรับ plot area เท่านั้น ไม่เคยสำหรับชื่อหรือคำอธิบาย ที่ที่หมายเหตุการทำงานของ Microsoft ห้ามไว้

การสอดสนิทสิ่งนี้เข้ากับการเดินทางไปกลับเวิร์กบุ๊ก

การรักษาแผนภูมิเป็นตัวอย่างหนึ่งของนโยบายทั่วไป ไลบรารีที่แก้ไขเอกสารที่แต่งที่อื่นควรเปลี่ยนสิ่งที่มันถูกขอให้เปลี่ยนและไม่มากไปกว่านั้น เหตุผลเดียวกันขับ HotXLS บนธีม calculation chain และส่วนขยายเวิร์กชีต ซึ่งอธิบายในบันทึกของ การเดินทางไปกลับแบบไม่สูญเสียสำหรับ theme, extLst และ calcChain และบนโปรเจกต์ VBA และ external link ใน การรักษา VBA และ external link สำหรับพื้นผิวการเขียนแผนภูมิเอง — การสร้างแผนภูมิ การวางรูปภาพและงานวาดจาก Delphi — ดูคู่มือ แผนภูมิ รูปภาพ และงานวาดใน HotXLS

HotXLS อ่าน แก้ไข และเขียนแผนภูมิ XLSX จากโค้ด Delphi และ C++Builder พื้นเมืองโดยไม่ต้องติดตั้ง Excel บนเครื่อง ซึ่งเป็นสิ่งที่ทำให้ความซื่อสัตย์เป็นปัญหาของไลบรารีแทนที่จะเป็นปัญหาของการทำงานอัตโนมัติ — หน้าคอมโพเนนต์สเปรดชีต HotXLS มีรายการคุณสมบัติแผนภูมิและดาวน์โหลดรุ่นทดลอง