2012-05-02 11 views
0

むとファイルの構文解析の列がありませんので、私は私のOpenXml列を使用すると、常に並ばないことを発見しました。例えばこれは、ヘッダ行 カラム37 =「交換のみ」 カラムでは、ExcelがのOpenXml

この例を見て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... 
     } 
    } 

あなたが、私はそれがnullだ場合だけ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; 
     } 
関連する問題