C#でEXCEL操作を行うには、たいていの場合は、Microsoft.Office.Interop.Excelを利用してのCOM参照だと思います。これを利用するのも全然OKですが、これにはEXCEL.EXEがどうしても必要となってきます。ということは、端末(サーバー)にEXCELがインストールされている必要があるということです。サーバーにMicrosoftのOffice製品をインストールすることはあまり推奨されていませんよね。
インストールされていない場合を想定して、ここではEXCEL.EXEが不要なフリーで活用できるライブラリである「NPOI」を使用してのEXCEL操作をコーディングしてみましょう。
NPOIでEXCEL出力する方法
ここでは割愛しますが、NPOIはNuGetからソリューションにインストールすることができますからね。まずはそちらから作業をお願いしまーす。
以下のサンプルプログラムでは、EXCELを出力する際に画像も貼り付ける仕様にしています。
画像を貼り付ける際には、どうぞご参考あれ。
※「申し訳ございません。NPOI関係ありません個人のメモです」は無視してくださいね。(笑)ちなみに何をやっているかと言うと、BLOBデータをSQL Serverに登録するのと、BLOBデータをPNG画像に変換してダウンロードしています。
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 |
using System; using System.IO; using System.Drawing; using NPOI.XSSF.UserModel; using NPOI.SS.UserModel; using NPOI.SS.Util; namespace ExcelOUTPUT { class NPOI { IWorkbook book = null; // エクセルブック ISheet sheet = null; // エクセルシート IDrawing patriarch = null; // 画像編集用 IRow row = null; // エクセル行 FileStream filestream = null; // ストリームファイル(既存EXCEL) int pictureidx = 0; // 画像編集用 ImageConverter imgconv = new ImageConverter(); Image img = null; public void editexcel(EXCELEntities conn) { //↓申し訳ございません。NPOI関係ありません個人のメモです byte[] byte_test = System.Convert.FromBase64String("ここにはBLOBデータ"); // 画像 string strwk = BitConverter.ToString(byte_test); strwk = "0x" + strwk.Replace("-", String.Empty); // SQLServerは0xを付与することで16進数で登録できます //ここでSQLServerに登録!!// img = (Image)imgconv.ConvertFrom(byte_test); // BLOBデータを画像に変換 //↑申し訳ございません。NPOI関係ありません個人のメモです var uploadfile = System.Configuration.ConfigurationManager.AppSettings["UPLOAD_FILE"]; // アップロードファイル var downloadfile = System.Configuration.ConfigurationManager.AppSettings["DOWNLOAD_FILE"]; // ダウンロードファイル var sheetname = System.Configuration.ConfigurationManager.AppSettings["SHEET_NAME"]; // シート名 // ファイルオープン filestream = File.OpenRead(uploadfile); book = new XSSFWorkbook(); // ←真っ新のエクセルファイルを作成する場合 book = new XSSFWorkbook(filestream); // ←既存のエクセルファイルから作成する場合 // 破棄 filestream.Dispose(); sheet = book.GetSheet(sheetname); // ←既存のエクセルシートを取得する場合 sheet = book.CreateSheet(); // ←真っ新のエクセルシートを作成する場合 sheet.GetRow(1).GetCell(4).SetCellValue("test"); // ←既存のエクセルシートを使用する場合 row = sheet.CreateRow(1); // ←真っ新のエクセルシートを使用する場合 row.CreateCell(4).SetCellValue("test"); // ←真っ新のエクセルシートを使用する場合 // 画像貼り付け pictureidx = book.AddPicture(byte_test, (PictureType)XSSFWorkbook.PICTURE_TYPE_JPEG); patriarch = sheet.CreateDrawingPatriarch(); XSSFClientAnchor anchor = new XSSFClientAnchor(); anchor.Row1 = 1; // 画像貼り付け行スタート anchor.Col1 = 1; // 画像貼り付け列スタート anchor.Row2 = 9; // 画像貼り付け行エンド anchor.Col2 = 4; // 画像貼り付け列エンド patriarch.CreatePicture(anchor, pictureidx); // ダウンロードファイル作成 FileStream filestreamdl = new FileStream(downloadfile + ".xlsx", FileMode.Create); book.Write(filestreamdl); // 出力(ダウンロード) img.Save(downloadfile, System.Drawing.Imaging.ImageFormat.Png); // 画像をダウンロード←NPOI関係ありません filestreamdl.Dispose(); // 破棄 book.Close(); // クローズ } } } |
既存のEXCELファイルを取得して編集する際には、注意が必要です。何もデータが設定されていないカラムを取得しようとすると、オブジェクト参照がされていませんのオブジェクト指向言語のお馴染みのエラーが発生してしまいますよ。EXCEL側で罫線を引くとか何かしらの対応を行ってください。
まとめ
NPOIを利用してのEXCEL操作はいかがでしたでしょうか。他にもフリーで利用できるライブラリはいくつかあるかと思いますので、使えるツールはどんどん使っていきましょう。できる方法は多く備えあって損はないでしょうしね。
最後までお読みいただきありがとうございました。