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