Làm việc với Open XML 2.0 bằng cách sử dụng C# để phân tích các tệp excel lớn. Vấn đề tôi đang chạy vào là các tế bào tôi phân tích cú pháp không có một DataType tôi sau đó kiểm tra NumberFormatId để xác định nếu nó là số thập phân, số hoặc ngày. Tôi đang tìm phạm vi NumberFormatId chính xác cho số/thập phân so với ngày tháng. Họ dường như ở khắp nơi một số số/số thập phân có định dạng 189.212.214.305 và ngày có giá trị 185, 194, 278 vv Có ai biết liệu đặc điểm kỹ thuật có xác định các phạm vi này không?C# Mở XML 2.0 SốFormatId phạm vi
Chỉnh sửa - Thông tin
Dưới đây là một ví dụ về định dạng số 194 từ tập tin bên trong thư mục style.xml xl.
Bảng excel đến từ các vùng khác nhau trên thế giới vì vậy tôi nghĩ các định dạng số khác nhau, nhưng chúng có trùng nhau không? Liệu numFmtId 194 có phải là thứ gì đó không phải là ngày trên các cài đặt văn hóa khác nhau không?
Dưới đây là cách tôi chuyển đổi c.CellValues như "40574" thành ngày, nhưng vấn đề là làm thế nào để tôi biết nếu "40574" là một ngày chứ không phải là một số?
DateTime.FromOADate(Convert.ToDouble(c.CellValue.Text));
Hiện tại tôi đang thực hiện việc này bằng cách kiểm tra xem không có DataType nào hơn kiểm tra CellFormat nhưng có một số vấn đề khi NumberFormatId không nằm trong kiểm tra của tôi.
private Object FormatCellValue(Cell c, SharedStringTable ssTable, CellFormats cellFormats)
{
if (c.CellValue != null)
{
// If there is no data type, this must be a string that has been formatted as a number
if (c.DataType == null)
{
CellFormat cf;
if (c.StyleIndex == null)
{
cf = cellFormats.Descendants<CellFormat>().ElementAt<CellFormat>(0);
}
else
{
cf = cellFormats.Descendants<CellFormat>().ElementAt<CellFormat>(Convert.ToInt32(c.StyleIndex.Value));
}
if ((cf.NumberFormatId >= 14 && cf.NumberFormatId <= 22) ||
(cf.NumberFormatId >= 165 && cf.NumberFormatId <= 180) ||
cf.NumberFormatId == 278 || cf.NumberFormatId == 185 || cf.NumberFormatId == 196 ||
cf.NumberFormatId == 217 || cf.NumberFormatId == 326) // Dates
{
try
{
DateTime dt;
dt = DateTime.FromOADate(Convert.ToDouble(c.CellValue.Text));
...CODE CONTINUES
Sửa
Trong bài cập nhật của tôi, tôi quên gửi giá trị tôi tìm thấy trong các tập tin style.xml:
<numFmt numFmtId="323" formatCode="mmm/yy;@"/>
Vì vậy, với câu hỏi này của tôi sẽ là làm cách nào để lấy formatCode và phân tích cú pháp nó để xác định xem đó có phải là một ngày không?
Dưới đây là sản phẩm từ các cửa sổ gỡ lỗi trực tiếp của NumberFormat 323
{DocumentFormat.OpenXml.Spreadsheet.CellFormat}
base {DocumentFormat.OpenXml.OpenXmlCompositeElement}: {DocumentFormat.OpenXml.Spreadsheet.CellFormat}
Alignment: {DocumentFormat.OpenXml.Spreadsheet.Alignment}
ApplyAlignment: "1"
ApplyBorder: "1"
ApplyFill: "1"
ApplyFont: "1"
ApplyNumberFormat: "1"
ApplyProtection: "1"
BorderId: "64"
ExtensionList: null
FillId: "0"
FontId: "83"
FormatId: "37992"
LocalName: "xf"
NumberFormatId: "323"
PivotButton: null
Protection: {DocumentFormat.OpenXml.Spreadsheet.Protection}
QuotePrefix: "1"
Hãy xem trang đó có chứa bảng có giá trị số nguyên và định dạng tương ứng: http://closedxml.codeplex.com/wikipage?title=NumberFormatId%20Lookup%20Table hoặc http://lateral8.com/articles/2010 /6/11/openxml-sdk-20-formatting-excel-values.aspx. –
Bạn có muốn trợ giúp thêm về điều này hoặc các liên kết này đủ để giải quyết vấn đề của bạn không? Nếu vậy, tôi có thể đăng nó như một giải pháp :). Nếu bạn muốn biết thêm thông tin hoặc đang tìm kiếm một thứ gì đó khác, hãy cho tôi biết và tôi sẽ cố gắng giúp đỡ. –
Cần thêm thông tin về điều này. Các liên kết được cung cấp không bao gồm các định dạng tôi đã liệt kê trong câu hỏi của tôi 189,212,214,305 vv. Tôi đang tìm một phạm vi cho tất cả các ngày so với số nguyên/số thập phân hoặc chuỗi. – maguy