HotXLS tạo Excel Sparkline — các biểu đồ nhỏ mà Excel vẽ bên trong một ô duy nhất — từ Delphi và C++Builder chỉ với một lệnh gọi: TXLSXWorksheet.AddSparklineGroup xây dựng một nhóm sparkline trên một phạm vi dữ liệu, và việc lưu workbook sẽ ghi nó dưới dạng một khối tiện ích mở rộng x14 bên trong extLst của worksheet, thứ mà Excel 2010 trở lên dựng hình và các trình đọc cũ hơn bỏ qua mà không báo lỗi. Không cần đối tượng biểu đồ, không cần phần vẽ, không cần neo hình học
Kịch bản làm cho sparkline trở nên đáng giá luôn giống nhau. Một dashboard workbook mang vài trăm hàng, mỗi hàng cho một sản phẩm, khu vực hoặc tài khoản, mỗi hàng có mười hai số liệu hàng tháng, và ai đó muốn có một ký hiệu xu hướng ở cuối mỗi hàng. Nếu mô hình hóa điều đó bằng các biểu đồ thực sự, bạn sẽ phải tạo ra hàng trăm phần biểu đồ DrawingML, mỗi phần có XML, mối quan hệ và neo hình học riêng, chưa nói đến việc điều đó ảnh hưởng thế nào đến dung lượng file và thời gian mở. Một nhóm sparkline chỉ là một khối XML duy nhất nói rằng "vẽ một đường nhỏ từ B2:M2 vào N2, và từ B3:M3 vào N3," lặp lại một cách tiết kiệm cho bao nhiêu hàng tùy ý
Tại sao sparkline lại là một tiện ích mở rộng x14 thay vì một biểu đồ?
Sparkline xuất hiện cùng Excel 2010, ba năm sau khi schema cơ sở ECMA-376 được đóng băng, do đó chúng không thể nằm trong chính mã markup của worksheet mà không làm hỏng mọi trình đọc hiện có. Câu trả lời của Microsoft là cơ chế danh sách tiện ích mở rộng (extension list): một worksheet có thể kết thúc bằng một phần tử <extLst> chứa các khối <ext>, mỗi khối được gắn một URI xác định tính năng ([MS-XLSX] §2.3.6). Sparkline sử dụng URI {05C60535-1F16-4fd2-B633-F4F36F0B64E0} và namespace x14. Trình đọc nhận dạng GUID sẽ phân tích cú pháp khối; trình đọc không nhận dạng được yêu cầu bỏ qua nó. Đó là toàn bộ câu chuyện tương thích ngược, và đó là lý do tại sao Excel 2007 mở một sparkline workbook bình thường — nó chỉ hiển thị các số nguồn mà không có các ký hiệu đồ họa
Một chi tiết của cơ chế này đáng được nhắc đến vì nó trái ngược với giả định thông thường: không cần khai báo mc:Ignorable trên root của worksheet. Cổng ext GUID là đủ tự thân, và trình viết của chính Excel khai báo namespace x14 cục bộ trên phần tử <ext> thay vì đụng đến root. HotXLS tuân theo cùng một mô hình, giúp giữ nguyên phần còn lại của XML worksheet. Đây cũng là sự khác biệt về mặt cấu trúc so với biểu đồ thực sự: một biểu đồ là một phần DrawingML riêng biệt với pipeline dựng hình riêng của nó, được đề cập trong bài viết đi kèm về biểu đồ, hình ảnh và bản vẽ, trong khi một sparkline là siêu dữ liệu worksheet mà chính lưới bảng tính tự vẽ
Làm thế nào để thêm sparkline vào một file XLSX bằng lập trình?
TXLSXWorksheet.AddSparklineGroup(AType, ASourceRange, ALocation) là con đường một lần gọi: nó tạo ra một nhóm thuộc loại đã cho, gán cho nó màu series mặc định của Excel, và thêm ánh xạ sparkline đầu tiên từ phạm vi nguồn đã định danh sheet vào một ô chứa. TXLSXSparklineGroup được trả về sau đó chấp nhận thêm các sparkline thông qua phương thức Add của nó, một cặp F/Sqref trên mỗi hàng, tất cả đều chia sẻ loại và định dạng của nhóm. Đối với trường hợp dashboard, đó chính là cấu trúc bạn muốn: một nhóm, một bộ tùy chọn trực quan, hàng trăm thành viên
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 bao gồm ba loại mà Excel cung cấp: xlsxSparklineLine cho các đường xu hướng, xlsxSparklineColumn cho các biểu đồ cột nhỏ, và xlsxSparklineStacked cho các dải win/loss nơi mọi giá trị được dựng dưới dạng khối lên hoặc xuống. Mỗi thành viên sparkline chỉ là hai chuỗi — F, phạm vi nguồn đã định danh sheet, và Sqref, ô chứa ký hiệu đồ họa — do đó không có gì khác để cấu hình trên mỗi hàng. Các nhóm cũng có thể được xây dựng hoàn toàn thủ công thông qua collection Worksheet.SparklineGroups khi bạn muốn bắt đầu từ một nhóm trống thay vì mặc định đã gán
Marker, slot màu, và tỷ lệ trục trên typed model
TXLSXSparklineGroup hiển thị toàn bộ tập hợp tùy chọn từ ribbon Sparkline Tools của Excel dưới dạng các thuộc tính thông thường. Sáu nút bật tắt boolean nhấn mạnh các điểm dữ liệu: Markers cho mọi điểm trên một line sparkline, cộng với HighPoint, LowPoint, NegativePoints, FirstPoint, và LastPoint. Tám slot màu ARGB ghép đôi với chúng — ColorSeries, ColorNegative, ColorAxis, ColorMarkers, ColorFirst, ColorLast, ColorHigh, ColorLow — với quy ước rằng một slot để ở giá trị 0 sẽ được bỏ qua khỏi file và Excel áp dụng mặc định của riêng nó. Dạng màu ARGB hoàn toàn mờ đục tương tự xuất hiện trong toàn bộ thư viện, do đó $FFD00000 ở đây mang cùng ý nghĩa màu đỏ như trong các style định dạng có điều kiện
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;
Các thuộc tính trục xứng đáng được suy nghĩ một chút trước khi bạn chấp nhận các giá trị mặc định. MinAxisType và MaxAxisType mỗi loại nhận tỷ lệ riêng lẻ, nhóm, hoặc tùy chỉnh: tỷ lệ riêng lẻ co giãn mỗi sparkline theo min và max của riêng nó, điều này làm cho một hàng dao động giữa 99 và 101 trông cũng kịch tính như một hàng tăng gấp ba. Tỷ lệ nhóm đặt mọi thành viên trên một thang đo dọc chung duy nhất, do đó chiều cao ký hiệu đồ họa thể hiện cùng một số lượng ở mọi hàng — thường là những gì một dashboard so sánh cần. DisplayEmptyCellsAs quyết định những gì một ô nguồn trống tác động đến một đường: để lại khoảng trống, tính là số không, hoặc bắc cầu qua lỗ hổng bằng cách kết nối các lân cận của nó
Những gì HotXLS ghi vào extLst của worksheet khi lưu
Khi lưu, HotXLS tuần tự hóa mỗi nhóm dưới dạng một phần tử x14:sparklineGroup mang các thuộc tính loại và nút bật tắt, các slot màu dưới dạng các phần tử con, và một danh sách x14:sparklines có các thành viên ghép cặp công thức phạm vi xm:f với một ô chứa xm:sqref. Toàn bộ cấu trúc nằm bên trong <extLst><ext uri="{05C60535-1F16-4fd2-B633-F4F36F0B64E0}"> ở cuối phần worksheet, với namespace x14 được khai báo ngay trên khối, chính xác như cách Excel ghi. Một worksheet không có nhóm sparkline nào sẽ không phát ra extLst nào cả, do đó các file chưa bao giờ sử dụng tính năng này sẽ có đầu ra giống hệt từng byte với những gì các phiên bản HotXLS cũ hơn tạo ra — cùng một quy tắc kỷ luật trình viết bảo thủ được mô tả trong bài viết về hạ tầng round-trip không tổn hao
Một chi tiết đặc tả quan trọng nếu bạn so sánh đầu ra với Excel hoặc tự kiểm tra XML: mặc định của schema cho lineWeight là 0.75 point, không phải 1.25 như một số nguồn thứ cấp trích dẫn — [MS-XLSX] định nghĩa CT_SparklineGroup@lineWeight với mặc định là 0.75, khớp với độ dày mà UI của Excel thực sự áp dụng. HotXLS tôn trọng mặc định bằng cách bỏ qua: đặt LineWeight thành bất kỳ giá trị nào khác 0.75 và thuộc tính được ghi, để nó ở mức 0.75 và thuộc tính không được ghi. Làm sai điều này theo một trong hai hướng sẽ tạo ra các file dựng hình dày hơn hoặc mỏng hơn một chút so với cùng một workbook được lưu từ Excel
Round-trip, sao chép sheet, và các tiện ích mở rộng HotXLS không mô hình hóa
Mở file là hình ảnh phản chiếu của việc lưu file. Khi HotXLS mở một workbook mang sparkline — dù HotXLS hay Excel viết — trình phân tích cú pháp sẽ khóa vào sparkline ext GUID và xây dựng lại mọi nhóm, thành viên, màu sắc và tùy chọn trục vào typed model, do đó chu trình mở→chỉnh sửa→lưu bảo toàn chúng hoàn toàn. Việc sao chép một worksheet vào một workbook khác sẽ nhân bản các nhóm sparkline của nó cùng với phần còn lại của sheet, điều này giúp việc tạo báo cáo theo template diễn ra suôn sẻ: giữ một template sheet được tạo kiểu, sao chép nó trên mỗi báo cáo, và trỏ lại các phạm vi
extLst cũng có thể chứa các khối tiện ích mở rộng mà HotXLS không có typed model — Excel viết các khối x14 cho các tính năng như slicer và định dạng có điều kiện mở rộng vào cùng một danh sách. Kể từ phiên bản v2.131.0, các khối lạ đó được bảo toàn nguyên vẹn qua một round-trip chứ không bị bỏ qua: trình phân tích cú pháp thu thập chúng, hiển thị chúng dưới dạng chỉ đọc thông qua Worksheet.RawWorksheetExts, và ghi lại chúng khi lưu, và chúng di chuyển cùng với một sheet khi nó được sao chép sang workbook khác. XML được bảo toàn được xây dựng lại từ các sự kiện của trình phân tích cú pháp, do đó nó tương đương về mặt ngữ nghĩa với bản gốc chứ không phải giống hệt từng byte, nhưng Excel chấp nhận nó và các tính năng sống sót. Kết quả thực tế là điều quan trọng trong môi trường production: việc mở workbook của khách hàng và lưu lại không còn tước bỏ các tiện ích mở rộng mà bạn không yêu cầu HotXLS hiểu
Giới hạn thực tế: sparkline dựng hình trong Excel 2010 trở lên, và trong bất kỳ trình đọc nào khác triển khai tiện ích mở rộng x14; Excel 2007 hiển thị dữ liệu không có các ký hiệu đồ họa, đây là sự hạ cấp mà định dạng được thiết kế để có. Ba loại sparkline, tám slot màu, các nút bật tắt điểm, và ba chế độ trục bao quát toàn bộ bề mặt tùy chọn mà dialog của chính Excel cung cấp. Hỗ trợ sparkline, cùng với phần còn lại của engine XLSX hiển thị ở đây, đi kèm trong HotXLS Delphi Excel Component dành cho Delphi và C++Builder