C# Как я могу прочитать значения XML ячейки Excel с форматированием на уровне символов? (Несколько элементов <t> внутри <si>)
Я работаю над небольшим приложением, которое будет читать содержимое листа Excel и импортировать все данные в виде строк в виде таблицы данных в форме Windows.
Я успешно реализовал пример кода Дитмара Шодера, чтобы сделать это. Особая благодарность ему за размещение.
Я новичок в 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", но возвращает ноль, потому что ячейка имеет форматирование на уровне символов и, следовательно, два <t>
теги. "Текст А" имеет зачеркнутый цвет, выделен другим цветом или выделен жирным шрифтом и т. Д., А "Текст Б" - нет.
Текстовым значениям присваивается следующая строка кода.
Text = Workbook.SharedStrings.si[Convert.ToInt32(_value)].t;
Есть ли в любом случае объединить строки из обоих <t>
элементы, прежде чем присвоить его переменной 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;
}
Мне не удалось отредактировать этот класс так, чтобы он правильно интерпретировал текстовые значения обоих элементов.
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;
}
}