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

问题描述 投票:0回答:4

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

我有数值 3.6,我想在 Excel 中将该数字显示为“3.6%”。

我如何实现这一目标?

c# openxml openxml-sdk
4个回答
35
投票
  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.NumberingFormats.Append(nf2decimal);

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

CellFormat 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);

19
投票

不幸的是,没有直接的答案。 如果您下载了适用于 Microsoft Office 的 OpenXML 生产力工具,您可以剖析一个简单的电子表格并查看它如何格式化数字。 为了做你想做的事,你需要:

  • 创建样式表
  • 使用您的自定义定义添加新的 NumberFormat
  • 创建一个 CellStyleFormat,除了上面的 NumberFormat 之外,还定义了所有边框、填充、字体
  • 创建一个CellFormats,参考上面的
  • 最后将单元格的 StyleIndex 设置为使用 NumberFormat 的单元格格式的 ID。

哇!

通常更好的选择是查看 ClosedXML,网址为 http://closexml.codeplex.com/(可怕的名字)。 它是一个开源(不是 GPL! - 检查许可证)库,对 OpenXML 进行了有用的扩展。 要设置工作表单元格的格式,您可以这样做:

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

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


更新 ClosedXML 已移至 GitHub,网址为 https://github.com/ClosedXML/ClosedXML


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 };

这是将 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;

5
投票

您可以用简单的方法做到这一点。如果您想将其应用于单个单元格,请执行此操作,

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

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

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

您还可以找到更多格式这里,您也可以从 Excel 中找到相同的格式。

© www.soinside.com 2019 - 2024. All rights reserved.