使用OpenXML将%数字格式应用于单元格值

Sel*_*wyn 20 c# openxml openxml-sdk

我想使用开放的XML C#应用%(百分比)数字格式

我有数值3.6,我想在Excel中显示该数字为3.6%.

我如何实现这一目标?

Sel*_*wyn 25

  WorkbookStylesPart sp = workbookPart.AddNewPart<WorkbookStylesPart>();
Run Code Online (Sandbox Code Playgroud)

创建样式表,

 sp.Stylesheet = new Stylesheet();
Run Code Online (Sandbox Code Playgroud)

创建一个编号格式,

sp.Stylesheet.NumberingFormats = new NumberingFormats();
// #.##% is also Excel style index 1
Run Code Online (Sandbox Code Playgroud)


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

创建单元格格式并应用编号格式ID

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();
Run Code Online (Sandbox Code Playgroud)

并且当你将值附加到单元格时具有以下中心代码hereonversion并在我的情况下应用样式索引我有三个样式索引因此3个是我的百分比样式索引,即索引从0开始的2

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);
Run Code Online (Sandbox Code Playgroud)

  • @Selwyn 不为我工作,excel 被损坏。 (3认同)
  • 您对 Excel 样式索引的评论是否意味着,如果您想使用默认的 Excel 百分比样式,您不需要添加新格式,只需将单元格设置为样式索引 1? (2认同)
  • `NumberFormatId` 3453有特殊含义吗?或者我可以自由选择ID吗? (2认同)

jkl*_*ack 16

不幸的是,没有一个直截了当的答案.如果您下载适用于Microsoft Office的OpenXML Productivity Tool,您可以剖析一个简单的电子表格,并查看它如何格式化该数字.要做到你想要的,你需要:

  • 创建一个StyleSheet
  • 使用自定义定义添加新的NumberFormat
  • 除了上面的NumberFormat之外,创建一个CellStyleFormat,包括Border,Fill,Font all all
  • 创建一个CellFormats,引用上面的内容
  • 最后将Cell的StyleIndex设置为使用NumberFormat的CellFormat的ID.

呼!

通常更好的选择是在http://closedxml.codeplex.com/(可怕的名字)上查看ClosedXML .它是一个开源(不是GPL! - 检查许可证)库,它在OpenXML上放置了有用的扩展.要格式化工作表的单元格,您需要执行以下操作:

worksheet.Cell(row, col).Value = "0.036";
worksheet.Cell(row, col).Style.NumberFormat.Format = "0.0%";
Run Code Online (Sandbox Code Playgroud)

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


更新 ClosedXML已移至https://github.com/ClosedXML/ClosedXML的 GitHub


amu*_*rra 6

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 };
Run Code Online (Sandbox Code Playgroud)

以下是将 CellFormat 插入工作簿的快速方法:

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

然后,您需要获取其中包含 3.6 的单元格,并将其s属性 (StyleIndex) 设置为新插入的单元格格式:

Cell cell = workSheetPart.Worksheet.Descendants<Cell>().SingleOrDefault(c => cellAddress.Equals("A1"));
cell.StyleIndex = styleIndex;
Run Code Online (Sandbox Code Playgroud)


Smi*_*tel 5

您可以通过简单的方式做到这一点。如果你想将它应用到单个单元格上,那么就这样做,

worksheet.Cell(9, 10).Style.NumberFormat.Format = "#,##0.00\\%"; 
Run Code Online (Sandbox Code Playgroud)

如果您想将其应用到一系列单元格上,请执行以下操作:

worksheet.Range(9, 10, 15, 10).Style.NumberFormat.Format = "#,##0.00\\%"; 
Run Code Online (Sandbox Code Playgroud)

您还可以在此处找到更多格式,也可以从 Excel 中找到相同的格式。

  • 这不是问题中所示的 OpenXml。 (6认同)