OpenXml и странное поведение - PullRequest
0 голосов
/ 25 ноября 2018

У меня есть следующий код:

            for (int r = 0; r < rows.Count(); r++)
            {
                var cells = rows[r].Elements<Cell>().ToList();
                for (int c = 0; c < cells.Count(); c++)
                {
                    SharedStringTablePart shareStringPart = spreadsheetDocument.WorkbookPart.GetPartsOfType<SharedStringTablePart>().First();
                    SharedStringItem[] items = shareStringPart.SharedStringTable.Elements<SharedStringItem>().ToArray();
                    int v = int.Parse(cells[c].CellValue.Text);
                    text = items[v].InnerText;
                }

и следующий файл Excel:

enter image description here

, но этот код не работаетс помощью

Я отлаживаю его и смотрю на CellValue (моя переменная v) для каждой ячейки строки # 2.

cell [0] = 33 (и она становится правильнойзначение PQ-10387)

ячейка 1 = 22

ячейка [2] = 198

но

cell [3] = 310 и это значение равно значению cell!Что не так в моем коде?

1 Ответ

0 голосов
/ 25 ноября 2018

Обнаружено, что когда ячейка хранит число, тогда CellValue имеет значение ячейки, а DataType равно нулю, в противном случае DataType имеет значение, а CellValue хранит индекс.Итак, этот код работает нормально:

            for (int r = 0; r < rows.Count(); r++)
            {
                var cells = rows[r].Elements<Cell>().ToList();
                for (int c = 0; c < cells.Count(); c++)
                {
                    SharedStringTablePart shareStringPart = spreadsheetDocument.WorkbookPart.GetPartsOfType<SharedStringTablePart>().First();
                    SharedStringItem[] items = shareStringPart.SharedStringTable.Elements<SharedStringItem>().ToArray();
                    if (cells[c].DataType != null)
                    {
                        if (cells[c].CellValue != null)
                        {
                            int v = int.Parse(cells[c].CellValue.Text);
                            text = items[v].InnerText;
                        }
                    }
                    else
                        text = cells[c].CellValue?.Text;
...