OpenXML将值写入空单元在Excel中

我已经想出了如何以我想要的格式将string数组的内容写入Excel,但是现在我遇到了麻烦,确保它不会覆盖已经填充到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表中的信息,我发现在这里,我可以插入那里是null 。 一旦我确定了是否为null,然后从我最内部的循环(处理我的列),以增加我的外部循环(处理行)。 但是,这似乎并没有工作。 我已经证实,我实际上是从表格中读取信息,而我似乎根据这个信息来编写信息。

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

更新:

对于遇到这个问题的任何人,我最终都会切换到Microsoft.Office.Interop来将我的数据追加到excel文件的末尾。 我很犹豫,把它作为答案,因为它不回答如何在OpenXML,这是我的问题。 然而,有人可能会发现这个有用的答案。

这个函数试图从单元格中获取一个值

如果单元格有一个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程序不会closures。

Open XML直接编辑XML代码要快得多。