SharedStringTable中的OpenXML Spreadsheet更新值

时间:2014-01-23 14:56:37

标签: c# excel openxml

我正在使用OpenXML Spreadsheet来生成带有给定模板和变量字典的.xlsx文件。但是在更新SharedStringTable中的值时我有一个问题,因为SharedStringItem的InnerText是只读的。 我的模板excel文件是一个带.xlsx的文件。我需要替换的变量有前缀“$$$”。例如,“$$$ abc”,然后在字典中我可能有<“abc”,“Payson”>对(如果字典不包含键“abc”,只需在其中留下“$$$ abc”。 我所做的就是这样的事情

        private void UpdateValue(WorkbookPart wbPart, Dictionary<string, string> dictionary)
        {

            var stringTablePart = wbPart.GetPartsOfType<SharedStringTablePart>().FirstOrDefault();
            if (stringTablePart == null)
            {
                stringTablePart = wbPart.AddNewPart<SharedStringTablePart>();
            }
            var stringTable = stringTablePart.SharedStringTable;
            if (stringTable == null)
            {
                stringTable = new SharedStringTable();
            }
            //iterate through all the items in the SharedStingTable
            // if there is any text starts with $$$, find out the name of the string
            // look for the string in the dictionary
            // replace it if found, or keep it if not.
            foreach (SharedStringItem item in stringTable.Elements<SharedStringItem>())
            {
                if (item.InnerText.StartsWith("$$$"))
                {
                    string variableName = item.InnerText.Substring(3);
                    if (!string.IsNullOrEmpty(variableName) && dictionary.containsKey(variableName))
                    {
                        // The problem is here since InnerText is read only.
                        item.InnerText = dictionary[variableName];
                    }
                }
            }
        }

该文件在http://msdn.microsoft.com/en-us/library/documentformat.openxml.openxmlcompositeelement.innertext(v=office.14).aspx

即使文档提到可以设置innertext,但是没有set accessor。 有谁知道如何设置InnterText。因为我可能有许多具有相同变量名称“$$$ abc”的单元格,并且我想用“Payson”替换所有单元格。

2 个答案:

答案 0 :(得分:0)

您似乎需要替换InnerXml,然后保存SharedStringTable。请参阅Set text value using SharedStringTable with xml sdk in .net

答案 1 :(得分:0)

我尝试编辑文字,但它确实有效。

               Text newText = new Text();
                newText.Text = dictionary[variableName];
                item.Text = newText;
                stringTable.Save();