使用SharedStringTable和.net中的xml sdk设置文本值

时间:2012-06-16 07:11:05

标签: excel excel-vba vsto openxml-sdk vba

我有一段代码(下面)可以获取excel中特定单元格的文本,但我不知道如何修改此文本以更改单元格文本。

public static void UpdateTextCell(string docName, string text, uint rowIndex, 
    string columnName, string sheetName)
{
   // Open the document for editing.
   using (SpreadsheetDocument spreadSheet = SpreadsheetDocument
       .Open(docName, true))
   {
        WorksheetPart worksheetPart = GetWorksheetPartByName(spreadSheet, 
            sheetName);

        if (worksheetPart != null)
        {

          SharedStringTablePart sharedstringtablepart=spreadSheet.WorkbookPart
              .GetPartsOfType<SharedStringTablePart>().First();
          SharedStringTable sharedStringTable = sharedstringtablepart
              .SharedStringTable;
          Cell cell = GetCell(worksheetPart.Worksheet, columnName, rowIndex);
          if (cell.DataType.Value == CellValues.SharedString)
          {
             var value = cell.InnerText;
             value = sharedStringTable.ElementAt(int.Parse(value)).InnerText;
             sharedStringTable.ElementAt(int.Parse(value)).InnerXml
                 .Replace("value", "Modified");
          }
          // Save the worksheet.
          worksheetPart.Worksheet.Save();
        }
   }
}

由于sharedStringTable.ElementAt(int.Parse(value)).InnerText是只读的,我尝试使用sharedStringTable.ElementAt(int.Parse(value)).InnerXml.Replace("value", "Modified");修改文字字符串,但这也不起作用。

你知道我错过了吗?

3 个答案:

答案 0 :(得分:2)

Replace是一个字符串函数,它只返回新的字符串。您需要做的就是为InnerXml设置新值。

sharedStringTable.ElementAt(int.Parse(value)).InnerXml = sharedStringTable.ElementAt(int.Parse(value)).InnerXml
             .Replace("value", "Modified");

答案 1 :(得分:1)

尝试添加

sharedStringTable.Save();

之后

sharedStringTable.ElementAt(int.Parse(value)).InnerXml
                 .Replace("value", "Modified");

答案 2 :(得分:0)

使用Replace的解决方案在文本的情况下会出现问题,这也是xml的一部分,就像只包含字母'm'的字符串一样。然后替换也将替换

中的m

&LT; x:t xmlns:x = ...&gt;,使单元格无效。相反,替换FirstChild,它确实是InnerText,绕过了可替换文本的限制。

sharedStringTable.ElementAt(int.Parse(cell.CellValue.Text)).ReplaceChild(
    new Text("Modified"),  // OpenXmlElement 
    sharedStringTable.ElementAt(int.Parse(cell.CellValue.Text)).FirstChild
);