Как получить значение ячейки с применением форматирования (форматированное значение ячейки) с помощью OpenXML SDK - PullRequest
14 голосов
/ 19 января 2012

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

Мне нужно получить значение ячейки в виде строки с примененным форматированием - то есть той же самой строки, которая будет отображаться в 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.

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

Ответы [ 2 ]

8 голосов
/ 21 января 2012

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

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

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

0 голосов
/ 26 февраля 2016

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

String formattedValue = cell.Text
...