C# Как читать XML-значения ячеек Excel с форматированием на уровне символов? (Несколько элементов ‹t› внутри ‹si›)

Я работаю над небольшим приложением, которое будет читать содержимое рабочего листа excel и импортировать все данные в виде строк в представление данных формы Windows.

Для этого я успешно реализовал пример кода Дитмара Шодера. Отдельное спасибо ему за публикацию.

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 и уже некоторое время застрял в этой проблеме.

Ячейки с форматированием «уровень символов» содержат два или более отдельных текстовых значения <t> в элементе <si> xml.

Вот фрагмент из файла sharedstrings.xml файла excel.

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

Можно ли каким-либо образом объединить строки из обоих элементов <t> перед назначением их переменной Text?

Изменить: я думаю, что не сузил проблему до файла sharedstrings.cs и десериализации файла sharedstrings.xml.

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

ст класс:

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


person FreedomKobra    schedule 06.02.2016    source источник


Ответы (1)


Решил этот вопрос сам, изучив больше о сериализации xml и многих других подобных вопросах здесь.

ст класс:

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;
   }
} 
person FreedomKobra    schedule 09.02.2016