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

我正在研究一个小的应用程序,它将读取一个Excel工作表的内容,并将所有的数据作为string导入到窗体的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文件的sharedstrings.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> 

该单元格包含文本“Text A Text B”,但返回null,因为单元格具有字符级格式化,因此有两个<t>标签。 “文本A”具有透视,不同颜色或粗体等,“文本B”不包含。

文本值分配以下行代码。

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

无论如何,在将它们分配给Textvariables之前,要将<t>元素中的string连接起来?

编辑:我想我没有把问题缩小到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元素的文本值。

解决了这一个自己在学习更多关于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; } }