web-dev-qa-db-ja.com

OpenXMLを使用してセル数値に%数値形式を適用する

オープンXML C#を使用して%(パーセント)数値形式を適用したい

Excelでその数値を「3.6%」として表示したい数値3.6があります。

どうすればそれを達成できますか?

20
Selwyn
  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);

セル形式を作成し、番号付け形式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();

セルに値を追加すると、次のセンターコードがあり、スタイルインデックスを適用します私のスタイルでは3つのスタイルインデックスがあり、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);
25
Selwyn

残念ながら、簡単な答えはありません。 Microsoft Office用のOpenXML Productivity Toolをダウンロードすると、簡単なスプレッドシートを分析して、数値のフォーマットを確認できます。必要なことを行うには、次の操作が必要です。

  • スタイルシートを作成する
  • カスタム定義で新しいNumberFormatを追加します
  • 上記のNumberFormatに加えて、Border、Fill、Fontがすべて定義されたCellStyleFormatを作成します。
  • 上記を参照するCellFormatsを作成します
  • 最後に、CellのStyleIndexをNumberFormatを使用するCellFormatのIDに設定します。

うわー!

一般的に良いオプションは、ClosedXMLを http://closedxml.codeplex.com/ (horrid name)で見ることです。 OpenXMLに便利な拡張機能を追加するオープンソース(GPLではありません!-ライセンスを確認してください)ライブラリです。ワークシートのセルをフォーマットするには、代わりに次のようにします。

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に移動しました

16
jklemmack

Excelには、さまざまな方法で文字列をフォーマットするための定義済みフォーマットが含まれています。セル要素のs属性は、必要なパーセント形式に対応する数値形式を参照するスタイルを参照します。詳細は question/answer をご覧ください。

以下は、0.00%マスクを数値に適用するために作成する必要があるCellFormatオブジェクトです。この場合、定義済みのフォーマット番号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;
4
amurra

簡単な方法でそれを行うことができます。単一のセルに適用する場合は、これを行います、

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

セル範囲に適用したい場合は、これを行います、

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

より多くの形式を見つけることもできます ここ また、Excelからも同じ形式を見つけることができます。

1
Smit Patel