HotXLS ghi workbook Open XML ISO/IEC 29500 Strict từ Delphi và C++Builder bằng cách đặt một thuộc tính duy nhất, StrictOOXML, trước khi lưu. Mọi phần trong package, từ xl/workbook.xml xuống đến các file quan hệ (relationship) và loại nội dung (content type), đều được ghi bằng từ vựng purl.oclc.org nghiêm ngặt thay vì từ vựng schemas.openxmlformats.org chuyển tiếp, và các tính năng mà Strict không cho phép bị từ chối bằng một ngoại lệ rõ ràng thay vì vẫn được ghi ra bất chấp
Phần lớn nhà phát triển gặp yêu cầu này qua một tài liệu đấu thầu. Các gói thầu khu vực công ở nhiều quốc gia yêu cầu dạng chuẩn hóa ISO của Open XML, không phải dạng chuyển tiếp mà Office ghi ra theo mặc định, và một kho lưu trữ bắt buộc ISO 29500 Strict sẽ từ chối một file .xlsx bình thường ngay cả khi Excel mở nó hoàn hảo. Không gian tên chuyển tiếp tồn tại để đáp ứng hành vi nhị phân cũ; không gian tên nghiêm ngặt là dạng chuẩn thực thụ
Điều gì thực sự khác biệt giữa Strict và Transitional?
Khác biệt hiển thị là từ vựng. Một phần workbook nghiêm ngặt khai báo http://purl.oclc.org/ooxml/spreadsheetml/main làm không gian tên gốc và http://purl.oclc.org/ooxml/officeDocument/relationships cho các tham chiếu quan hệ, và không có không gian tên chuyển tiếp nào được phép tồn tại ở bất kỳ đâu trong package. Loại quan hệ cũng thay đổi theo, nên phần quan hệ gốc đặt tên .../ooxml/officeDocument/relationships/officeDocument thay vì phiên bản openxmlformats quen thuộc, và loại thuộc tính mở rộng được viết theo kiểu camelCase là extendedProperties
Khác biệt vô hình là phạm vi. Strict cố tình bỏ qua những phần của schema chuyển tiếp vốn chỉ tồn tại để khứ hồi (round-trip) với các file nhị phân cũ, cùng với các phần mở rộng của nhà cung cấp mà Office đã thêm vào sau đó. Đó là lý do vì sao việc chuyển đổi không phải là tìm và thay thế chuỗi: một số tính năng đơn giản không có cách viết nghiêm ngặt và không được phép ghi ra chút nào
Bật tính năng này
Mã tạo file thông thường không thay đổi. Xây dựng workbook theo cách bạn vẫn làm, đặt cờ, và lưu:
var
Wb: TXLSXWorkbook;
Sh: TXLSXWorksheet;
begin
Wb := TXLSXWorkbook.Create;
try
Sh := Wb.Sheets.Add('Data');
Sh.Cells[1, 1].Value := 'Product';
Sh.Cells[1, 2].Value := 'Amount';
Sh.Cells[2, 1].Value := 'Widget';
Sh.Cells[2, 2].Value := 17;
Sh.Cells[3, 2].Formula := '=SUM(B2:B2)';
Wb.StrictOOXML := True; // đầu ra ISO/IEC 29500 Strict
if Wb.SaveAs('archive-copy.xlsx') <> 1 then
raise Exception.Create('strict save failed');
finally
Wb.Free;
end;
end;
Cờ này được đặt lại vào đầu mỗi thao tác lưu và được gán lại từ thuộc tính workbook, nên một ngoại lệ trong một lần lưu không thể làm rò rỉ chế độ strict sang lần lưu tiếp theo. Chi tiết đó quan trọng trong các tiến trình server nơi một đối tượng workbook phục vụ nhiều yêu cầu xuất khác nhau
Vì sao một lần lưu strict có thể từ chối chạy?
Bốn nhóm tính năng là phần mở rộng của Microsoft không có tương đương ISO 29500 Strict, và HotXLS phát sinh ngoại lệ tại thời điểm lưu thay vì phát ra một package tự nhận tuân thủ strict mà thực ra không phải vậy:
// Đầu ra Strict không thể nhúng một VBA project
// -> lưu workbook bật macro dưới dạng .xlsm chuyển tiếp
// Đầu ra Strict không thể mang điều khiển form
// -> nút, checkbox, combo box và ctrlProps của chúng
// Đầu ra Strict không thể mang bình luận dạng luồng (threaded)
// -> mô hình persons/threads hiện đại, không phải ghi chú kiểu cổ điển
// Đầu ra Strict không thể mang metadata mảng động
// -> dải tràn (spill range) được ghi lại qua phần metadata
Thất bại rõ ràng là đánh đổi đúng ở đây. Một VBA project bị âm thầm loại bỏ biến một workbook đang hoạt động thành một workbook hỏng nhưng vẫn mở được, và báo cáo về lỗi này đến từ người dùng vài tuần sau đó. Một ngoại lệ nêu tên tính năng và thuộc tính cần đổi trong khi mã gọi vẫn còn biết nó đang xuất cái gì. Việc bảo toàn macro và liên kết ngoài trên đường dẫn chuyển tiếp được đề cập trong bảo toàn VBA project và liên kết ngoài
Hai nhóm mở rộng được xử lý khác đi, và đáng để hiểu vì sao. Data bar, sparkline và các tính năng tương tự nằm trong từ vựng x14 và xm, còn các biến thể SVG của hình ảnh nằm trong c15. Đây là nội dung danh sách mở rộng có không gian tên tự mô tả, các bộ phân tích bảng tính tổng quát chấp nhận chúng, và không có tương đương ISO nào để dịch chúng sang. HotXLS giữ lại chúng thay vì bỏ nội dung của người dùng. Nếu một trình kiểm định trong pipeline của bạn nghiêm ngặt cả về phần mở rộng lẫn không gian tên, hãy loại bỏ các tính năng đó khỏi workbook nguồn trước khi xuất
Việc dịch phải chạm đến những phần mà bình thường không ai viết lại
Bài toán kỹ thuật thú vị trong đầu ra strict không phải là XML worksheet. Đó là những phần mà một bộ ghi nhanh thà sao chép nguyên văn. HotXLS bảo toàn theme, kết nối, liên kết ngoài, biểu đồ và blob pivot bằng cách sao chép trực tiếp byte đã nén gốc của chúng, đây chính xác là điều đúng đắn để giữ độ trung thực và chính xác là điều sai lầm đối với đầu ra strict, vì byte được sao chép mang theo không gian tên chuyển tiếp
Dưới StrictOOXML, năm đường dẫn bảo toàn đó chuyển sang dựng lại hoặc phát lại có dịch, bỏ qua đường dẫn sao chép byte nhanh. Toàn bộ XML đi qua một hàm dịch duy nhất, hàm này neo vào các giá trị thuộc tính trong dấu ngoặc kép để một chuỗi trông giống URI bên trong một ô không bao giờ bị viết lại nhầm. Văn bản trong ô chứa cùng URI đó được thoát ký tự (escape) thành thực thể trong XML, nên phép thay thế đã neo không thể nhìn thấy nó. Bộ ghi dạng streaming dịch phần khung trước rồi mới tách tại sheetData, vì các khối hàng hoàn toàn không chứa URI từ vựng nào. Cơ chế liên quan cho đường dẫn bảo toàn được đề cập trong khứ hồi không mất mát của theme, danh sách mở rộng và calcChain
Đọc các file mà Excel đã lưu ở dạng strict
Đầu ra chỉ là một nửa câu chuyện. Excel cung cấp tùy chọn lưu "Strict Open XML Spreadsheet", và các file được tạo theo cách đó phải mở đúng. HotXLS chuẩn hóa loại quan hệ tại mọi điểm phân tích quan hệ trong package, phần gốc, liên kết ngoài, worksheet, bản vẽ và bảng pivot, nên một loại quan hệ strict khớp với cùng hằng số nội bộ như đối tác chuyển tiếp của nó
Phía đọc có đối tác tương ứng là chuẩn hóa tiền tố không gian tên, cho phép các tiền tố tùy ý và cả hai từ vựng phân giải về một bảng tên chuẩn duy nhất. Công việc đó có lợi cho các file thông thường cũng như các file strict, vì các bộ tạo của bên thứ ba gán tiền tố tự do, và đó chính là cơ chế được mô tả trong giải quyết quan hệ OPC trong package XLSX
Danh mục kiểm tra ngắn trước khi phát hành đầu ra strict
Hãy xác minh với package, đừng xác minh với Excel. Excel mở cả hai dạng một cách vui vẻ, nên việc mở thành công không chứng minh được điều gì về tính tuân thủ. Giải nén kết quả và xác nhận rằng xl/workbook.xml khai báo không gian tên purl, rằng không có phần nào chứa schemas.openxmlformats.org/spreadsheetml, và rằng loại quan hệ trong _rels/.rels và xl/_rels/workbook.xml.rels dùng dạng nghiêm ngặt
Sau đó mở lại file qua HotXLS và so sánh giá trị, công thức, định dạng và siêu liên kết với bản gốc. Một bài kiểm tra đọc lại là cách rẻ nhất để chứng minh việc dịch không làm hỏng nội dung, và nó cùng lúc kiểm thử cả cơ chế chuẩn hóa phía đọc. Nếu workbook của bạn mang biểu đồ, hãy kiểm tra cả những phần đó, vì phần biểu đồ là một trong các phần được bảo toàn chuyển sang đường dẫn dựng lại dưới chế độ strict
Đầu ra strict, đọc dung nạp và bảo toàn không mất mát đều là một phần của cùng bộ máy OOXML cho Delphi và C++Builder; danh sách tính năng đầy đủ có trên trang thành phần bảng tính HotXLS Delphi