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

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

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

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

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

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

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

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

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

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

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

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

Ответ 1

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

Сначала нужно получить формат нумерации ячейки (если у вас есть 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 и не работал. Ive проверил ToString, и он работает, но что-то все еще отсутствует.

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

Bassicaly вам придется добавить что-то вроде этого:

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

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

Ответ 2

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

String formattedValue = cell.Text