[C#] NPOIライブラリを利用してエクセルファイルを生成する方法
こんにちは。明月です。
この投稿はC#でNPOIライブラリを利用してエクセルファイルを生成する方法に関する説明です。
NPOIライブラリはApache財団で提供するエクセル、パワーポイント、ワードファイルフォーマットを運用するためのライブラリです。元はJavaのPOIライブラリから始まりましたが、C#でも使うためにNPOIの名でライブラリを提供していることです。
それならこれからNPOIを使ってエクセルを作成しましょう。
NPOIを使うためにNugetを利用してライブラリをダウンロードと連携します。
using System;
using System.IO;
//共通 NPOI
using NPOI;
using NPOI.SS.UserModel;
//標準xlsバージョン
using NPOI.HSSF;
using NPOI.HSSF.UserModel;
//拡張xlsxバージョン
using NPOI.XSSF;
using NPOI.XSSF.UserModel;
namespace NPOIExample
{
class Program
{
// 実行関数
static void Main(string[] args)
{
// エクセルバージョン設定
// xlsは標準エクセル、xlsxのMSの拡張エクセル
// ここでは標準エクセルで作成する。
var version = "xls";
//var version = "xlsx";
// Workbook生成
var workbook = CreateWorkbook(version);
// Workbookの中に"Test Sheet"名でシート(Sheet)生成
var sheet = workbook.CreateSheet("Test Sheet");
// シート(Sheet)からセルを取得する。(無ければ、自動生成)
// エクセル参考番号は A1だ。
var cell = GetCell(sheet, 0, 0);
// セルにデータを格納
cell.SetCellValue("TEST Result");
// シート(Sheet)からセルを取得する。(無ければ、自動生成)
// エクセル参考番号は B1だ。
cell = GetCell(sheet, 0, 1);
// セルにデータを格納
cell.SetCellValue(100);
// シート(Sheet)からセルを取得する。(無ければ、自動生成)
// エクセル参考番号は C1だ。
cell = GetCell(sheet, 0, 2);
// セルにデータを格納
cell.SetCellValue(DateTime.Now);
// セルにデータフォーマット設定
var style = workbook.CreateCellStyle();
// 日付フォーマット
style.DataFormat = HSSFDataFormat.GetBuiltinFormat("m/d/yy h:mm");
// 整列フォーマット
style.Alignment = HorizontalAlignment.Center;
style.VerticalAlignment = VerticalAlignment.Top;
// セルの色設定
style.FillBackgroundColor = IndexedColors.Gold.Index;
// フォント設定
var font = workbook.CreateFont();
font.Color = IndexedColors.Red.Index;
// 設定されたセルはC1だ。
cell.CellStyle = style;
// セルの幅を自動設定 A行
sheet.AutoSizeColumn(0);
// セルの幅を自動設定 B行
sheet.AutoSizeColumn(1);
// セルの幅を自動設定 C行
sheet.AutoSizeColumn(2);
// シート(Sheet)からセルを取得する。(無ければ、自動生成)
// エクセル参考番号は A2だ。
cell = GetCell(sheet, 1, 0);
// セルにデータを格納
cell.SetCellValue(1);
// シート(Sheet)からセルを取得する。(無ければ、自動生成)
// エクセル参考番号は B2だ。
cell = GetCell(sheet, 1, 1);
// セルにデータを格納
cell.SetCellValue(2);
// シート(Sheet)からセルを取得する。(無ければ、自動生成)
// エクセル参考番号は C2だ。
cell = GetCell(sheet, 1, 2);
// 関数式を設定 A2 + B2 = 1 + 2 = 3
cell.SetCellFormula("SUM(A2:B2)");
// セルを格納
WriteExcel(workbook, @"c:\work\test." + version);
// コンソール出力
Console.WriteLine("Press Any Key...");
Console.ReadKey();
}
// Workbook生成関数
public static IWorkbook CreateWorkbook(string version)
{
// 標準エクセル.xls
if ("xls".Equals(version))
{
// 標準エクセルWorkbookを割当
return new HSSFWorkbook();
}
// 拡張エクセル.xlsx
else if ("xlsx".Equals(version))
{
// 拡張エクセルWorkbookを割当
return new XSSFWorkbook();
}
// xlsとxlsxじゃなければ、エラー発生
throw new NotSupportedException();
}
// シート(Sheet)から行を取得関数
public static IRow GetRow(ISheet sheet, int rownum)
{
// シートから行を取得
var row = sheet.GetRow(rownum);
// 行がnullなら
if (row == null)
{
// シートから行を生成する。
row = sheet.CreateRow(rownum);
}
// 行をリターン
return row;
}
// 行から列を取得関数
public static ICell GetCell(IRow row, int cellnum)
{
// 行から列を取得
var cell = row.GetCell(cellnum);
// 列がnullなら
if (cell == null)
{
// 行から列を生成する。
cell = row.CreateCell(cellnum);
}
// 列をリターン
return cell;
}
// エクセルシート(Sheet)からセル取得関数(rownumは行、cellnumは列)
public static ICell GetCell(ISheet sheet, int rownum, int cellnum)
{
// 行を取得
var row = GetRow(sheet, rownum);
// 行から列を取得
return GetCell(row, cellnum);
}
// エクセルのWorkbookをファイルに格納する関数
public static void WriteExcel(IWorkbook workbook, string filepath)
{
// ファイルストリームを生成する。
using (var file = new FileStream(filepath, FileMode.Create, FileAccess.Write))
{
// 格納する。
workbook.Write(file);
}
}
}
}
これからエクセル生成したディレクトリに移動してファイルを開きましょう。
xlsバージョンとxlsxバージョンはnamespaceが違うし扱うクラスも違います。でも、クラスは違いますが、インタフェースは IWorkbook과 ISheetで作業するのでクラスを割り当てする時だけ分けて、次からはインタフェースで運用するとバージョン関係せずにエクセルを扱うことができます。
上の例では基本的にNPOIでよく使うデータ格納、関数式、色の設定、セルのスタイル設定まで実装しておきました。NPOIのAPIはすごく多いので、下記のURLのドキュメントを参考してください。
link - https://poi.apache.org/apidocs/
(Javaのドキュメントですが、使用方法はC#と同じです。)
でも、実際の業務ではExcelを始めから生成して出力することは少ないです。普通はExcelのテンプレートを作成して、そのテンプレートを参照して出力する方法で使います。
その方法に関しては別の投稿で紹介します。
ここまでC#でNPOIライブラリを利用してエクセルファイルを生成する方法に関する説明でした。
ご不明なところや間違いところがあればコメントしてください。
- [C#] Redisのデータベースを接続して使い方2022/02/15 18:46:09
- [C#] 非同期ソケット通信(IOCP)-APMパターン2020/05/18 18:45:37
- [C#] 非同期ソケット通信(IOCP)-EAPパターン2020/05/15 19:31:02
- [C#] NPOIを利用してExcelを読み込んで出力する方法2020/05/08 10:43:52
- [C#] NPOIライブラリを利用してエクセルファイルを生成する方法2020/05/07 01:49:01
- [C#] Geckoライブラリを利用してウェブスクレイピングする方法2020/05/05 00:52:26
- [C#] PDFを作成する方法(iTextSharp)2020/05/03 10:22:40
- [C#] シリアライズ(Serialization)をする方法2020/04/30 19:32:04
- [C#] dynamicタイプの動的パラメータ-DynamicObject(WinFormでASP.MVCのViewBagオブジェクトを使用する方法)2020/04/29 22:41:32
- [C#] Stringの補間式(interpolation)2020/04/27 20:39:57
- [C#] Newtonsoft.JSONライブラリを利用してJsonデータ構造を扱う方法2020/04/23 20:19:53
- [C#] EMailを送信する方法(System.Net.Mail)2020/04/22 19:00:42
- check2024/04/10 19:03:53
- [Java] 64.Spring bootとReactを連結する方法(Buildする方法)2022/03/25 21:02:18
- [Javascript] Node.jsをインストールしてReactを使う方法2022/03/23 18:01:34
- [Java] 63. Spring bootでcronスケジューラとComponentアノテーション2022/03/16 18:57:30
- [Java] 62. Spring bootでWeb-Filterを設定する方法(Spring Security)2022/03/15 22:16:37
- [Java] JWT(Json Web Token)を発行、確認する方法2022/03/14 19:12:58
- [Java] 61. Spring bootでRedisデータベースを利用してセッションクラスタリング設定する方法2022/03/01 18:20:52
- [Java] 60. Spring bootでApacheの連結とロードバランシングを設定する方法2022/02/28 18:45:48
- [Java] 59. Spring bootのJPAでEntityManagerを使い方2022/02/25 18:27:48
- [Java] 58. EclipseでSpring bootのJPAを設定する方法2022/02/23 18:11:10
- [Java] 57. EclipseでSpring bootを設定する方法2022/02/22 19:04:49
- [Python] Redisデータベースに接続して使い方2022/02/21 18:23:49
- [Java] Redisデータベースを接続して使い方(Jedisライブラリ)2022/02/16 18:13:17
- [C#] Redisのデータベースを接続して使い方2022/02/15 18:46:09
- [CentOS] Redisデータベースをインストールする方法とコマンドを使い方2022/02/14 18:33:07