openxml как читать inlineStr с помощью OpenXmlReader - PullRequest
1 голос
/ 13 февраля 2012

У меня есть следующий код:

public static void ReadExcelFileSAX(string filename)
{
    using (SpreadsheetDocument myDoc = SpreadsheetDocument.Open(filename, true))
    {
        WorkbookPart workbookPart = myDoc.WorkbookPart;
        WorksheetPart worksheetPart = workbookPart.WorksheetParts.First();

        OpenXmlReader reader = OpenXmlReader.Create(worksheetPart);
        string text;
        while (reader.Read())
        {
           if (reader.ElementType == typeof(CellValue))
           {
                text = reader.GetText();
            }
        }
    }
}

Этот код может читать любую ячейку, где тип данных является числом, но он не может прочитать inlineStr

Lookingв инструменте XML with Productivity я думаю, что код может читать следующий XML

<x:c r="D2" t="n">
    <x:v>328</x:v>
</x:c>

Но он не может прочитать этот (или я не знаю, как это сделать)

<x:c r="F1" s="6" t="inlineStr">
    <x:is>
        <x:t>T1</x:t>
    </x:is>
</x:c>

Любая помощь будет оценена.

Спасибо

1 Ответ

2 голосов
/ 14 февраля 2012

Ваш код выглядит так, как будто он должен правильно читать значения, но некоторая дополнительная информация была бы полезна для выявления причины проблемы.

Я полагаю, вы можете попробовать проверить, является ли тип InlineString,но вы не можете просто использовать GetText() метод, потому что InlineString не является дервидом от OpenXMlLeafTextElement.

Я еще не проверял это, но я предлагаю вам попробовать:

while (reader.Read())
{
   if (reader.ElementType == typeof(CellValue))
   {
        text = reader.GetText();
   }
   else if (reader.ElementType == typeof(InlineString)) //or instead of this, check type of its child node and use it inside this if statement
   {
        text = (reader.LoadCurrentElement() as InlineString).Text.Text;
   }
}

Или что-то похожее на это.Если у вас есть какие-либо проблемы с этим кодом, дайте мне знать, поэтому я исправлю его.

Некоторые ссылки:

...