2017-01-13 150 views
0

我已经想出了如何以我想要的格式将字符串数组的内容写入Excel中,但现在我无法确保它不会写入已经存在的单元格填充在Excel文件中。OpenXML将值写入空Excel单元格

当前我正在尝试读取Excel文件的内容,然后插入基于没有值的位置。这是我目前拥有的。

private static void WriteToExcel(string[] contents, char[] desiredColumns) 
{ 
    string filePath = @"D:\Folder\test.xlsx"; 
    try 
    { 
     using (SpreadsheetDocument StatsCollection = SpreadsheetDocument.Open(filePath, true)) 
     { 
      WorkbookPart bookPart = StatsCollection.WorkbookPart; 
      string sheetName = "Sheet1"; 
      SharedStringTablePart sstpart = bookPart.GetPartsOfType<SharedStringTablePart>().First(); 
      SharedStringTable sst = sstpart.SharedStringTable; 
      Sheet mySheet = bookPart.Workbook.Descendants<Sheet>().Where(s => s.Name == sheetName).FirstOrDefault(); 
      WorksheetPart sheetPart = (WorksheetPart)(bookPart.GetPartById(mySheet.Id)); 
      Worksheet sheet = sheetPart.Worksheet; 
      var rows = sheet.Descendants<Row>(); 
      foreach (Row row in rows) 
      { 
       foreach (Cell currentCell in row.Elements<Cell>()) 
       { 
        int totalRows = contents.Length/15; 
        int contentsIndex = 0; 
        for (uint indexRow = 1; indexRow <= totalRows; indexRow++) 
        { 
         for (int indexCol = 1; indexCol < 16; indexCol++) 
         { 
          SharedStringTablePart shareStringPart; 
          if (StatsCollection.WorkbookPart.GetPartsOfType<SharedStringTablePart>().Count() > 0) 
          { 
           shareStringPart = StatsCollection.WorkbookPart.GetPartsOfType<SharedStringTablePart>().First(); 
          } 
          else 
          { 
           shareStringPart = StatsCollection.WorkbookPart.AddNewPart<SharedStringTablePart>(); 
          } 
          int index = InsertSharedStringItem(contents[contentsIndex], shareStringPart); 
          if (currentCell.CellValue.InnerText == "") 
          { 
           Cell newCell = InsertCellInWorksheet(desiredColumns[indexCol - 1].ToString(), indexRow, sheetPart); 
           if (IsNumeric(contents[contentsIndex])) 
           { 
            newCell.DataType = new EnumValue<CellValues>(CellValues.Number); 
            newCell.CellValue = new CellValue(contents[contentsIndex]); 
           } 
           else 
           { 
            newCell.DataType = new EnumValue<CellValues>(CellValues.SharedString); 
            newCell.CellValue = new CellValue(index.ToString()); 
           } 
          } 
          else 
          { 
           break; 
          } 
          sheetPart.Worksheet.Save(); 
          contentsIndex++; 
         } 
        } 
       } 
      } 
     } 
     Console.WriteLine("Copy Complete."); 
    } 
    catch (Exception ex) 
    { 
     Console.WriteLine("Cannot find output Excel file.\n" + ex.Message); 
    } 
} 

我的想法在这里处理的是,如果我可以使用代码在我的Excel工作表中的信息来读,我发现here然后我可以插入其中,那就是null。一旦我确定某些东西是空的,然后从我最内部的循环(它处理我的列)中断开来增加我的外部循环(它处理行)。但是,这似乎并没有工作。我已经证实,我实际上正在从工作表中读取信息,我根本无法基于此来写信息。

为什么我可以读取我的文件的内容但不能基于那里的单元格写入内容?

更新:

对于任何人谁碰到这个问题,我最终切换到Microsoft.Office.Interop我的数据追加到一个Excel文件的末尾来。我不愿意将其作为答案,因为它不回答如何在OpenXML中做到这一点,这是我的问题。然而,有人可能会发现这个有用的答案。

回答

1

该函数试图从细胞

抢值,如果小区具有SharedStringValue它会返回,或者如果它只是一个数字

如果没有返回值" "

public static string GetCellV(Cell cell, SharedStringTable ss) 
    { 
     string cellV = null; 

     try 
     { 
      cellV = cell.CellValue.InnerText; 
      if (cell.DataType != null 
       && cell.DataType.Value == CellValues.SharedString) 
      { 
       cellV = ss.ElementAt(Int32.Parse(cellV)).InnerText; 
      } 
      else 
      { 

       cellV = cell.CellValue.InnerText; 
      } 
     } 
     catch (Exception) 
     { 
      cellV = " "; 
     } 

     return cellV; 
    } 

我确定你可以编辑你需要的最后一部分。

注:

互操作是不是很机智,而且是在执行很慢,注意一旦你完成执行未关闭Excel的过程。

由于Open XML直接编辑XML代码,因此Open XML速度更快。

+0

我听说OpenXML比Interop好,但是我遇到了'.xls' vs'.xlsx'的问题,上面的问题让我更快地切换到Interop。更多的人可以帮助我。 – BlueBarren

+0

明智的选择,如果您需要再次使用这样的excel软件包,请查看EPPlus:http://epplus.codeplex.com/ –

相关问题