2012-05-02 7 views
0

Yikes, поэтому я обнаружил, что использование OpenXml моих столбцов не всегда выстраивается в линию. Например посмотрите на этот примерОтсутствует разбор синтаксиса Excel файла с OpenXml

Это строка заголовка столбец 37 = «Обмен только» колонка 38 = «Кол-во на руки» колонке 39 = «Стоимость Метод» колонка 40 = «Метод затрат Сумма»

Теперь, в следующей строке - тот, у которого есть фактические данные как в 37, так и в 38, пустые, но он пропускает столбец 38. поэтому мои данные выглядят так.

колонка 37 = «» (должно быть пустым) колонке 38 = «Установить Сумма» (Должно быть пустым причиной она должна выстраиваться с «Кол-во на руку») колонке 39 = 0

Заметьте, что он выбыл из реального столбца/ячейки 38, и теперь мой парсер больше не выстраивается в линию. оба 37 и 38 пустые, но не теряют 37.

вот какой код, чтобы показать, как я получаю строковый массив - это действительно просто модифицированный пример из MSDN.

public InventoryItemLoadProxy CreateInventoryItemFromSpreadsheetRow(Row row, SharedStringTable sharedStrings) 
    { 
     var invItem = new InventoryItemLoadProxy(); 
     var theCells = row.Descendants<Cell>(); 

     var textValues = 
      from cell in row.Descendants<Cell>() 
      select(cell.CellValue == null ? string.Empty : ((cell.DataType != null 
          && cell.DataType.HasValue 
           && cell.DataType == CellValues.SharedString) ? sharedStrings.ChildElements[int.Parse(cell.CellValue.InnerText)].InnerText : cell.CellValue.InnerText)); 

      if(textValues.Any(x => x != string.Empty)) 
      { 
      var textArray = textValues.ToArray(); 


      invItem.PartNumber = textArray[0].ToStrippedPartNumber(); 
      invItem.DisplayPartNumber = textArray[0]; 
      //More parsing... 
     } 
    } 

Вы можете видеть, что я говорю, если это нуль просто сделать это String.Empty (да - то с ума заявление LINQ получит переработан в какой-то момент).

Надеюсь, кто-то видел это раньше, это огромный блокпост! YIKES!

Благодаря

ответ

0

Как выясняется, другие люди ответили на этот вопрос. см. reading Excel Open XML is ignoring blank cells. Я использовал немного больше, чем метод «грубой силы и невежества», хотя я могу реорганизовать, как только у меня будет возможность выполнить тестирование кода из другого ответа. В то же время это служит моим потребностям.

private int GetIndexFromCellRef(Cell cell) 
     { 
      var colname = cell.CellReference.Value; 
      colname = Regex.Replace(colname, "[0-9]", ""); 
      var indexList = new Dictionary<string, int> 
       { 
        {"A", 0}, 
        {"B", 1}, 
        {"C", 2}, 
        {"D", 3}, 
        {"E", 4}, 
        {"F", 5}, 
        {"G", 6}, 
        {"H", 7}, 
        {"I", 8}, 
        {"J", 9}, 
        {"K", 10}, 
        {"L", 11}, 
        {"M", 12}, 
        {"N", 13}, 
        {"O", 14}, 
        {"P", 15}, 
        {"Q", 16}, 
        {"R", 17}, 
        {"S", 18}, 
        {"T", 19}, 
        {"U", 20}, 
        {"V", 21}, 
        {"W", 22}, 
        {"X", 23}, 
        {"Y", 24}, 
        {"Z", 25}, 
        {"AA", 26}, 
        {"AB", 27}, 
        {"AC", 28}, 
        {"AD", 29}, 
        {"AE", 30}, 
        {"AF", 31}, 
        {"AG", 32}, 
        {"AH", 33}, 
        {"AI", 34}, 
        {"AJ", 35}, 
        {"AK", 36}, 
        {"AL", 37}, 
        {"AM", 38}, 
        {"AN", 39}, 
        {"AO", 40}, 
        {"AP", 41}, 
        {"AQ", 42}, 
        {"AR", 43}, 
        {"AS", 44}, 
        {"AT", 45}, 
        {"AU", 46}, 
        {"AV", 47}, 
        {"AW", 48}, 
        {"AX", 49}, 
        {"AY", 50}, 
        {"AZ", 51}, 
        {"BA", 52}, 
        {"BB", 53}, 
        {"BC", 54}, 
        {"BD", 55}, 
        {"BE", 56}, 
        {"BF", 57}, 
        {"BG", 58}, 
        {"BH", 59}, 
        {"BI", 60}, 
        {"BJ", 61}, 
        {"BK", 62}, 
        {"BL", 63}, 
        {"BM", 64}, 
        {"BN", 65}, 
        {"BO", 66}, 
        {"BP", 67}, 
        {"BQ", 68} 
       }; 

      if (indexList.ContainsKey(colname)) 
       return indexList.First(x => x.Key.Equals(colname)).Value; 
      return -1; 
     } 
Смежные вопросы