セルの値は 1234567。ダッシュボードでは 1.2M、決算資料では「(単位:千円)」の下に 1,235、請求書では ¥1,234,567、そして印刷しようとしているシートでは何も表示されていない。どれも同じ数値です。変わったのは表示形式コードだけです。
表示形式コードは、Excel の [セルの書式設定]→[表示形式]→[ユーザー定義] に入っている文字列です。#,##0、0.0%、yyyy/mm/dd、#,##0;[Red]-#,##0。検索して見つけたものを貼り付けて終わり、という方が多いと思いますが、読めるようになる価値はあります。セクションが 4 つ、桁の記号がいくつか、それに色・条件・引用符の文字列。この言語はほぼそれで全部です。
ReoGrid V5 は Excel と同じ表示形式コードでセルを表示します。Excel からコピーしたコードは C# アプリでそのまま動き、アプリで保存した XLSX は Excel で開いても同じ見え方になります。この記事は、コードの読み方と、コードからの使い方の両方を扱います。
まず覚えておきたいコード
| コード | 値 | 表示 | 意味 |
|---|---|---|---|
0 | 1234.567 | 1235 | 整数に丸める |
0.00 | 1234.567 | 1234.57 | 小数 2 桁 |
#,##0 | 1234567 | 1,234,567 | 桁区切り |
#,##0.00 | 1234.5 | 1,234.50 | 桁区切り+小数 2 桁 |
0% / 0.0% | 0.1234 | 12% / 12.3% | パーセント(100 倍する) |
¥#,##0 | 1234567 | ¥1,234,567 | 通貨記号 |
#,##0"円" | 1234 | 1,234円 | 単位を付ける |
#,##0, | 1234567 | 1,235 | 千円単位 |
#,##0;[Red]-#,##0 | -1234 | 赤字で -1,234 | 負数を赤に |
#,##0;"▲"#,##0 | -1234 | ▲1,234 | 負数を ▲ で |
000-0000 | 1000001 | 100-0001 | 郵便番号の形 |
;;; | 何でも | (何も出ない) | 値を隠す |
yyyy/mm/dd | 日付 | 2026/10/31 | 日付 |
[$-411]ggge"年"m"月"d"日" | 日付 | 令和8年10月31日 | 和暦 |
[h]:mm | 37.5 時間 | 37:30 | 24 時間を超える時間 |
表のすべての行は ReoGrid V5 で実際に表示を確かめたもので、どれも Excel での表示と同じです。以下では、それぞれがなぜそう表示されるのかを説明します。仕組みがわかれば、表にないコードも自分で書けます。
1 つのコードに 4 つのセクション
表示形式コードは、セミコロンで区切った最大 4 つのセクションでできています。
正の数 ; 負の数 ; ゼロ ; 文字列
いくつ書くかで、各セクションが受け持つ値が決まります。
| 書いたセクション | 受け持ち |
|---|---|
1 つ — #,##0 | すべての数値 |
2 つ — #,##0;"▲"#,##0 | 正の数とゼロ ; 負の数 |
3 つ — #,##0;-#,##0;"-" | 正の数 ; 負の数 ; ゼロ |
4 つ — …;…;…;@ | 上の 3 つ+文字列 |
つまずきの大半は、次の 3 つのルールで説明できます。
- 負の数のセクションには、マイナス記号が自動では付きません。 2 つ目のセクションを書いた時点で、符号をどこに置くかは書き手に任されます。
0;0では-5が5と表示されます。"▲"#,##0や(#,##0)が成り立つのはこのためで、▲ や括弧が符号の代わりになります。 - 空のセクションは何も表示しません。
#,##0;-#,##0;(末尾のセミコロンに注意)はゼロだけを空欄にし、ほかはそのまま表示します。;;;は文字列も含めてすべてを空欄にします。値はセルに残っていて、数式からも読めますし、ファイルにも保存されます。 - 文字列が届くのは 4 つ目のセクションだけです。
#,##0を設定したセルに入った文字列は、そのまま表示されます。数値用のセクションは文字列に触れません。文字列として入った数字も同じで、CSV から来た"1234"は数値として格納し直すまでカンマの付かない1234のままです。(CSV の列が文字列になる理由と、その制御方法)
桁の記号 — 0・#・?
| 文字 | 表示 | 例 |
|---|---|---|
0 | 常に数字を出す。足りない桁は 0 で埋める | 0.5 に 0.00 → 0.50、42 に 00000 → 00042 |
# | 意味のある桁だけ出す | 0.5 に #.## → .5、0 に # → (空欄) |
? | # と同じだが、桁の幅を空白で確保して位置を揃える | 2.5 に # ?/? → 2 1/2 |
. | 小数点 | |
, | 桁区切り。末尾に置くと 1,000 で割る | #,##0 → 1,234,567、#,##0, → 1,235 |
% | 100 倍して % を付ける | 0.15 に 0% → 15% |
定番が #,### ではなく #,##0 なのはこのためです。# の部分は先頭のゼロを出さずに桁区切りだけを置き、最後の 0 1 つがゼロを空欄ではなく 0 と表示させます。
先頭のゼロ。 000-0000 を設定すると、数値 1000001 は 100-0001 と郵便番号の形で表示されます。ただしこれは数値の「見え方」です。郵便番号・社員番号・品番のように列の中身が識別子なら、文字列として格納するほうが確実です。ゼロがデータの一部になり、コピーしても、エクスポートしても、CSV にしても残ります。(郵便番号の扱いは郵便番号から住所を補完する記事でも触れています)
パーセントは 100 倍します。 0% は 0.15 を 15% にし、12 を 1200% にします。データが最初からパーセント単位(12 が 12% の意味)なら、0.12 で格納するか、記号を引用符で囲んでただの文字にします。0"%" なら 12 は 12% と表示されます。
千円単位・百万円単位 — 末尾のカンマ
数字の記号の間にあるカンマは桁区切りです。数値部分の末尾にあるカンマは 1,000 で割り、2 つ並べると 100 万で割ります。変わるのは表示だけです。
| コード | 1234567 の表示 | よくある使い方 |
|---|---|---|
#,##0, | 1,235 | 「(単位:千円)」の資料 |
#,##0,, | 1 | 「(単位:百万円)」の資料 |
#,##0.0,, | 1.2 | 百万円単位で小数 1 桁 |
0.0,,"M" | 1.2M | ダッシュボードのタイル |
千円単位の表では、見出しや表の右上に「(単位:千円)」と書き、数値のセルには #,##0, を設定するのが定番です。セルの値は円のままなので、合計も前年比も円で正しく計算されます。
大きさに応じて K と M を切り替えるなら、セクションの頭に条件を書きます(条件は次の節で説明します)。
[>=1000000]0.0,,"M";[>=1000]0.0,"K";0
1500 → 1.5K
2500000 → 2.5M
999 → 999
Excel にもある端のケースが 1 つあります。条件が調べるのはセルの値で、丸めはその後に行われます。999999 は 100 万未満なので K のセクションに入り、999.999 を小数 1 桁に丸めて 1000.0K になります。気になる場合は、しきい値を丸めが切り替わる位置にずらします。[>=999950]0.0,,"M";… なら同じ値が 1.0M と表示されます。
色と条件
セクションの頭には 8 つの色を書けます。[Black]・[Blue]・[Cyan]・[Green]・[Magenta]・[Red]・[White]・[Yellow] です。色はそのセクションにだけ効き、セルの文字色より優先されます。
[Blue]+0.0%;[Red]-0.0%;0.0%
0.034 → +3.4% (青)
-0.012 → -1.2% (赤)
0 → 0.0%
ここでの + はただの文字です。コードが書いたものがそのまま出て、負の数のセクションは自分で - を書いています。
決算書でよく見る「負数を赤の ▲ で」も同じ書き方です。
#,##0;[Red]"▲"#,##0 -1234 → ▲1,234(赤)
角括弧の条件を書くと、正・負の振り分けの代わりに、自分で決めた条件でセクションを選べます。条件のないセクションは、残りのすべての値を受け持ちます。
[Red][<60]0;0 45 → 45(赤)、 75 → 75 合格点の判定
[=0]"なし";0" 件" 0 → なし、 3 → 3 件
[>=60]"合格";"不合格" 75 → 合格、 40 → 不合格
最後の例は文字しか表示しませんが、セルには 75 が入ったままです。並べ替えも合計もフィルターも数値として動きます。文字はあくまで見え方です。
文字列・単位・@
二重引用符で囲んだものはそのまま表示されます。0"個" なら 3 は 3個、#,##0"円" なら 1234 は 1,234円 です。1 文字だけならバックスラッシュでも同じことができます。
単位をセルではなく表示形式に書くのには理由があります。セルに 3個 と入力するとそれは文字列になり、SUM は文字列を飛ばします。0"個" を設定した 3 は、見た目に「個」が付いているだけの数値です。
@ はセルの文字列を表し、4 つ目のセクション(または @ を含む最後のセクション)で使います。宛名に敬称を付けるのが日本ではよくある使い方です。
@" 様" "田中" → 田中 様
数値の列に紛れ込んだ文字列を目立たせることもできます。
#,##0;-#,##0;0;[Red]@
1234 → 1,234
"未定" → 未定(赤)
数値はいつもどおりに表示され、誰かが 未定 と入力した 1 セルだけが赤くなります。合計から黙って抜け落ちる前に気づけます。
日付と時刻
セルの日付は数値です。1900 年からの日数を整数部に、その日の時刻を小数部に持っています。どう読ませるかはコードが決めます。
| コード | 2026 年 10 月 31 日 14:05:09 の表示 |
|---|---|
yyyy/mm/dd | 2026/10/31 |
yyyy"年"m"月"d"日" | 2026年10月31日 |
m"月"d"日" | 10月31日 |
yyyy-mm-dd | 2026-10-31 |
mmm d, yyyy | Oct 31, 2026 |
ddd / dddd | Sat / Saturday |
h:mm AM/PM | 2:05 PM |
yyyy/mm/dd hh:mm:ss | 2026/10/31 14:05:09 |
m は「月」のことも「分」のこともあります。h / hh の直後か ss の直前にあれば分、それ以外は月です。mm:ss は分と秒、mm 単独なら月です。
[h]:mm — 1 日消える勤務表
1 日 7 時間 30 分を 5 日分、合計します。
A1:A5 各 7:30 (1 日の 7.5 / 24、表示形式 h:mm)
A6 =SUM(A1:A5)
h:mm → 13:30 24 時を超えて時計が一周した
[h]:mm → 37:30 経過時間
h は時計の針の「時」なので、37.5 時間は「1 日と 13:30」と読まれます。角括弧で囲むと一周せずに数え続けます。[h]:mm・[mm]:ss・[ss] の 3 つです。勤務時間の合計には必ず角括弧を付けます。
和暦
[$-411]ggge"年"m"月"d"日" で 2026 年 10 月 31 日は 令和8年10月31日 と表示されます。[$-411]ge.m.d なら R8.10.31 です。元号の表は ReoGrid に内蔵されているので、どのマシンでも同じ文字になります。[$-ja-JP-x-gannen] を付けると、2019 年 5 月 1 日は 令和元年5月1日 と元年表記になります。業務アプリでの使い方は和暦の記事、コードの一覧は数値書式のドキュメントにあります。
曜日の aaa(土)・aaaa(土曜日)は現時点では未対応です(現時点での制限)。曜日を出すなら英語表記の ddd・dddd を使えます。
日付の列には表示形式を設定する
表示形式を設定していない日付セルは、動いているマシンの地域設定の日付形式で表示されます。同じファイルでも、日本の PC と海外の PC では見え方が変わります。日付の列に表示形式を設定しておけば、どこで開いても同じ表示になります。
表示形式は値を変えない
3 つのセルに =100/3 が入っています。#,##0 を設定するとどれも 33 と表示され、SUM は 100 を表示します。どこも壊れてはいません。合計はセルの値(33.333… が 3 つ)から計算され、表示形式は画面に出す桁だけを丸めます。丸め方は Excel と同じく四捨五入(0 から遠いほうへ)で、0 を設定した 2.5 は 3、0.00 を設定した 0.125 は 0.13 と表示されます。
ここまでの例もすべて同じです。1,235(千円単位)は数式から見れば 1234567 のままで、;;; で隠した値も合計に入ります。
請求書や税額の行、電卓で検算される表のように、画面の数字どおりに合計が合ってほしいときは、表示ではなく値を丸めます。=ROUND(100/3, 0) なら 33 が格納され、3 つの合計は 99 になります。金額の丸めは「請求書の合計が1円ずれる」を防ぐ記事で ROUND・ROUNDDOWN・ROUNDUP を使って説明しています。
C# から使う — ReoGrid V5
ここから先のコードは WinForms・WPF・Avalonia で共通で、UI のないヘッドレスでもそのまま動きます。
表示形式を設定する
using unvell.ReoGrid.Core;
using unvell.ReoGrid.Core.Data;
var workbook = new Workbook();
var sheet = workbook.AddWorksheet("損益");
sheet.SetText(0, 0, "地域"); sheet.SetText(0, 1, "営業利益"); sheet.SetText(0, 2, "前年比");
sheet.SetText(1, 0, "東日本"); sheet.SetNumber(1, 1, 1234567); sheet.SetNumber(1, 2, 0.034);
sheet.SetText(2, 0, "西日本"); sheet.SetNumber(2, 1, -45200); sheet.SetNumber(2, 2, -0.012);
sheet.SetText(3, 0, "九州"); sheet.SetNumber(3, 1, 0); sheet.SetNumber(3, 2, 0);
sheet.SetNumberFormat(RangePosition.Parse("B2:B4"), "#,##0;[Red]\"▲\"#,##0;\"-\"");
sheet.SetNumberFormat(RangePosition.Parse("C2:C4"), "[Blue]+0.0%;[Red]-0.0%;0.0%");
sheet.GetDisplayText(1, 1); // "1,234,567"
sheet.GetDisplayText(2, 1); // "▲45,200" 赤で描画
sheet.GetDisplayText(3, 1); // "-"
sheet.GetDisplayText(1, 2); // "+3.4%" 青で描画
sheet.GetValue(1, 1).AsNumber; // 1234567 — 値そのものは変わらない
コードは C# の文字列なので、コードの中の二重引用符はエスケープします。"-" は \"-\" と書きます。それ以外は Excel に入力する文字列とまったく同じです。
SetNumberFormat(range, …) は指定した範囲のすべてのセルに書き込むので、列全体ではなくデータのある範囲を渡します。SetNumberFormat(row, col, null) で表示形式を外し、GetNumberFormat(row, col) で読み出せます。
日付
日付は日付の値として入れ、見え方は表示形式で決めます。
sheet.SetValue(1, 3, CellValue.Date(new DateTime(2026, 10, 31).ToOADate()));
sheet.SetNumberFormat(1, 3, "yyyy\"年\"m\"月\"d\"日\""); // "2026年10月31日"
sheet.SetNumberFormat(1, 3, "[$-411]ggge\"年\"m\"月\"d\"日\""); // "令和8年10月31日"
Excel と同じく、日付の表示形式はただの数値にも効きます。シリアル値 46326 に yyyy/mm/dd を設定すれば 2026/10/31 と表示されます。
セルの表示を読む
GetDisplayText はグリッドが描くとおりの文字列を返します。エクスポート、メール本文、利用者に見える文字を確かめる単体テストに便利です。表示形式に色があれば、GetFormattedText がその色も返します。
string text = sheet.GetFormattedText(2, 1, out uint? color);
// text = "▲45,200"
// color = 0xFFFF0000(ARGB)— セクションに色の指定がなければ null
シートの外で値を整形する
ラベルやグラフの見出し、集計行の文言には、NumberFormatter で double に直接コードを適用できます。画面のラベルと隣のセルの表示が揃います。
using unvell.ReoGrid.Core.Style;
if (NumberFormatter.TryFormat(1234567, "#,##0,\"千円\"", out string label, out _))
totalLabel.Text = label; // "1,235千円"
General や空のコードには false を返すので、そのときはアプリ側の整形に切り替えます。
数式の中では TEXT
数値を文字列とつなぐと、セルの表示形式は外れます。数式が見ているのは表示ではなく値だからです。数式の中で同じコードを使うには TEXT を使います。
sheet.SetFormula(5, 1, "SUM(B2:B4)");
sheet.SetNumberFormat(5, 1, "#,##0"); // B6 は "1,189,367"
sheet.SetFormula(6, 1, "\"合計 \"&B6&\" 円\""); // "合計 1189367 円"
sheet.SetFormula(7, 1, "\"合計 \"&TEXT(B6,\"#,##0\")&\" 円\""); // "合計 1,189,367 円"
利用者に表示形式を選ばせる
WinForms・WPF・Avalonia の各コントロールは、利用者の選択範囲に 1 回の呼び出しで表示形式を設定できます。ツールバーに「表示形式」のドロップダウンを置くなら、これだけで足ります。
grid.SetSelectionNumberFormat("#,##0"); // grid は ReoGridControl
列全体が選ばれているときは、データのあるセルに設定します。
XLSX に保存して Excel で開く
using unvell.ReoGrid.IO.Excel;
XlsxWriter.Write(workbook, "損益.xlsx");
表示形式は Excel の表示形式としてそのまま保存されるので、Excel で開いても同じ 1,234,567、同じ赤い ▲、ゼロは同じ - で表示されます。逆方向も同じで、XLSX を読み込むと各セルの表示形式が保たれます。Excel で書式を整えたテンプレートは、アプリでも同じ見え方になります。(Excel テンプレートに差し込んで出力する)
どのマシンでも同じ文字
ReoGrid V5 は、どのマシンでもコードを同じように表示します。地域設定にかかわらず , が桁区切り、. が小数点で、元号は内蔵の表から引きます。サーバーで作った帳票と利用者の PC の画面が、1 文字単位で一致します。
現時点での制限
- 曜日の
aaa(土)・aaaa(土曜日)は現時点では未対応で、書いた文字のまま表示されます。曜日はddd(Sat)・dddd(Saturday)で表示できます。 _(次の文字の幅だけ空ける)と*(文字を繰り返してセル幅を埋める)は読み込めますが、セルには空きや埋め草を付けずに数値を表示します。- 1904 年からの日付システムには対応していません。
V4 から移行する場合
V4 では CellDataFormatFlag と NumberFormatArgs などの引数オブジェクトで表示形式を設定していました。V5 ではそれらがすべて表示形式コードに置き換わります。
// V4: worksheet.SetRangeDataFormat(range, CellDataFormatFlag.Number,
// V4: new NumberDataFormatter.NumberFormatArgs { DecimalPlaces = 2, UseSeparator = true });
ws.SetNumberFormat(range, "#,##0.00");
V4 の「負数を赤の括弧で」は V5 では #,##0;[Red](#,##0) です。和暦も表示形式コードで書きます。ほかの対応は移行ガイドにまとめています。
まとめ
- 表示形式コードは最大 4 つのセクション — 正の数 ; 負の数 ; ゼロ ; 文字列。負の数のセクションを書いたら、符号(
-・▲・括弧)は自分で置く 0は常に数字を出し、#は意味のある桁だけを出す。末尾のカンマは 1,000 で割る — 千円単位・百万円単位の表示はこれで書ける- 色と条件は角括弧、引用符の中はそのまま表示、
;;;は値を消さずに隠す - 時間の合計は
[h]:mm。mが「分」になるのはhかssの隣にあるときだけ - 表示形式が変えるのは見え方だけで、値は変わらない。 画面の数字どおりに合計を合わせたいなら
ROUNDで値を丸める - ReoGrid V5 は Excel のコードをそのまま使える —
SetNumberFormat、GetDisplayText、TEXT、NumberFormatter、そして XLSX の読み書き
関連記事
- 数値書式 — 対応しているコードの一覧、和暦、指数表記、分数
- CellValue — シートが格納する数値・日付・文字列
- XLSX — Excel ファイルの読み書き
- 「CSV を Excel で開いたら郵便番号の 0 が消えた」を自社アプリで防ぐ
- 「請求書の合計が1円ずれる」を防ぐ — 通貨書式・消費税・端数処理
- 和暦(令和)対応の日付セル
- SUBTOTAL と AGGREGATE の違い