Cellの書式を設定する(NPOI編)
株式会社クローバーフィールドの杉山です。
今回はNPOIを使用したいと思います。
ちなみにマニュアルなどについては、Apache POIを参照しています。
CellTypeで指定できる定数がいくつかありますが、今回使用できそうなのは、下記の4つでしょうか。
NUMERIC 数字
STRING 文字
FORMULA 式
BOOLEAN TRUE/FALSE
日付や時刻については、数字を指定し書式で判断するようです。
EPPlus、ClosedXML編にならって、コードを書いてみました、
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 | using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using NPOI.SS.UserModel; using NPOI.XSSF.UserModel; using System.IO; namespace ExcelNpoi { class Program { static void Main(string[] args) { String filepath = @"c:\output\npoi.xlsx"; IWorkbook workbook = new XSSFWorkbook(); ISheet sheet = workbook.CreateSheet("mySheet"); // 文字列の値設定 IRow row = sheet.CreateRow(0); ICell cell = row.CreateCell(0); cell.SetCellType(CellType.String); cell = row.CreateCell(1); cell.SetCellValue("Hello, Excel!"); cell = row.CreateCell(2); cell.SetCellValue("0123456789"); cell = row.CreateCell(3); cell.SetCellType(CellType.String); cell.SetCellValue("0123456789"); cell = row.CreateCell(4); cell.SetCellType(CellType.String); cell.SetCellValue(0123456789); // 数値の値設定 row = sheet.CreateRow(1); cell.SetCellType(CellType.Numeric); ICellStyle numStyle = workbook.CreateCellStyle(); numStyle.DataFormat = workbook.CreateDataFormat().GetFormat("#,##0.0"); cell = row.CreateCell(0); cell.CellStyle = numStyle; cell = row.CreateCell(1); cell.CellStyle = numStyle; cell.SetCellValue(1234); cell = row.CreateCell(2); cell.CellStyle = numStyle; cell.SetCellValue("1234"); // 日付の値設定 row = sheet.CreateRow(2); ICellStyle dateStyle = workbook.CreateCellStyle(); dateStyle.DataFormat = workbook.CreateDataFormat().GetFormat("yyyy/mm/dd"); cell = row.CreateCell(0); cell.SetCellType(CellType.Numeric); cell.CellStyle = dateStyle; cell = row.CreateCell(1); cell.SetCellType(CellType.Numeric); cell.CellStyle = dateStyle; cell.SetCellValue("2017/8/11"); cell = row.CreateCell(2); cell.SetCellType(CellType.Numeric); cell.SetCellValue("2017/8/12"); cell = row.CreateCell(3); cell.SetCellType(CellType.String); cell.SetCellValue("DATE"); // 時刻の値設定 row = sheet.CreateRow(3); ICellStyle timeStyle = workbook.CreateCellStyle(); timeStyle.DataFormat = workbook.CreateDataFormat().GetFormat("HH:mm:ss"); cell = row.CreateCell(0); cell.SetCellType(CellType.Numeric); cell.CellStyle = timeStyle; cell = row.CreateCell(1); cell.SetCellType(CellType.Numeric); cell.CellStyle = timeStyle; cell.SetCellValue("13:14:01"); cell = row.CreateCell(2); cell.SetCellType(CellType.Numeric); cell.SetCellValue("13:15:02"); cell = row.CreateCell(3); cell.SetCellType(CellType.Numeric); cell.CellStyle = timeStyle; cell.SetCellValue("TIME"); using (FileStream fs = File.Create(filepath)) { workbook.Write(fs); } } } } |
実行結果、下記のようになりました。
まず、他の2つのライブラリとフォントが違います。
指定しなかったらデフォルトで使用されるフォントとか違うのかな。
設定されている書式ですが、CellTypeに文字(STRING)を指定したセルに「標準”@”」が設定されています。
他のライブラリと同様の動きですが、なんで表示形式が「文字列」にならないかな。
指定しなかった場合、表示形式に「標準」が設定されるほうがしっくりくるんだけど。
B1, C1 : CellTypeを指定しなかった場合でも、文字列を設定すると「標準”@”」が設定される
D1 : CellTypeに文字(STRING)を指定し、文字列として数字を指定すると表示形式に「標準”@”」が設定され、先頭のゼロは正しく表示される
E1 : CellTypeに文字(STRING)を指定し、文字列として数字を指定すると表示形式に「標準”@”」が設定され、先頭のゼロは表示されない
A2 : CellTypeに文字(NUMERIC)を指定すると表示形式は「通貨」となる
B2 : CellTypeに文字(NUMERIC)を指定すると表示形式は「通貨」となり、フォーマットも正しく設定されている
C2 : 表示形式、フォーマットはB2と同様だか、小数点以下の0が表示れす、表示されている内容は文字列扱いに見える
日付ですが、設定する値を月のゼロ埋めをしない形式で値を設定してフォーマットが正しく適用されているか確認するように変更しました。
A3 : 表示形式は「ユーザ定義」でフォーマットは指定された形式が設定されている
B3 : A3と同様だが、表示されている値はフォーマットの指定と異なり文字列扱いに見える
C3 : 表示形式に「標準”@”」が設定されており、表示されている内容は文字列扱いに見える
A4~D3は、日付書式を設定した場合と同様でした。
EPPlus、ClosedXMLについても日付の書式が正しい適用されているか再確認してみます。