Emotion Wave Tech Blog

福岡にあるエモーションウェーブ株式会社のエンジニアが書いています。

C#でClosedXMLを使ってExcel出力を実装する

久しぶりのブログです。
EW中原です。

本日はC#で簡単なExcel出力の実装についてです。

昔はCOMを使って実装していましたが、
動かすPCにExcelが入ってないと動かない、気をつけて実装しないとEXCELのプロセスが残る等色々とあるので、
今回はCOMを使わなくてもExcel操作ができるClosedXMLというものを使って実装してみました。

github.com

早速実装します。
今回は適当にConsoleApplicationを作成しました。

まずは、NuGetからClosedXMLを検索・選択して「インストール」。
f:id:devew:20200110135053p:plain f:id:devew:20200110135124p:plain

インストール終わると、以下の参照設定となります。
色々追加されています。
f:id:devew:20200110135253p:plain

Program.csusing ClosedXML.Excel; を追加します。
ClosedXMLを使うためです。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using ClosedXML.Excel;

namespace ClosedXMLSample
{
    class Program
    {
        static void Main(string[] args)
        {
        }
    }
}

実際に新規WorkBookを作成します。
今回は野菜一覧(野菜の価格表)を作成してみました。
完成したコードは以下です。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using ClosedXML.Excel;

namespace ClosedXMLSample
{
    class Program
    {
        /// <summary>
        /// 野菜の一覧を作成します
        /// </summary>
        /// <param name="args"></param>
        static void Main(string[] args)
        {
            // Workbookを作成する
            using (XLWorkbook workbook = new XLWorkbook())
            {
                // Worksheetを追加
                IXLWorksheet worksheet = workbook.AddWorksheet("Sheet1");

                int row = 1;

                // 1行目にヘッダー部を出力
                worksheet.Cell(row, 1).SetValue("No");
                worksheet.Cell(row, 2).SetValue("Yasai Name");
                worksheet.Cell(row, 3).SetValue("Price");
                row++;

                // 2行目以降に野菜一覧作成
                worksheet.Cell(row, 1).SetValue(row-1);
                worksheet.Cell(row, 2).SetValue("Carrot");
                worksheet.Cell(row, 3).SetValue(120);
                row++;

                worksheet.Cell(row, 1).SetValue(row-1);
                worksheet.Cell(row, 2).SetValue("Tomato");
                worksheet.Cell(row, 3).SetValue(220);
                row++;

                worksheet.Cell(row, 1).SetValue(row-1);
                worksheet.Cell(row, 2).SetValue("Cabbage");
                worksheet.Cell(row, 3).SetValue(100);

                //出力した表の内側に罫線を引く
                worksheet.Range(1, 1, row, 3).Style.Border.InsideBorder = XLBorderStyleValues.Thin;

                //出力した表の外側に罫線を引く
                worksheet.Range(1, 1, row, 3).Style.Border.OutsideBorder = XLBorderStyleValues.Thin;

                // ヘッダー(1行目)に背景色を付ける
                worksheet.Range(1, 1, 1, 3).Style.Fill.BackgroundColor = XLColor.SkyBlue;

                // 名前をつけてブックを保存
                workbook.SaveAs("ClosedXMLSample.xlsx");
            }
        }
    }
}

出力結果はこのようになりました。
f:id:devew:20200110153217p:plain

ソースコード一式は以下に置きました。
github.com

今回は基本的なことしか紹介できませんでしたが、もちろん他にも色々な機能があります。
またご紹介できたらと思います。

C#でUTC時間に変換

C#で各タイムゾーンの時間をUTCに変換したり、その逆でUTCから各タイムゾーンの時間に変換する方法を調べました。

UTCについては以下を参照ください。 ちなみに日本はUTC+9です。

UTC協定世界時とGMTグリニッジ標準時の違い | LOCALTIME.JP

サンプルコードは以下です。

上記コードを実行すると以下のような結果が得られます。 f:id:devew:20190320163724p:plain .NETのTimeZoneInfoクラスを使えば簡単です。 TimeZoneInfo.ConvertTimeFromUtcでUTCから各タイムゾーンの時間に変換し、TimeZoneInfo.ConvertTimeToUtcで各タイムゾーンの時間をUTCに変換できます。

参考

グローバル化はなぜ日時処理問題を引き起こすのか

VPNパススルー

だいぶ前に、自宅から会社のVPN経由でサーバにつなげる話しをしました。

これで自宅からも社内ネットワークに入れるようになり、自宅から仕事ができるようになって便利になります。

前回はrouteコマンドで解決したと記事を書いたのですが、実は別にもうひとつ難関があったのです。 どうしても自宅ネットワークでは繋げなかったのです。

我がスマホテザリングをONにしそれで試してみると…、routeコマンドで経路を設定すると…、つながった! じゃ、やっぱり自宅ネットワークに問題ありそう。

色々調べているとルーターが「VPNパススルー」に対応していないとダメらしい。

でも自宅で使っているのは「NetGenesis SuperOPT100E」です。なかなか立派なルーターです。対応してないはずがない。 「VPNパススルー」が有効になっていないっぽいなあ。

というわけでネットからマニュアルを見て設定箇所を調べてみました。 「PPPoE変換を有効にする」のチェックをつけないとダメみたいだ。

f:id:devew:20190320165005p:plain

チェックつけてルーター再起動したら社内ネットワークに無事につながりました~。

