Praca z Open XML 2.0 przy użyciu C# do parsowania dużych plików Excela. Problem, na który się natknę, to komórka, którą parsuję, nie ma DataType I, następnie sprawdź NumberFormatId, aby określić, czy jest to liczba dziesiętna, liczba czy data. Szukam dokładnego zakresu NumberFormatId dla liczb/liczb dziesiętnych vs dat. Wygląda na to, że niektóre cyfry/cyfry dziesiętne mają format 189,212,214,305, a daty mają wartości 185, 194, 278 itd. Czy ktoś wie, czy specyfikacja określa te zakresy?C# Open XML 2.0 NumberFormatId range
Zmieniano - Więcej informacji
Poniżej jest przykład formatu numer 194 z pliku style.xml w folderze xl.
Arkusze programu Excel pochodzą z różnych regionów świata, więc myślę, że formaty liczbowe są różne, ale czy nakładają się na siebie? Czy numFmtId 194 będzie czymś innym niż data na różnych ustawieniach kultury?
Poniżej znajduje się sposób konwertowania c.CellValues takich jak "40574" na daty, ale problem polega na tym, że wiem, czy "40574" jest datą, a nie liczbą?
DateTime.FromOADate(Convert.ToDouble(c.CellValue.Text));
Obecnie robię to poprzez sprawdzenie, czy nie ma TypDanych niż sprawdzić CellFormat ale istnieją problemy, gdy niektóre z NumberFormatId nie są w moim czeku.
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
Edit
W moim zaktualizowanej postu zapomniałem odpowiedzieć wartość znalazłem w pliku style.xml:
<numFmt numFmtId="323" formatCode="mmm/yy;@"/>
Więc z tym moje pytanie byłoby jak mogę uzyskać formatCode i przeanalizować go, aby ustalić, czy jest to data?
Poniżej jest wyjście z bezpośrednim oknie debugowania w 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"
Spójrz na te strony zawierające tabelę z wartościami całkowitymi i odpowiadającymi formatami: http://closedxml.codeplex.com/wikipage?title=NumberFormatId%20Lookup%20Table lub http://lateral8.com/articles/2010 /6/11/openxml-sdk-20-formatowanie-excel-values.aspx. –
Czy potrzebujesz pomocy w tej sprawie, czy te linki wystarczyły do rozwiązania Twojego problemu? Jeśli tak, mógłbym napisać to jako rozwiązanie :). Jeśli potrzebujesz więcej informacji lub szukasz czegoś innego, daj mi znać, a ja postaram się pomóc. –
Potrzebujesz więcej informacji na ten temat. Podane linki nie obejmują formatów wymienionych w moim pytaniu 189,212,214,305 itd. Szukam zakresu dla wszystkich dat vs liczb/liczb dziesiętnych lub łańcuchów. – maguy