2012-01-19 44 views
13

Tôi đã tìm kiếm và tìm kiếm trên trang web để tìm câu trả lời nhưng tôi không thể tìm thấy giải pháp - ở mọi nơi mọi người chủ yếu thảo luận cách thêm định dạng số cho tài liệu và áp dụng nó.Cách lấy giá trị ô với định dạng được áp dụng (giá trị ô được định dạng) bằng OpenXML SDK

Điều tôi cần là nhận giá trị ô dưới dạng chuỗi có định dạng được áp dụng - tức là chuỗi giống như được Excel hiển thị.

Tôi đã nhận thấy rằng không có cách nào dễ dàng hoặc chức năng tích hợp sẵn sẽ trả về giá trị được định dạng readymade cho một ô.

Vì vậy, có vẻ như với tôi rằng để có được giá trị tôi cần phải làm hai việc: 1. Nhận chuỗi định dạng. 2. Định dạng giá trị ô bằng chuỗi này.

Nhưng tôi gặp sự cố với cả hai bước.

Người ta có thể dễ dàng có được dụ CellFormat mà sẽ chứa NumberFormatId:

CellFormat cellFormat = (CellFormat) document.WorkbookPart.WorkbookStylesPart.Stylesheet.CellFormats.ElementAt(cell.StyleIndex); 

Nhưng làm thế nào để có được những chuỗi định dạng với NumberFormatId này, nếu id tương ứng với một trong các định dạng được xác định trước tiêu chuẩn? (nghĩa là dưới 160) Chúng không có trong tài liệu bảng tính và tôi không thể tin rằng chúng phải được mã hóa cứng trong ứng dụng.

Ngoài ra, một khi chuỗi định dạng bằng cách nào đó được lấy, cách áp dụng nó vào giá trị ô? Cho đến nay tôi hiểu, mã nên kiểm tra loại giá trị ô và nếu là số - chuyển đổi nó thành chuỗi bằng cách sử dụng chuỗi định dạng.

Tôi tìm thấy this page đề cập đến việc sử dụng Microsoft.Office.Excel.Interop, nhưng tôi chỉ muốn ở lại với OpenXML SDK. Nhìn chung, tôi rất ngạc nhiên khi thấy rất khó để tìm ra câu trả lời dứt khoát cho câu hỏi này trên Web vì tôi nghĩ rằng đây sẽ là điều mà nhiều nhà phát triển cần trong công việc hàng ngày của họ.

+0

Tìm một số mã đẹp ở đây: http://joymonscode.blogspot.se/2013/10/reading-excel-cell-with-number.html –

Trả lời

8

Đàn ông, đây là một khó khăn một ... Tôi sẽ thêm ở đây điều mà tôi phát hiện ra rằng có thể có giá trị ..

Đầu tiên là để có được các định dạng đánh số của tế bào (một khi bạn có CellFormat:

string format = excel.WorkbookPart.WorkbookStylesPart.Stylesheet.NumberingFormats.Elements<NumberingFormat>() 
      .Where(i => i.NumberFormatId.ToString() == cellFormat.NumberFormatId.ToString()) 
      .First().FormatCode; 

để biết thêm thông tin về vấn đề này bạn có thể vào: NumberingFormats

Im cố gắng để tìm hiểu làm thế nào để áp dụng định dạng này ở cell.CellValue sở hữu ... tôi nghĩ rằng thats cách bạn phải đi

!

Ok, đọc mã ClosedXml (mã nguồn mở của nó), có vẻ dễ dàng để có được định dạng.

Chỉ cần chuyển đổi văn bản giá trị thành loại của nó (int, double, v.v.) và gọi phương thức ToString chuyển định dạng. Tôi đã cố gắng làm điều đó với String.Format và không làm việc. Ive đã thử nghiệm ToString và nó hoạt động, nhưng cái gì đó vẫn còn thiếu.

Tôi khuyên bạn nên xem lớp này và lấy mã từ phương thức GetFormattedString() như @El G nói trong nhận xét của mình.

Bassicaly bạn sẽ có thêm một cái gì đó như thế này:

double d = double.Parse(cell.CellValue.InnerText); 
string val = d.ToString(format); 

Hy vọng nó sẽ giúp bạn ...

+0

Cảm ơn rất nhiều cho việc chia sẻ thông tin này, Guido ! Vui lòng cho tôi biết nếu bạn sẽ tìm cách áp dụng định dạng. –

+4

Trên một lưu ý phụ, nếu trong giải pháp của bạn, bạn không phải giới hạn chỉ với OpenXML SDK, bạn có thể sử dụng thư viện [ClosedXML] (http://closedxml.codeplex.com/) nơi tất cả các hành động dường như rất nhiều dễ dàng hơn trong OpenXML thuần túy (và nó được xây dựng trên đầu OpenXML). Trong tài liệu ClosedXML trong [ví dụ về giá trị ô] (http://closedxml.codeplex.com/wikipage?title=Cell%20Values&referringTitle=Documentation) có dòng này: 'Chuỗi booleanFormattedString = cellBoolean.GetFormattedString();' Dường như nó làm những gì chúng tôi đang tìm kiếm. Ngoài ra đào sâu vào mã của phương pháp này có thể giúp hiểu được. –

+0

Tôi đã thêm một số thông tin hữu ích! nghĩ rằng vấn đề của bạn sẽ được giải quyết tại thời điểm này! –

0

Nếu bạn muốn lấy giá trị của ô với định dạng ứng dụng, tương tự như được hiển thị trong Excel, sử dụng .Text thuộc tính của đối tượng Cell. Như thế này:

String formattedValue = cell.Text 
+0

Có vẻ như không phải là thuộc tính Văn bản trong Ô lớp, chỉ trong CellValue (không phải là những gì được hiển thị trong Excel) –

Các vấn đề liên quan