Đầu tiên chúng ta cần phải thiết lập như thế nào Excel hiện chuyển đổi (như chúng ta tự thay đổi kích thước bên trong ứng dụng Excel):
//Use 7d to promote to double, otherwise int will truncate.
ExcelWidth = (Pixels - 12)/7d + 1;//From pixels to inches.
Caveat: Các công thức không làm việc cho 0 (zero) Chiều rộng hoặc Pixel.
Đối với các tình huống đó, hãy sử dụng câu lệnh "if" để kiểm tra xem số không và trả về số không.
Nó cũng ném cho tôi một vòng lặp. Thay vì cố gắng tìm ra Pixels trên Width, tôi đã xem xét sự khác biệt về Pixels giữa mỗi số Width và tìm thấy nó luôn là 7. Ngoại lệ là 0 đến 1 Width; nơi có 12 pixel cho chiều rộng 1.00. Từ đó tôi đã có thể đưa ra các công thức trên, dễ dãi.
Bây giờ, những con số đó đang nắm giữ trong thế giới Excel, nhưng nếu bạn đang đặt chiều rộng cột trực tiếp trong tài liệu OpenXml thì đó là một câu chuyện hơi khác. Đây là lý do: Trong tài liệu bạn liên kết đến, hãy nói về 5 pixel:
Có 4 pixel lề lề (hai trên mỗi cạnh), cộng với 1 pixel cho đường lưới.
Bây giờ tất cả điều đó có nghĩa là Excel giả sử bạn đã tính toán trong 5 pixel này vào độ rộng bạn đang cung cấp. Khi bạn mở tài liệu của bạn trong excel và thay đổi kích thước các cột, bạn sẽ thấy rằng chiều rộng là 5 pixel ít hơn những gì bạn đặt nó vào.
Để điều chỉnh cho điều này, bạn có thể cập nhật các công thức như sau:
//Use 7d to promote to double, otherwise int will truncate.
OpenXmlWidth = (Pixels - 12 + 5)/7d + 1;//From pixels to inches.
này trả lời các tiêu đề của câu hỏi của bạn:
"Formula để chuyển đổi NET pixel chiều rộng Excel ở định dạng OpenXML"
Nếu bạn muốn biết cách tính chiều rộng cột xấp xỉ để tự động điều chỉnh cột dựa trên nội dung (và phông chữ) của một ô thì đó là một câu hỏi hoàn toàn khác. Các công thức được cung cấp bởi liên kết microsoft mà bạn cung cấp sẽ không hoạt động. Nhập 10 dấu chấm trong một ô và 10 cột-M trong một cột khác. Bạn sẽ thấy rằng tự động phù hợp cung cấp cho bạn 41 pixel và 129 pixel, tương ứng. Các công thức được cung cấp bởi ms không tính đến chiều rộng của các ký tự riêng lẻ. Nói cách khác; họ đã gửi cho bạn một cuộc săn đuổi ngỗng hoang dã.
Cách duy nhất để tự động điều chỉnh cột là quét qua từng hàng trong cột và tính chiều rộng của văn bản dựa trên các ký tự và phông chữ được sử dụng. Bạn sẽ sử dụng một cái gì đó giống như những gì tôi tìm thấy here. Sau đó lấy giá trị tối đa của nó và pad bằng 5. Tôi sẽ tránh phương pháp này khi xử lý bảng tính trong môi trường web vì bạn có thể xuất hàng trăm nghìn hàng với hàng chục cột - bạn sẽ có ý tưởng. Cách tiếp cận tốt nhất là đặt chiều rộng đoán tốt nhất cho các cột của bạn và đào tạo người dùng của bạn về cách tự động điều chỉnh từ excel.
Trân trọng,
"The Man Common"
Sửa - 2011/10/26:
Bởi vì tôi cảm thấy hào phóng, đây là một ví dụ về cách để có được một xấp xỉ chiều rộng cho cột của bạn. Tôi muốn tránh làm điều này cho tất cả các hàng trong một cột, vì vậy chúng ta hãy chỉ căn cứ chiều rộng của chúng ta (theo mặc định) trên giá trị trong ô tiêu đề của bạn. Dưới đây là cách bạn có thể làm điều này bằng cách sử dụng ví dụ tôi đã liên kết đến trước đó. Lưu ý: Đây là những xấp xỉ, nhưng đủ gần.
using System.Drawing;
using System.Windows.Forms;//Add Reference. Test on webserver first.
Font font = new Font("Calibri", 11.0f, FontStyle.Regular);
string header = "Hello There World!";
int pxBaseline = TextRenderer.MeasureText("__", font).Width;
int pxHeader = TextRenderer.MeasureText("_" + header + "_"), font).Width;
int pxColumnWidth = pxHeader - pxBaseline + 5;//Pad with 5 for Excel.
Caveat: Nếu bạn sử dụng mã này trong cùng một vị trí bạn đang sử dụng OpenXML, sau đó bạn có thể cần phải loại bỏ các "sử dụng" cho System.Drawing và hoàn toàn đủ điều kiện "Font" và "FontStyle" như System.Drawing.Font và System.Drawing.FontStyle. Nếu không trình biên dịch của bạn có thể nhầm lẫn các lớp này thuộc về DocumentFormat.OpenXml.Spreadsheet.
Nếu đó là một cột được tự động kích thước tại sao không sử dụng thuộc tính phù hợp nhất như được chỉ định trong MSDN được liên kết? – PeteT
Tôi đã thử rồi. Nếu bạn đặt BestFit là True và sau đó mở bảng tính, các cột không được định kích thước phù hợp. –
Pixel-to-EMU là (pixel * 12700). Tôi sẽ không mong đợi độ rộng của cột là pixel. Hãy thử EMU. –