2012-05-02 92 views
0

哎呀,所以我發現使用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聲明會得到一些點重構)。

希望有人看到過這個,這是一個巨大的障礙!哎呀!

謝謝

回答

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; 
     }