HotXLS giữ ChartML gốc của một biểu đồ Excel đã nhập và phát lại từng byte khi không có gì trong typed model thay đổi, nên việc mở và lưu lại một sổ làm việc không âm thầm tước bỏ những phần của biểu đồ mà object model không đại diện. Sửa một tiêu đề, một chuỗi hoặc một trục và HotXLS hợp nhất về mặt cấu trúc các typed node mới vào cây gốc thay vì tái sinh biểu đồ từ đầu
Sự phân biệt đó — phát lại khi chưa chạm, hợp nhất khi đã sửa — chính là điều khiến một ứng dụng Delphi an toàn để chỉ vào các biểu đồ mà một nhà phân tích dựng trong Excel. Tái sinh một biểu đồ từ một typed model luôn mất bất cứ thứ gì model không biết tới, và biểu đồ Excel đầy rẫy thứ mà một thư viện không biết tới: style tùy chỉnh, danh sách extension, nhánh alternate content, định dạng đủ tiêu chuẩn không gian tên từ add-in
Vì sao lưu lại một sổ làm việc lại san phẳng các biểu đồ?
Vì hiện thực thông thường đọc những gì nó hiểu và ghi những gì nó hiểu. Mọi thứ ở giữa — một extLst từ một build Excel mới hơn, một nhánh mc:AlternateContent, một hiệu ứng shape mà model không có thuộc tính cho — tồn tại trong file, không có chỗ trong object model, và biến mất lúc lưu. Người dùng thấy một biểu đồ mất gradient, nhãn dữ liệu tùy chỉnh hay hiệu ứng 3D của nó, và sổ làm việc không giải thích được tại sao
Với PreserveUnsupportedParts bật trên sổ làm việc, HotXLS lưu các byte UTF-8 gốc của biểu đồ khi nhập cùng với độ dài và một dấu vân tay 64-bit của nội dung đã model. Nếu typed model không thay đổi tới lúc lưu, nó ghi lại các byte gốc. Không sắp xếp lại XML, không trôi khoảng trắng, không bản sao UTF-16 thường trú của biểu đồ nằm quanh trong bộ nhớ cho một biểu đồ không ai sửa
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;
Phép hợp nhất giữ gì và model sở hữu gì
Quy tắc là quyền sở hữu. Các typed node công khai — tiêu đề, chuỗi, cache, plot group, trục — được quyết định bởi cây mới sinh. Các cây con chưa model được mang qua từ cây gốc. Sự bất đối xứng đó có chủ đích, và là phần cần một chút thời gian để nội tâm hóa: xóa một chuỗi không được phép hồi sinh chuỗi cũ từ XML đã bảo toàn, nên bất cứ thứ gì model sở hữu đều được lấy từ model ngay cả khi model nói "đã mất"
Nội dung không sở hữu được chèn lại bên cạnh các typed node khớp mà nó từng nằm cạnh, còn extLst nằm cuối trong cha của nó vì đó là nơi schema yêu cầu. Xoá một thuộc tính đã biết — gỡ một cờ đậm, bỏ một màu — được coi là một phép xoá, không phải một khoảng trống để điền từ cây gốc. Các thuộc tính không xác định trong cùng vùng lân cận giữ nguyên vị trí
Nội dung markup-compatibility được xử lý riêng. Khi phân tích, HotXLS bỏ qua mc:Choice và đọc mc:Fallback; nếu nhánh fallback đó bọc một plot group mà model biết, phép hợp nhất ghi nội dung typed mới ngược vào cây con fallback. Thiếu bước đó, một lần lưu sẽ phát ra plot group mới và để lại cái cũ bên trong fallback, và biểu đồ sẽ mang hai cái
Rút một biểu đồ ra khỏi cơ chế
ClearPreservedXml xoá XML và dấu vân tay gốc của một biểu đồ, nên lần lưu kế tiếp dựng lại biểu đồ đó thuần từ typed model. Đó là quyết định theo từng biểu đồ; PreserveUnsupportedParts mức sổ làm việc vẫn chi phối việc trạng thái bảo toàn có được xây khi nhập
Hãy tới nó khi bạn muốn một biểu đồ sạch thay vì một biểu đồ trung thực — ví dụ khi một biểu đồ mẫu mang định dạng từ một theme công ty cũ và mục đích của thao tác là vứt nó. Đừng tới nó như một phản xạ debug: một biểu đồ render sai sau khi sửa thường là câu hỏi modeling hơn là câu hỏi bảo toàn, và xoá XML bảo toàn phá hủy bằng chứng
Combination chart và trục thứ hai
AddPlotGroup dựng combination chart có thứ tự, nơi mỗi plot group giữ họ biểu đồ riêng và phép gán trục chính hay phụ riêng. Đó là điều mà biểu đồ doanh nghiệp phổ biến cần: doanh thu dưới dạng cột trên trục trái, tỷ lệ biên dưới dạng đường trên trục phải
Biểu đồ phơi bày các trục category và value chính lẫn phụ cộng thêm một trục chuỗi, với các thiết lập category, value, date và trục chuỗi có kiểu bao phủ vị trí, định danh, phép cắt, đơn vị ngày, khoảng nhãn và hiển thị. API phẳng cũ — ChartType, AddSeries, tập hợp Series phẳng — vẫn trỏ tới plot group chính, nên mã sẵn có tiếp tục hoạt động trong khi model bên dưới giữ mọi group có thứ tự
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;
Trước khi model này tồn tại, mở và lưu lại một combination chart thu gọn nó về một họ biểu đồ và mất các trục phụ, date và chuỗi. Tham chiếu công thức biểu đồ và giá trị chuỗi được cache giờ sống sót qua các lần chép sổ làm việc và chu kỳ mở/lưu, còn mỏ neo biểu đồ được khớp với các part biểu đồ của chúng theo định danh relationship — nên một ứng dụng sắp xếp lại các mục relationship không còn hoán đổi nội dung biểu đồ giữa các vị trí trang tính
Cái bẫy manual layout
Nếu bạn định vị một plot area, tiêu đề, tiêu đề trục hay chú giải bằng tay, hãy ghi cả bốn tọa độ. Office yêu cầu x, y, w và h như một nhóm đầy đủ bất cứ khi nào một trong số chúng hiện diện, và bỏ qua toàn bộ manualLayout nếu không. HotXLS luôn phát ra hình chữ nhật đầy đủ vì lý do đó, còn SetPositionAndSize đặt và bật nó trong một lệnh gọi
Hai chi tiết nữa đi theo Excel thay vì theo mức độ tự do đầy đủ của đặc tả. Vị trí được ghi với xMode và yMode đặt thành edge trong khi kích thước dùng factor cho wMode và hMode, vì đó là thứ Excel ghi và thứ nó chuyển các tổ hợp khác thành. Và layoutTarget chỉ được phát ra cho plot area, không bao giờ cho tiêu đề hay chú giải, nơi ghi chú hiện thực của Microsoft cấm nó
Đưa điều này vào một vòng chuyến sổ làm việc
Bảo toàn biểu đồ là một hiện thực của một chính sách chung: một thư viện chỉnh sửa tài liệu được tác giả nơi khác nên thay đổi cái nó được yêu cầu thay đổi và không thay đổi gì khác. Cùng lập luận đó thúc đẩy HotXLS trên theme, calculation chain và extension trang tính, được mô tả trong các ghi chú về vòng chuyến không mất dữ liệu cho theme, extLst và calcChain, và về dự án VBA và external link trong bảo toàn VBA và external link. Về bề mặt tác giả biểu đồ — tạo biểu đồ, đặt hình và vẽ từ Delphi — hãy xem bài viết về biểu đồ, hình và drawing trong HotXLS
HotXLS đọc, chỉnh sửa và ghi biểu đồ XLSX từ mã Delphi và C++Builder bản địa không cần Excel cài trên máy, đó là điều khiến tính trung thành trở thành vấn đề thư viện thay vì vấn đề automation — trang thành phần bảng tính HotXLS có danh sách tính năng biểu đồ và một bản tải dùng thử