Как получить значение ячейки с примененным форматированием (отформатированное значение ячейки) с помощью OpenXML SDK

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

Мне нужно получить значение ячейки в виде строки с примененным форматированием, т.е. той же строки, которая будет отображаться в Excel.

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

Так что мне кажется, что для получения значения мне нужно сделать две вещи: 1. Получить строку формата. 2. Отформатируйте значение ячейки, используя эту строку.

Но у меня проблемы с обоими шагами.

Можно легко получить экземпляр CellFormat, который будет содержать NumberFormatId:

CellFormat cellFormat = (CellFormat) document.WorkbookPart.WorkbookStylesPart.Stylesheet.CellFormats.ElementAt(cell.StyleIndex);

Но как получить строку формата с этим NumberFormatId, если id соответствует одному из стандартных предопределенных форматов? (т.е. ниже 160) Их нет в табличном документе, и я не могу поверить, что они должны быть жестко запрограммированы в приложении.

Кроме того, как только строка формата каким-то образом получена, как применить ее к значению ячейки? Насколько я понимаю, код должен проверять тип значения ячейки и, если это число, преобразовать его в строку с использованием строки формата.

Я нашел эту страницу, на которой упоминается использование Microsoft.Office.Excel.Interop, но Я бы предпочел остаться только с OpenXML SDK.

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


person El G    schedule 19.01.2012    source источник
comment
Найдите хороший код здесь: joymonscode.blogspot.se/ 2013/10/   -  person Torbjörn Kalin    schedule 22.01.2015


Ответы (2)


Мужчины, это сложно... Я буду добавлять сюда вещи, которые, как я обнаружил, могут быть полезными..

Во-первых, нужно получить формат нумерации ячейки (если у вас есть CellFormat:

string format = excel.WorkbookPart.WorkbookStylesPart.Stylesheet.NumberingFormats.Elements<NumberingFormat>()
            .Where(i => i.NumberFormatId.ToString() == cellFormat.NumberFormatId.ToString())
            .First().FormatCode;

Дополнительные сведения об этом можно найти по адресу: NumberingFormats

Я пытаюсь выяснить, как применить этот формат к свойству cell.CellValue... Я думаю, что вы должны пойти по этому пути!

Хорошо, читая код ClosedXml (его открытый исходный код), кажется, легко получить формат.

Просто преобразуйте текст значения в его тип (int, double и т. д.) и вызовите метод ToString, передающий формат. Я пытался сделать это с помощью String.Format и не работал. Я протестировал ToString, и он работает, но чего-то все еще не хватает.

Я рекомендую вам взглянуть на этот класс и получить код из метода GetFormattedString(), как говорит @El G в своем комментарии.

В основном вам нужно будет добавить что-то вроде этого:

double d = double.Parse(cell.CellValue.InnerText);
string val = d.ToString(format);

Надеюсь, это поможет вам...

person Guido Zanon    schedule 21.01.2012
comment
Большое спасибо за то, что поделились этой информацией, Гвидо! Пожалуйста, дайте мне знать, если вы найдете способ применить формат. - person El G; 23.01.2012
comment
Кстати, если в вашем решении вам не нужно ограничиваться только OpenXML SDK, вы можете использовать ClosedXML, где все действия кажутся намного проще, чем в чистом OpenXML (и он построен на основе OpenXML). В документации ClosedXML в примере значений ячеек есть эта строка: ' Строка booleanFormattedString = cellBoolean.GetFormattedString();' По-видимому, он делает то, что мы ищем. Также копание в коде этого метода может помочь понять. - person El G; 23.01.2012
comment
Добавил полезную информацию! думаю, что ваша проблема будет решена в этот момент! - person Guido Zanon; 23.01.2012
comment
@GuidoZanon - Можете ли вы помочь мне со следующим вопросом: stackoverflow.com/questions/15791732/ - person Nate Pet; 03.04.2013

Если вы хотите получить значение ячейки с примененным форматированием, таким же, как отображается в Excel, используйте свойство .Text объекта Cell. Нравится:

String formattedValue = cell.Text
person andr111    schedule 26.02.2016
comment
Похоже, что в классе Cell нет свойства Text, только в CellValue (это не то, что отображается в Excel) - person Ben Humphrey; 24.06.2016