2017-01-13 207 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/ –

相關問題