В чем разница между CellValues.InlineString и CellValues.String в OpenXML?

Я пытаюсь написать некоторый код для создания электронной таблицы Excel, и я не уверен, в чем разница между CellValues.InlineString и CellValues.String, чтобы вставить текст в клетки.

Должен ли я использовать это:

private void UpdateCellTextValue(Cell cell,string cellValue)
{
    InlineString inlineString = new InlineString();
    Text cellValueText = new Text { Text = cellValue };
    inlineString.AppendChild(cellValueText);

    cell.DataType = CellValues.InlineString;
    cell.AppendChild(inlineString); 
}

это

private void UpdateCellTextValue(Cell cell, string cellValue)
{
    cell.CellValue = new CellValue(cellValue);
    cell.DataType = new EnumValue<CellValues>(CellValues.String);
}

или просто это (InsertSharedStringItem возвращает идентификатор недавно вставленного разделяемого строкового элемента)

private void SetCellSharedTextValue(Cell cell,string cellValue)
{        
    int stringId = InsertSharedStringItem(cellValue);
    cell.CellValue = new CellValue(stringId.ToString());
    cell.DataType = new EnumValue<CellValues>(CellValues.SharedString);
}

Ответы

Ответ 1

Согласно документации на 18.18.11 ST_CellType:

str (String) Ячейка, содержащая формулу строка.

Вы хотите использовать CellValues.String только при вставке формулы в ячейку. Вот как выглядит XML:

<x:c r="C6" s="1" vm="15" t="str">
   <x:f>CUBEVALUE("xlextdat9 Adventure Works",C$5,$A6)</x:f>
   <x:v>2838512.355</x:v>
</x:c>

CellValues.InlineString следует использовать, только если вы не хотите хранить строку в SharedStringTable. Тогда все, что вы отмечаете как inlineString, будет рассматриваться как богатый текст. Обратите внимание, что когда вы используете CellValues.InlineString, чтобы ваш текст был окружен текстовым элементом и тегом <is>:

<x:c r="B2" t="inlineStr">
   <is><t>test string</t></is>
</c>