HotXLS สร้าง Excel Sparklines — แผนภูมิต้นแบบย่อขนาดเล็กที่ Excel วาดไว้ภายในเซลล์เดียว — จาก Delphi และ C++Builder ด้วยการเรียกใช้เพียงครั้งเดียว: TXLSXWorksheet.AddSparklineGroup จะสร้างกลุ่มสปาร์กไลน์ทับช่วงข้อมูล และการบันทึกสมุดงานจะเขียนเป็นบล็อกส่วนขยาย x14 ภายใน extLst ของเวิร์กชีต ซึ่ง Excel 2010 ขึ้นไปจะเรนเดอร์ และโปรแกรมอ่านรุ่นเก่าจะข้ามไปโดยไม่มีข้อผิดพลาด ไม่มีวัตถุแผนภูมิ ไม่มีชิ้นส่วนการวาด ไม่มีจุดยึด
สถานการณ์ที่ทำให้จำเป็นต้องมีสปาร์กไลน์นั้นเหมือนกันเสมอ สมุดงานแดชบอร์ดมีข้อมูลไม่กี่ร้อยแถว หนึ่งแถวต่อหนึ่งผลิตภัณฑ์ หรือภูมิภาค หรือบัญชี โดยแต่ละแถวมีตัวเลขรายเดือนสิบสองเดือน และมีคนต้องการสัญลักษณ์แสดงแนวโน้มที่ส่วนท้ายของทุกแถว หากสร้างโมเดลนั้นด้วยแผนภูมิจริง คุณจะต้องสร้างชิ้นส่วนแผนภูมิ DrawingML หลายร้อยชิ้น โดยแต่ละชิ้นมีส่วน XML ความสัมพันธ์ และเรขาคณิตจุดยึดของตัวเอง ซึ่งจะทำให้ขนาดไฟล์เพิ่มขึ้นและใช้เวลาเปิดนาน กลุ่มสปาร์กไลน์คือบล็อก XML บล็อกเดียวที่ระบุว่า "วาดเส้นเล็ก ๆ จาก B2:M2 ลงใน N2 และจาก B3:M3 ลงใน N3" ซึ่งทำซ้ำได้ง่ายและประหยัดสำหรับทุกแถวที่คุณมี
ทำไมสปาร์กไลน์จึงเป็นส่วนขยาย x14 แทนที่จะเป็นแผนภูมิ?
สปาร์กไลน์เปิดตัวพร้อมกับ Excel 2010 สามปีหลังจากที่ Schema พื้นฐาน ECMA-376 ถูกกำหนดไว้ ดังนั้นจึงไม่สามารถอยู่ในมาร์กอัปเวิร์กชีตปกติได้โดยไม่ทำให้โปรแกรมอ่านที่มีอยู่ทั้งหมดขัดข้อง คำตอบของ Microsoft คือกลไกรายการส่วนขยาย: เวิร์กชีตอาจลงท้ายด้วยองค์ประกอบ <extLst> ที่มีบล็อก <ext> โดยแต่ละบล็อกจะแท็กด้วย URI ที่ระบุฟีเจอร์ ([MS-XLSX] §2.3.6) สปาร์กไลน์ใช้ URI {05C60535-1F16-4fd2-B633-F4F36F0B64E0} และเนมสเปซ x14 โปรแกรมอ่านที่รู้จัก GUID จะแยกวิเคราะห์บล็อกนั้น ส่วนโปรแกรมอ่านที่ไม่รู้จักจะต้องข้ามไป นั่นคือเรื่องราวความเข้ากันได้ย้อนหลังทั้งหมด และเป็นเหตุผลว่าทำไม Excel 2007 จึงเปิดสมุดงานสปาร์กไลน์ได้สำเร็จ — โดยจะแสดงตัวเลขต้นทางเท่านั้นโดยไม่มีสัญลักษณ์แสดงผล
รายละเอียดอย่างหนึ่งของกลไกนี้น่าสนใจเนื่องจากขัดกับสมมติฐานทั่วไป: ไม่จำเป็นต้องมีการประกาศ mc:Ignorable บนรูทของเวิร์กชีต การใช้เกตเวย์ GUID ของส่วนขยายนั้นเพียงพอในตัวเอง และตัวเขียนของ Excel เองก็ประกาศเนมสเปซ x14 ในเครื่องบนองค์ประกอบ <ext> แทนที่จะไปยุ่งกับรูท HotXLS ใช้รูปแบบเดียวกันนี้ ซึ่งทำให้ XML ส่วนที่เหลือของเวิร์กชีตไม่ถูกแตะต้อง นี่คือความแตกต่างทางโครงสร้างจากแผนภูมิจริง: แผนภูมิเป็นส่วน DrawingML แยกต่างหากที่มีไปป์ไลน์การเรนเดอร์ของตัวเอง ซึ่งอธิบายไว้ในบทความคู่มือนำเสนอเกี่ยวกับแผนภูมิ รูปภาพ และการวาดภาพ ในขณะที่สปาร์กไลน์คือเมทาดาตาของเวิร์กชีตที่ตารางสเปรดชีตระบายสีด้วยตัวเอง
คุณจะเพิ่มสปาร์กไลน์ลงในไฟล์ XLSX โดยใช้โปรแกรมได้อย่างไร?
TXLSXWorksheet.AddSparklineGroup(AType, ASourceRange, ALocation) คือวิธีเรียกใช้เพียงครั้งเดียว: จะสร้างกลุ่มตามประเภทที่กำหนด กำหนดสีชุดข้อมูลเริ่มต้นของ Excel และเพิ่มสปาร์กไลน์แรกที่จับคู่ช่วงต้นทางที่ระบุชื่อแผ่นงานลงในเซลล์โฮสต์ จากนั้น TXLSXSparklineGroup ที่ส่งคืนจะยอมรับสปาร์กไลน์เพิ่มเติมผ่านเมธอด Add หนึ่งคู่ F/Sqref ต่อแถว ทั้งหมดใช้ประเภทและการจัดรูปแบบร่วมกันในกลุ่ม สำหรับกรณีแดชบอร์ด นั่นคือรูปแบบที่คุณต้องการอย่างแน่นอน: หนึ่งกลุ่ม หนึ่งชุดตัวเลือกภาพ สมาชิกหลายร้อยคน
var
Book: TXLSXWorkbook;
Sheet: TXLSXWorksheet;
Grp: TXLSXSparklineGroup;
Row: Integer;
begin
Book := TXLSXWorkbook.Create;
try
Book.Open('dashboard.xlsx');
Sheet := Book.Sheets[0];
// One group: every product row shares type and formatting
Grp := Sheet.AddSparklineGroup(xlsxSparklineLine,
'Sheet1!B2:M2', 'N2');
for Row := 3 to 201 do
Grp.Add(Format('Sheet1!B%d:M%d', [Row, Row]),
Format('N%d', [Row]));
Book.SaveAs('dashboard-trends.xlsx');
finally
Book.Free;
end;
end;
TXLSXSparklineType ครอบคลุมสามประเภทที่ Excel นำเสนอ: xlsxSparklineLine สำหรับเส้นแนวโน้ม, xlsxSparklineColumn สำหรับแผนภูมิแท่งขนาดเล็ก และ xlsxSparklineStacked สำหรับแถบแพ้ชนะ (win/loss) ซึ่งทุกค่าจะเรนเดอร์เป็นบล็อกขึ้นหรือลง สมาชิกสปาร์กไลน์แต่ละตัวมีเพียงสองสตริงเท่านั้น — F ซึ่งเป็นช่วงต้นทางที่ระบุแผ่นงาน และ Sqref ซึ่งเป็นเซลล์ที่ใช้วาดสัญลักษณ์ ดังนั้นจึงไม่มีสิ่งอื่นใดที่ต้องกำหนดค่าในแต่ละแถว นอกจากนี้ยังสามารถสร้างกลุ่มขึ้นมาเองด้วยตนเองผ่านคอลเลกชัน Worksheet.SparklineGroups เมื่อคุณต้องการเริ่มจากกลุ่มว่างแทนกลุ่มเริ่มต้นที่กำหนดไว้ล่วงหน้า
เครื่องหมาย ช่องสี และการปรับสเกลแกนบนโมเดลที่กำหนดประเภท
TXLSXSparklineGroup แสดงชุดตัวเลือกเต็มรูปแบบจากริบบิ้นเครื่องมือสปาร์กไลน์ของ Excel ในฐานะพร็อพเพอร์ตี้ทั่วไป สวิตช์บูลีนหกตัวเพื่อเน้นจุดข้อมูล: Markers สำหรับทุกจุดบนเส้นสปาร์กไลน์ รวมถึง HighPoint, LowPoint, NegativePoints, FirstPoint และ LastPoint ช่องสี ARGB แปดช่องจับคู่กับตัวเลือกเหล่านั้น — ColorSeries, ColorNegative, ColorAxis, ColorMarkers, ColorFirst, ColorLast, ColorHigh, ColorLow — โดยมีข้อตกลงว่าหากปล่อยช่องใดเป็น 0 ช่องนั้นจะไม่ถูกบันทึกในไฟล์และ Excel จะใช้ค่าเริ่มต้นของตนเอง รูปแบบ ARGB ทึบแสงแบบเดียวกันนี้ใช้ในไลบรารีทั้งหมด ดังนั้น $FFD00000 ในที่นี้จะหมายถึงสีแดงเดียวกับที่ใช้ในสไตล์การจัดรูปแบบตามเงื่อนไข
Grp := Sheet.AddSparklineGroup(xlsxSparklineStacked,
'Sheet1!B2:M2', 'N2');
Grp.NegativePoints := True; // losing months stand out
Grp.ColorNegative := $FFD00000;
Grp.HighPoint := True;
Grp.ColorHigh := $FF00B050;
Grp.MinAxisType := xlsxSparklineAxisGroup; // one scale for all rows
Grp.MaxAxisType := xlsxSparklineAxisGroup;
Grp.DisplayEmptyCellsAs := xlsxSparklineEmptyGap;
คุณสมบัติแกนสมควรได้รับการพิจารณาสักครู่ก่อนที่คุณจะยอมรับค่าเริ่มต้น MinAxisType and MaxAxisType แต่ละรายการสามารถปรับขนาดเป็นแบบรายตัว แบบกลุ่ม หรือแบบกำหนดเอง: แบบรายตัวจะขยายสปาร์กไลน์แต่ละเส้นไปยังค่าต่ำสุดและสูงสุดของตัวเอง ซึ่งทำให้แถวที่มีความผันผวนระหว่าง 99 ถึง 101 ดูน่าตกใจพอ ๆ กับแถวที่มีมูลค่าเพิ่มขึ้นสามเท่า การปรับขนาดแบบกลุ่มจะทำให้สมาชิกทุกคนอยู่ในระดับแกนตั้งที่ใช้ร่วมกันเดียวกัน ดังนั้นความสูงของสัญลักษณ์จะหมายถึงปริมาณที่เท่ากันในทุกแถว — ซึ่งมักจะเป็นสิ่งที่แดชบอร์ดเปรียบเทียบต้องการ DisplayEmptyCellsAs จะกำหนดการจัดการกับเซลล์ต้นทางที่ว่างเปล่าบนเส้น: ปล่อยเป็นช่องว่าง นับเป็นศูนย์ หรือเชื่อมต่อจุดข้างเคียงเพื่อข้ามช่องว่างนั้น
สิ่งที่ HotXLS เขียนลงใน extLst ของเวิร์กชีตเมื่อทำการบันทึก
เมื่อบันทึก HotXLS จะแปลงแต่ละกลุ่มเป็นอนุกรมในฐานะองค์ประกอบ x14:sparklineGroup ซึ่งเก็บคุณสมบัติประเภทและสวิตช์เปิดปิด พอร์ตสีเป็นองค์ประกอบย่อย และรายการ x14:sparklines ที่สมาชิกจับคู่สูตรช่วงข้อมูล xm:f เข้ากับเซลล์โฮสต์ xm:sqref โครงสร้างทั้งหมดนี้อยู่ภายใน <extLst><ext uri="{05C60535-1F16-4fd2-B633-F4F36F0B64E0}"> ที่ตอนท้ายของส่วนเวิร์กชีต โดยมีเนมสเปซ x14 ประกาศอยู่บนบล็อกโดยตรง เช่นเดียวกับที่ Excel เขียน เวิร์กชีตที่ไม่มีกลุ่มสปาร์กไลน์จะไม่สร้าง extLst เลย ดังนั้นไฟล์ที่ไม่เคยใช้ฟีเจอร์นี้จะออกมาเหมือนเดิมทุกไบต์กับไฟล์ที่สร้างโดย HotXLS รุ่นก่อนหน้า — ซึ่งเป็นระเบียบวินัยการเขียนแบบระมัดระวังเดียวกันกับที่อธิบายไว้ในบทความเกี่ยวกับโครงสร้างพื้นฐานการเดินทางแบบไปกลับที่ไม่มีการสูญเสียข้อมูล
รายละเอียดข้อกำหนดหนึ่งประการมีความสำคัญหากคุณเปรียบเทียบผลลัพธ์กับ Excel หรือตรวจสอบ XML ด้วยตนเอง: ค่าเริ่มต้น Schema ของ lineWeight คือ 0.75 พอยต์ ไม่ใช่ 1.25 ตามที่แหล่งข้อมูลอ้างอิงระดับรองบางแห่งอ้างอิง — [MS-XLSX] กำหนด CT_SparklineGroup@lineWeight ด้วยค่าเริ่มต้น 0.75 ซึ่งตรงกับน้ำหนักเส้นที่ UI ของ Excel ใช้งานจริง HotXLS เคารพค่าเริ่มต้นโดยการละเว้น: ตั้งค่า LineWeight เป็นค่าอื่นที่ไม่ใช่ 0.75 และแอตทริบิวต์จะถูกเขียนขึ้น หากปล่อยไว้ที่ 0.75 จะไม่ถูกเขียน การทำให้ค่านี้ผิดพลาดไม่ว่าจะทางใดจะทำให้ไฟล์แสดงผลดูหนักกว่าหรือเบากว่าสมุดงานเดียวกันที่บันทึกจาก Excel เล็กน้อย
การเดินทางไปกลับ การคัดลอกเวิร์กชีต และส่วนขยายที่ HotXLS ไม่ได้สร้างโมเดล
การเปิดคือภาพสะท้อนของการบันทึก เมื่อ HotXLS เปิดสมุดงานที่มีสปาร์กไลน์ — ไม่ว่า HotXLS จะเขียนหรือ Excel เขียนก็ตาม — ตัวแยกวิเคราะห์จะดักจับ GUID ของส่วนขยายสปาร์กไลน์ และสร้างทุกกลุ่ม สมาชิก สี และตัวเลือกแกนใหม่ในโมเดลประเภท ดังนั้นวงจรการเปิด→แก้ไข→บันทึกจะรักษาพวกมันไว้อย่างสมบูรณ์ การคัดลอกเวิร์กชีตไปยังสมุดงานอื่นจะโคลนกลุ่มสปาร์กไลน์พร้อมกับส่วนอื่น ๆ ของแผ่นงาน ซึ่งทำให้การสร้างรายงานตามเทมเพลตทำได้ง่าย: เพียงรักษาแผ่นงานเทมเพลตที่มีสไตล์ คัดลอกทีละรายงาน และชี้ช่วงข้อมูลใหม่
extLst ยังสามารถมีบล็อกส่วนขยายที่ HotXLS ไม่มีโมเดลที่กำหนดประเภทให้ — Excel จะเขียนบล็อก x14 สำหรับฟีเจอร์ต่าง ๆ เช่น ตัวแบ่งส่วนข้อมูล (slicers) และการจัดรูปแบบตามเงื่อนไขแบบขยายลงในรายการเดียวกันนี้ ตั้งแต่ v2.131.0 บล็อกภายนอกเหล่านั้นจะถูกเก็บรักษาไว้ตามคำนำเดิมตลอดการเดินทางไปกลับแทนที่จะถูกทิ้ง: ตัวแยกวิเคราะห์จะจับภาพพวกมัน แสดงพวกมันเป็นแบบอ่านอย่างเดียวผ่าน Worksheet.RawWorksheetExts และเขียนกลับเมื่อบันทึก และพวกมันจะเดินทางไปพร้อมกับเวิร์กชีตเมื่อถูกคัดลอกไปยังสมุดงานอื่น XML ที่เก็บรักษาไว้ถูกสร้างขึ้นใหม่จากเหตุการณ์ตัวแยกวิเคราะห์ ดังนั้นจึงมีความหมายเทียบเท่ากับต้นฉบับแทนที่จะเหมือนกันทุกไบต์ แต่ Excel ก็ยอมรับและฟีเจอร์เหล่านั้นก็รอดพ้นมาได้ ผลลัพธ์ในทางปฏิบัติคือสิ่งสำคัญในการใช้งานจริง: การเปิดสมุดงานของลูกค้าและบันทึกใหม่จะไม่ลบส่วนขยายที่คุณไม่ได้ร้องขอให้ HotXLS ทำความเข้าใจอีกต่อไป
ขอบเขตที่แท้จริง: สปาร์กไลน์จะแสดงผลใน Excel 2010 ขึ้นไป และในโปรแกรมอ่านอื่น ๆ ที่ใช้ส่วนขยาย x14; Excel 2007 จะแสดงข้อมูลโดยไม่มีสัญลักษณ์แสดง ซึ่งเป็นระดับประสิทธิภาพที่ลดลงตามที่รูปแบบข้อมูลถูกออกแบบมา ประเภทสปาร์กไลน์สามประเภท ช่องสีแปดช่อง สวิตช์จุดข้อมูล และโหมดแกนสามโหมด ครอบคลุมพื้นผิวตัวเลือกทั้งหมดที่กล่องโต้ตอบของ Excel นำเสนอ การรองรับสปาร์กไลน์พร้อมกับส่วนอื่น ๆ ของเอ็นจิน XLSX ที่แสดงที่นี่ จัดส่งใน HotXLS Delphi Excel Component สำหรับ Delphi และ C++Builder