一般企業も、在宅ワークができるようにVPNを導入している会社が増えてますが、結構ここでつまずいていることが多いみたいです。 自宅のルーターなのでもちろん対応方法はバラバラ。 素人がやるのはハードル高いですね。

VPNパススルー」に対応していないルーターもまれにあるみたいなので、 自宅で作業する人は要確認ですね。

第1回CodeEW(エモーションウェーブプログラミングコンテスト)のお題はFizzBuzz

お久しぶりです。中原です。

先日社内でプログラミングコンテスト(CodeEW)を行いました。

プログラミングコンテストを行ったきっかけ

今回プログラミングコンテストを行ったきっかけは、 弊社のエンジニアからYammerで「あそこのコードがちょっと気持ち悪いんですけど、もっと良い書き方ないですかねー?」という話を受けて色々と意見交換をしていたのですが、最終的に「こういう話をみんなでしたいですね」という感じになりました。 確かにディスカッションしながらコーディングするっていうのはとても勉強になるなあという実感もありました。

弊社にはスラスラとコードが書ける人もいるのですが、まだ思い通りにコードが書けない人もいます。 また、それぞれ経験してきたプロジェクト、得意なプログラミング言語は違いますので、コードの書き方に関しても様々だと思います。

スラスラ書ける人も書けない人もみんなでコードを共有し意見交換し、みんなで色々なコーディングスタイルを学んで、みんなでカッコよくなろうよということで、 第1回エモーションウェーブプログラミングコンテスト(CodeEW)を開催しました。

お題は、第1回ということで比較的有名な「FizzBuzz」に決定。

FizzBuzz問題とは

FizzBuzz問題とは下記のようなものです。

1から100までの数をプリントするプログラムを書け。ただし3の倍数のときは数の代わりに「Fizz」と、5の倍数のときは「Buzz」とプリントし、3と5両方の倍数の場合には「FizzBuzz」とプリントすること。

Fizz-Buzz問題とは - はてなキーワード

FizzBuzzをどれだけ少ないバイト数で書けるか

単純なFizzBuzzでも良かったのですが、ゲーム性を持たせたほうが良いと言う意見があったので、今回は「1番少ないバイト数で書いた人が優勝」というルールにしました。

ということで、以下のルールとなりました。

  • FizzBuzz問題を1番少ないバイト数で書いた人が優勝です
  • 言語は問いません
  • 優勝した人にはAmazonギフトカード500円分を進呈します

みんなの解答

ということで、みんなの解答です。(参加は任意で行いました)

PHP

C#

Java

Ruby

C#

Perl

PHP

Javascript

Javascript

言語も色々ですし書き方も色々なのでとても面白いですね。

まとめ

弊社ではYammerでの情報共有や開発ミーティングなどを行っていますが、みんなが1つのお題に対してコーディングするということは初めてでした。 解答に関して来月みんなで集まって色々と話しをする予定ですが、みんなのコードを見ると一つ一つが個性的で個人的にはとても勉強になりました。 DB設計のお題とかも面白いかもですね。

と言うことで第2回も開催したいと思います!

VirtualBoxのディスクサイズを増やそう!Windows編

仮想マシンのディスクがいっぱいになってしまいました。 「可変ディスク」ってしてるので勝手に拡張すると思ってたんですけどどうも違うっぽい。

拡張したいときはそれなりの手続きが必要みたいです。 Linuxで似た記事はあるけどWindowsではあまり見かけないので書いてみました。

今現在はこんな感じ。 f:id:devew:20190320170409j:plain 25GBを30GBに容量増やしたいとします。

これはコマンドから行います。

C:\Program Files\Oracle\VirtualBox\VBoxManage.exe modifyhd [仮想ディスクファイル名] --resize [増加サイズ]

※仮想ディスクファイル名には、vdi ファイルを指定する。 ※増加サイズはMB単位で指定してください。(1GBなら1024です)仮想ディスクファイルはどこにあるの?と調べたいときはここに書いてますよ↓。 f:id:devew:20190320170448j:plain

早速コマンドを流しましょう。VBoxManage.exeも仮想ディスクファイル名もフルパスで指定しましょう。

C:\Program Files\Oracle\VirtualBox\VBoxManage.exe modifyhd D:\vbox\win7_32clone\win7_32clone.vdi --resize 30720

実行!

0%...10%...20%...30%...40%...50%...60%...70%...80%...90%...100%

すぐ終わった。これでいいのか?

VirtualBoxの管理画面で見ると!増えてますね! f:id:devew:20190320170626j:plain

じゃあこれで完了、というわけではありません。 増やした分はWindows上では未使用な領域のままです。

仮想マシンを立ち上げましょう。 そしてコントロールパネルからディスクの管理を開きます。 f:id:devew:20190320170641j:plain

ボリュームの拡張を行います。 f:id:devew:20190320170655j:plain

これでディスク容量が増えました! f:id:devew:20190320170710j:plain

 

まとめ

仮想内のディスクを使うほどvdiファイルのファイルサイズは大きくなっていきます。 ディスク容量は後から増やせるが面倒くさいので仮想マシン作る段階で多めのディスク容量でスタートしたほうがいいでしょう。 100GBにしても実際のvdiファイルはもっと小さいので大丈夫です。 それでも仮想内のディスクが足りなくなったときは今回の方法で増やしましょう。