OpenXML - InnerText - это всегда целое число, а не строка - PullRequest
0 голосов
/ 26 декабря 2018

Когда я читаю значение ячейки из OpenXML, получаемый мной InnerText всегда целочисленный

using (SpreadsheetDocument document = SpreadsheetDocument.Open(INPUT_DIRECTORY, false))
            {
                WorkbookPart wbPart = document.WorkbookPart;

                foreach (Sheet sheet in wbPart.Workbook.Sheets)
                {
                    switch (sheet.Name.ToString())
                    {
                        case "ABC":

                            WorksheetPart wsPart = (WorksheetPart)wbPart.GetPartById(sheet.Id);
                            SheetData sheetdata = wsPart.Worksheet.Elements<SheetData>().FirstOrDefault();                            

                            foreach (Row r in sheetdata.Elements<Row>())
                            {
                                string xxx = r.Elements<Cell>().ElementAt(0).InnerText;
                                string yyy = r.Elements<Cell>().ElementAt(6).InnerText;
                                string zzz = r.Elements<Cell>().ElementAt(12).InnerText;
                            }                            

                            break;
                    }
                }
            }

xxx, гггг, zzz всегда целочисленный, даже если это строка со значением.

Ответы [ 2 ]

0 голосов
/ 16 января 2019

Это, вероятно, потому что вам нужен доступ к SharedStringTable в этом посте показан один из способов его обработки.

В основном вам нужно получить таблицу строк из рабочей книги:

SharedStringTablePart sstpart = workbookPart.GetPartsOfType<SharedStringTablePart>().First();
SharedStringTable sst = sstpart.SharedStringTable;

Затем проверьте тип ячейки.Вы просматриваете и, при необходимости, ищите идентификатор таблицы строк, чтобы получить значение текста.Что-то вроде:

if ((cell.DataType != null) && (cell.DataType == CellValues.SharedString))
{
    int ssid = int.Parse(cell.CellValue.Text);
    string str = sst.ChildElements[ssid].InnerText;
    Console.WriteLine("Shared string {0}: {1}", ssid, str);
}
else if (cell.CellValue != null)
{
    Console.WriteLine("Cell contents: {0}", cell.CellValue.Text);
}
0 голосов
/ 27 декабря 2018

попробуйте это:

using (SpreadsheetDocument document = SpreadsheetDocument.Open(INPUT_DIRECTORY, false))
        {
            WorkbookPart wbPart = document.WorkbookPart;

            foreach (Sheet sheet in wbPart.Workbook.Sheets)
            {
                switch (sheet.Name.ToString())
                {
                    case "ABC":

                        WorksheetPart wsPart = (WorksheetPart)wbPart.GetPartById(sheet.Id);
                        SheetData sheetdata = wsPart.Worksheet.Elements<SheetData>().FirstOrDefault();                            

                        foreach (Row r in sheetdata.Elements<Row>())
                        {
                            string xxx = r.Elements<Cell>().ElementAt(0).InlineString.Text.Text;
                            string yyy = r.Elements<Cell>().ElementAt(6).InlineString.Text.Text;
                            string zzz = r.Elements<Cell>().ElementAt(12).InlineString.Text.Text;
                        }                            

                        break;
                }
            }
        }
...