C# 如何使用字符级别格式读取 Excel 单元格 XML 值?( 中的多个 元素)

本文关键字:si 元素 字符 何使用 格式 XML 单元格 Excel 读取 | 更新日期: 2023-09-27 18:33:33

我正在开发一个小应用程序,该应用程序将读取Excel工作表的内容,并将所有数据作为字符串导入Windows表单datagridview。

我已经成功地实现了Dietmar Schoder的代码示例来做到这一点。特别感谢他发布它。

http://www.codeproject.com/Tips/801032/Csharp-How-To-Read-xlsx-Excel-File-With-Lines-of?fid=1864959&df=10000&mpp=50&sort=Position&spc=Relaxed&tid=5149734

我是XML的新手,并且已经在这个问题上停留了一段时间。

具有"字符级别"格式的单元格在 <si> xml 元素中包含两个或多个单独的<t>文本值。

这是 excel 文件的共享字符串.xml文件中的片段

<si>
    <r>
      <rPr>
        <b/>
        <sz val="12"/>
        <color rgb="FFFF0000"/>
        <rFont val="Arial"/>
        <family val="2"/>
      </rPr>
      <t>Text A</t>
    </r>
    <r>
      <rPr>
        <b/>
        <sz val="12"/>
        <color theme="1"/>
        <rFont val="Arial"/>
        <family val="2"/>
      </rPr>
      <t xml:space="preserve"> Text B</t>
    </r>
  </si>

此单元格包含文本"文本 A 文本 B",但返回 null,因为该单元格具有字符级别格式,因此具有两个 <t> 标记。"文本 A"具有删除线、颜色不同或粗体等,而"文本 B"则没有。

文本值使用以下代码行分配。

Text = Workbook.SharedStrings.si[Convert.ToInt32(_value)].t;

在将字符串分配给 Text 变量之前,是否有任何方法可以连接来自两个<t>元素的字符串?

编辑:我认为我没有将问题缩小到共享字符串.cs文件和共享字符串的反序列化.xml

SharedStrings = DeserializedZipEntry<sst>(GetZipArchiveEntry(zipArchive, @"xl/sharedStrings.xml"));

SST类:

[Serializable()]
[XmlType(Namespace = "http://schemas.openxmlformats.org/spreadsheetml/2006/main")]
[XmlRoot("sst", Namespace = "http://schemas.openxmlformats.org/spreadsheetml/2006/main")]
public class sst
{
    [XmlAttribute]
    public string uniqueCount;
    [XmlAttribute]
    public string count;
    [XmlElement("si")]
    public SharedString[] si;
    public sst() { }
}
public class SharedString
{
    public string t;        
}

我一直无法以正确解释两个 t 元素文本值的方式编辑此类。

C# 如何使用字符级别格式读取 Excel 单元格 XML 值?(<si> 中的多个 <t> 元素)

在研究了更多关于 xml 序列化和许多其他与此类似的问题后,我自己解决了这个问题。

SST类:

public class sst
{
    [XmlAttribute]
    public string uniqueCount;
    [XmlAttribute]
    public string count;
    [XmlElement("si")]
    public SharedString[] si;

    public sst() { }
}
public class SharedString
{
    public string t;
    [XmlElement("r")]
    public NestedString[] ns;
    public SharedString() { }
}
public class NestedString
{
    public string t;
}

以及单元格文本的分配:

if (Workbook.SharedStrings.si[Convert.ToInt32(_value)].t != null)
{
   Text = Workbook.SharedStrings.si[Convert.ToInt32(_value)].t;
}
else if (Workbook.SharedStrings.si[Convert.ToInt32(_value)].ns != null)
{
   for (int i = 0; i < Workbook.SharedStrings.si[Convert.ToInt32(_value)].ns.Length; i++)
   {
     Text += Workbook.SharedStrings.si[Convert.ToInt32(_value)].ns[i].t;
   }
}