OpenXML写入值以清空Excel中的单元格

时间:2017-01-13 20:30:12

标签: c# excel openxml

我已经想出了如何以我想要的格式将字符串数组的内容写入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中做到这一点,这是我的问题。但是如果有答案,其他人可能会觉得这很有用。

1 个答案:

答案 0 :(得分: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;
    }

我相信您可以根据需要编辑最后一部分。

注意:

Interop资源不足,执行速度很慢,请注意执行完毕后未关闭的Excel进程。

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