【发布时间】:2017-05-29 07:39:15
【问题描述】:
我已经知道如何以我想要的格式将字符串数组的内容写入 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 工作表上的信息here,然后我可以插入null 的位置。一旦我确定某些东西是否为空,我就会从最内部的循环(处理我的列)中中断以增加我的外部循环(处理行)。但是,这似乎不起作用。我已经确认我实际上正在阅读表格中的信息,我似乎无法据此写出。
为什么我可以读取文件的内容,但不能根据其中的单元格进行写入?
更新:
对于遇到此问题的任何人,我最终切换到 Microsoft.Office.Interop 以将我的数据附加到 Excel 文件的末尾。我不愿将其作为答案,因为它没有回答如何在 OpenXML 中执行此操作,这是我的问题。但是,如果有答案,其他人可能会觉得这很有用。
【问题讨论】: