我正在尝试使用实体框架数据创建 Excel 2010 工作簿(EF 不是问题)。我或多或少在以下代码中: CodeProject 链接
在上面的链接中创建文本单元格的代码将所有文本创建为内联字符串。为了遵循最佳实践(至少就我对 OpenXML 的理解而言),我想将其更改为使用共享字符串表,因此我将遵循此处找到的代码以提供帮助。
为此,我从工作簿中获取共享字符串表,将我的字符串添加到其中,然后保存表。我的代码:
private static int InsertSharedStringItem(WorkbookPart wbPart, string value)
{
int index = 0;
bool found = false;
var stringTablePart = wbPart.GetPartsOfType<SharedStringTablePart>()
.FirstOrDefault();
if (stringTablePart == null)
{
// Create it.
stringTablePart = wbPart.AddNewPart<SharedStringTablePart>();
}
var stringTable = stringTablePart.SharedStringTable;
if (stringTable == null)
{
stringTable = new SharedStringTable();
}
foreach (SharedStringItem item in stringTable.Elements<SharedStringItem>())
{
if (item.InnerText == value)
{
found = true;
break;
}
index += 1;
}
if (!found)
{
stringTable.AppendChild(new SharedStringItem(new Text(value)));
stringTable.Save();
}
return index;
}
我已经突出显示(并且显然是分开的)问题区域)
不幸的是,我InvalidOperationException: Cannot save DOM tree since this element is not associated with an OpenXmlPart
在 stringTable.Save(); 线
我试图通过将 if(!found) 块更改为:
if (!found)
{
stringTable.AppendChild(new SharedStringItem(new Text(value)));
wbPart.SharedStringTablePart.SharedStringTable = stringTable;
stringtable.Save();
}
当代码到达新行时,它返回一个UnhandledArgument Exception: Cannot set the given root element to this part. The given part root element has already been associated with another OpenXmlPart.
在这一点上,我对 mystringtable
是否与 OpenXmlPart 相关联感到困惑。
有人可以看到我做错了什么,或者指出更好的方法吗?