gpt4 book ai didi

c# - 保存 OpenXML 文档时操作共享字符串表

转载 作者:太空狗 更新时间:2023-10-30 00:53:34 27 4
gpt4 key购买 nike

我正在尝试使用 Entity Framework 数据创建 Excel 2010 工作簿(EF 不是问题)。我或多或少地遵循以下代码:CodeProject link

在上面的链接中创建文本单元格的代码将所有文本创建为内联字符串。为了遵循最佳实践(至少据我了解 OpenXML),我想将其更改为使用共享字符串表,因此我遵循找到的代码 here帮助。

为此,我从工作簿中获取共享字符串表,将我的字符串添加到其中,然后保存该表。我的代码:

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 on the stringTable.Save();行

我试图通过将 if(!found) block 更改为以下内容来纠正此问题:

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。给定的部件根元素已经与另一个 OpenXmlPart 相关联。

此时,我对我的 stringtable 是否与 OpenXmlPart 相关联感到困惑。

有人能看出我做错了什么,或者指出更好的方法吗?

最佳答案

添加 SharedStringTablePart 时,立即初始化与该部分关联的 SharedStringTable。然后您不检查 SharedStringTable 对象是否为空。试试这个:

if (stringTablePart == null)
{
// Create it.
stringTablePart = wbPart.AddNewPart<SharedStringTablePart>();
stringTablePart.SharedStringTable = new SharedStringTable();
}

var stringTable = stringTablePart.SharedStringTable;
//if (stringTable == null)
//{
// stringTable = new SharedStringTable();
//}

我希望该片段足以让您识别函数中的部分。如果 SharedStringTablePart 不为空,则其中已经有一个 SharedStringTable 对象。如果它为 null,那么...好吧,同时创建两者。

关于c# - 保存 OpenXML 文档时操作共享字符串表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15803196/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com