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

Posted

技术标签:

【中文标题】C# 如何读取具有字符级格式的 Excel 单元格 XML 值? (<si> 中的多个 <t> 元素)【英文标题】:C# How do I read Excel cell XML values with character level formatting? (Multiple <t> elements within <si>) 【发布时间】:2016-05-16 13:43:12 【问题描述】:

我正在开发一个小型应用程序,该应用程序将读取 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 的新手,并且已经被这个问题困扰了一段时间。

具有“字符级别”格式的单元格在&lt;si&gt; xml 元素中包含两个或多个单独的&lt;t&gt; 文本值。

这是来自 excel 文件的 sharedstrings.xml 文件的 sn-p

<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>

此单元格包含文本“Text A Text B”但返回 null,因为该单元格具有字符级格式,因此有两个 &lt;t&gt; 标记。 “文本 A”有删除线、不同颜色或粗体等,而“文本 B”没有。

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

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

在将两个&lt;t&gt; 元素中的字符串分配给 Text 变量之前,是否有任何方法?

编辑:我认为我没有将问题缩小到 sharedstrings.cs 文件和 sharedstrings.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 元素文本值的方式编辑此类。

【问题讨论】:

【参考方案1】:

在研究了更多关于 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;
   
 

【讨论】:

以上是关于C# 如何读取具有字符级格式的 Excel 单元格 XML 值? (<si> 中的多个 <t> 元素)的主要内容,如果未能解决你的问题,请参考以下文章

poi读取Excel时,如果单元格设置的是数字格式,如何解决整数与小数问题

求C#高手,Excel中单元格显示的是日期格式,当我读取到DataGridView中时,就变成了文本格式了

C# 读取Excel日期格式

c#导出EXCEL合并单元格代码

如何在C#中使用EPPlus设置xlsx单元格宽度

c#导出EXCEL设置单元格格式?