Применение формата% числа к значению ячейки с использованием OpenXML - PullRequest
19 голосов
/ 24 октября 2011

Я хочу применить числовой формат% (в процентах), используя открытый XML C #

У меня есть числовое значение 3,6, которое я хочу отобразить в Excel как `3,6%.

Какмне достичь этого?

Ответы [ 4 ]

24 голосов
/ 26 октября 2011
  WorkbookStylesPart sp = workbookPart.AddNewPart<WorkbookStylesPart>();

Создать таблицу стилей,

 sp.Stylesheet = new Stylesheet();

Создать формат нумерации,

sp.Stylesheet.NumberingFormats = new NumberingFormats();
// #.##% is also Excel style index 1


NumberingFormat nf2decimal = new NumberingFormat();
nf2decimal.NumberFormatId = UInt32Value.FromUInt32(3453);
nf2decimal.FormatCode = StringValue.FromString("0.0%");
sp.Stylesheet.NumberingFormat.Append(nf2decimal);

Создание формата ячейки и применение идентификатора формата нумерации

cellFormat = new CellFormat();
cellFormat.FontId = 0;
cellFormat.FillId = 0;
cellFormat.BorderId = 0;
cellFormat.FormatId = 0;
cellFormat.NumberFormatId = nf2decimal.NumberFormatId;
cellFormat.ApplyNumberFormat = BooleanValue.FromBoolean(true);
cellFormat.ApplyFont = true;

//append cell format for cells of header row
sp.Stylesheet.CellFormats.AppendChild<CellFormat>(cellFormat);


//update font count 
sp.Stylesheet.CellFormats.Count = UInt32Value.FromUInt32((uint)sp.Stylesheet.CellFormats.ChildElements.Count);


//save the changes to the style sheet part   
sp.Stylesheet.Save();

и когда вы добавляете значение в ячейку, получите следующий центральный код здесь и примените индекс стиля в моем случае у меня был индекс трех стилей, следовательно, 3 был моим процентным индексом стиля, т.е. 2, так как индексы начинаются с 0

string val = Convert.ToString(Convert.ToDecimal(value)/100);
Cell cell = new Cell();
cell.DataType = new EnumValue<CellValues>(CellValues.Number);
cell.CellValue = new CellValue(val);
cell.StyleIndex = 2;
row.Append(cell);
15 голосов
/ 25 октября 2011

К сожалению, нет прямого ответа. Если вы загрузите OpenXML Productivity Tool для Microsoft Office, вы можете проанализировать простую электронную таблицу и посмотреть, как она форматирует число. Чтобы сделать то, что вы хотите, вам нужно:

  • Создание таблицы стилей
  • Добавьте новый NumberFormat с вашим пользовательским определением
  • Создайте CellStyleFormat с полями Border, Fill, Font, в дополнение к NumberFormat, указанному выше
  • Создать CellFormats, который ссылается на выше
  • Наконец, установите StyleIndex вашей ячейки на идентификатор вашего CellFormat, который использует NumberFormat.

Уф!

Как правило, лучше посмотреть на ClosedXML на http://closedxml.codeplex.com/ (ужасное имя). Это библиотека с открытым исходным кодом (НЕ GPL! - проверьте лицензию), которая добавляет полезные расширения в OpenXML. Чтобы отформатировать ячейку листа, вместо этого вы должны:

worksheet.Cell(row, col).Value = "0.036";
worksheet.Cell(row, col).Style.NumberFormat.Format = "0.0%";

(из http://closedxml.codeplex.com/wikipage?title=Styles%20-%20NumberFormat&referringTitle=Documentation)


UPDATE ClosedXML переехал на GitHub в https://github.com/ClosedXML/ClosedXML

4 голосов
/ 25 октября 2011

Excel содержит предопределенные форматы для форматирования строк различными способами. Атрибут s в элементе ячейки будет относиться к стилю, который будет ссылаться на числовой формат, который будет соответствовать желаемому процентному формату. См. вопрос / ответ для получения дополнительной информации.

Вот объект CellFormat, который вам нужно будет создать, чтобы к вашему номеру была применена маска 0,00%. В этом случае вы хотите предопределенный формат числа 10 или 0,00%:

CellFormat cellFormat1 = new CellFormat(){ NumberFormatId = (UInt32Value)10U, FontId = (UInt32Value)0U, FillId = (UInt32Value)0U, BorderId = (UInt32Value)0U, FormatId = (UInt32Value)0U, ApplyNumberFormat = true };

Вот быстрый способ вставить CellFormat в рабочую книгу:

CellFormats cellFormats = workbookPart.WorkbookStylesPart.Stylesheet.Elements<CellFormats>().First();
cellFormats.Append(cellFormat);
uint styleIndex =  (uint)cellFormats.Count++;

Затем вам нужно будет получить ячейку с 3,6 и установить для ее атрибута s (StyleIndex) только что добавленный формат ячейки:

Cell cell = workSheetPart.Worksheet.Descendants<Cell>().SingleOrDefault(c => cellAddress.Equals("A1"));
cell.StyleIndex = styleIndex;
1 голос
/ 19 октября 2015

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

worksheet.Cell(9, 10).Style.NumberFormat.Format = "#,##0.00\\%"; 

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

worksheet.Range(9, 10, 15, 10).Style.NumberFormat.Format = "#,##0.00\\%"; 

вы также можете найти больше форматов Здесь , а также вы можете найти то же самое в Excel.

...