gpt4 book ai didi

c# - 将模板与 OpenXML 和 SAX 结合使用

转载 作者:太空狗 更新时间:2023-10-30 00:44:32 25 4
gpt4 key购买 nike

我正在使用 Parsing and Reading Large Excel Files with the Open XML SDK 中提出的 SAX 方法从数据表创建一个大型 XLSX 文件.我正在使用 XLSX 文件作为模板。

该帖子中描述的方法可以很好地用新工作表替换现有工作表,但我想从模板中的工作表复制标题行(字符串值、格式等),而不是仅仅使用数据表中的标题行与原始代码一样。

我已经尝试了下面的代码,但 XLSX 文件最终在标题行中没有文本 - 格式被复制,而不是文本。我已经查看了工作表的 XML 文件,它对我来说看起来没问题(引用 sharedStrings.xml 文件,它仍然有字符串的定义)。来自 Open XML SDK 2.0 Productivity Tool 的反射代码虽然显示了一个有点奇怪的结果:单元格似乎没有设置文本值:

cellValue1.Text = "";

即使 XML 说:

<x:c r="A1" s="4" t="s">

OpenXmlReader使用的主要代码如下:

while (reader.Read())
{
if (reader.ElementType == typeof(SheetData))
{
if (reader.IsEndElement)
continue;

// Write sheet element
writer.WriteStartElement(new SheetData());

// copy header row from template
reader.Read();
do
{
if (reader.IsStartElement)
{
writer.WriteStartElement(reader);
}
else if (reader.IsEndElement)
{
writer.WriteEndElement();
}
reader.Read();
} while (!(reader.ElementType == typeof(Row) && reader.IsEndElement));
writer.WriteEndElement();

// Write data rows
foreach (DataRow dataRow in resultsTable.Rows)
{
// Write row element
Row r = new Row();
writer.WriteStartElement(r);

foreach (DataColumn dataCol in resultsTable.Columns)
{
Cell c = new Cell();
c.DataType = CellValues.String;
CellValue v = new CellValue(dataRow[dataCol].ToString());
c.Append(v);

// Write cell element
writer.WriteElement(c);
}

// End row
writer.WriteEndElement();
}

// End sheet
writer.WriteEndElement();
}
else
{
if (reader.IsStartElement)
{
writer.WriteStartElement(reader);
}
else if (reader.IsEndElement)
{
writer.WriteEndElement();
}
}
}

最佳答案

线索是生产力工具在生成的工作表上为标题单元格显示空白值,而且模板中的验证公式也丢失了。这些都是文本,未使用 OpenXmlReader.Read() 的组合从模板表复制到新表和 OpenXmlReader.WriteStartElement() .

当元素是 OpenXmlLeafTextElement 时然后是 OpenXmlReader.GetText() 方法将返回文本 - 这适用于单元格中的文本值和公式。

工作代码如下所示:

while (openXmlReader.Read())
{
if (openXmlReader.ElementType == typeof(SheetData))
{
if (openXmlReader.IsEndElement)
continue;

// write sheet element
openXmlWriter.WriteStartElement(new SheetData());

// read first row from template and copy into the new sheet
openXmlReader.Read();

do
{
if (openXmlReader.IsStartElement)
{
openXmlWriter.WriteStartElement(openXmlReader);

// this bit is needed to get cell values
if (openXmlReader.ElementType.IsSubclassOf(typeof(OpenXmlLeafTextElement)))
{
openXmlWriter.WriteString(openXmlReader.GetText());
}
}
else if (openXmlReader.IsEndElement)
{
openXmlWriter.WriteEndElement();
}

openXmlReader.Read();

} while (!(openXmlReader.ElementType == typeof(Row) && openXmlReader.IsEndElement));

openXmlWriter.WriteEndElement();

// write data rows
foreach (DataRow dataRow in resultsTable.Rows)
{
// write row element
Row r = new Row();

openXmlWriter.WriteStartElement(r);

foreach (DataColumn dataCol in resultsTable.Columns)
{
Cell c = new Cell();
c.DataType = CellValues.String;
CellValue v = new CellValue(dataRow[dataCol].ToString());
c.Append(v);

// write cell element
openXmlWriter.WriteElement(c);
}

// end row
openXmlWriter.WriteEndElement();
}

// end sheet
openXmlWriter.WriteEndElement();
}
else
{
if (openXmlReader.IsStartElement)
{
openXmlWriter.WriteStartElement(openXmlReader);

// this bit is needed to get formulae and that kind of thing
if (openXmlReader.ElementType.IsSubclassOf(typeof(OpenXmlLeafTextElement)))
{
openXmlWriter.WriteString(openXmlReader.GetText());
}
}
else if (openXmlReader.IsEndElement)
{
openXmlWriter.WriteEndElement();
}
}
}

关于c# - 将模板与 OpenXML 和 SAX 结合使用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7651580/

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