ClosedXMLつこうて感想メモ

①Row().Deleteする際はRow内各セルに関連する結合をすべて解除する

 

private static void RemoveMergedRangeInRow(IXLWorksheet sheet, int row)
{
    for (int j = 1; j <= sheet.LastColumnUsed().ColumnNumber(); j++)
    {
        var vvv = GetMergedRange(sheet, row, j);
        if (vvv != null)
        {
            sheet.MergedRanges.Remove(vvv);
        }
    }
}

private static IXLRange GetMergedRange(IXLWorksheet sheet, int row, int col)
{
    foreach (var ml in sheet.MergedRanges)
    {
        if (IsInRange(row, col, ml))
        {
            return ml;
        }
    }

    return null;
}

private static bool IsInRange(int row, int col, IXLRange ml)
{
    var ad = ml.RangeAddress;

    var r1 = ad.FirstAddress;
    var r2 = ad.LastAddress;

    var aaa1 = r1.RowNumber;
    var aaa2 = r2.RowNumber;

    var bbb1 = r1.ColumnNumber;
    var bbb2 = r2.ColumnNumber;

    return bbb1 <= col && col <= bbb2 && aaa1 <= row && row <= aaa2;
}

 

②Rows().Deleteメソッドが欲しいなぁ。

 上記①めんどくさいし。結合セル丸ごと含む行を一気に削除できれば楽。

ClosedXMLつこてみた。

あくまでメモ。

C#にてExcelファイルの読み込みをする必要が出てきたのでググったら

↓のようなページが引っかかった。(①)

qiita.com

 

ありがたいとばかりにClosedXML(②)をダウンロード&ビルド。

github.com

 

あとは自分のプロジェクトからビルドしたDLL(\obj\Debug\ClosedXML.dll)を参照するだけ。楽でええやん。

 

とりあえず①のサンプルコード(一列目のセル内容を取得するだけ)をやってみたが残念なことに読み込み部分で例外。

ダウンロードとビルドがおかしかったかと②にくっついてるxlsxファイルを通すとこれはOK。

 

デバグできるかなーと思ったがこれが驚くことに自分のプロジェクトからはDLL参照しているだけなのにClosedXML.dllの例外吐いてる部分が表示されるではないか

ソースがあってバグの発生箇所がわかる。平易なバグみたいなのでちびっと修正。

若干怪しい手持ちのxlsxファイルでもちゃんと読み込めるようになった。めでたしめでたし。

 

 

 

VB6のコメント消すプログラム作った 続き

細かいバグ修正しつつ、コメント跡地の広大な空白は邪魔ということで削除するよう手を入れた。

 

せっかくだし今風のプログラミングに慣れておきたくて「テストコード書いてプロダクトコード書いてコミット」の繰り返しでプログラムを成長させていこうと気合いれたが、テストコード書くのがだんだんめんどくさくなって崩壊orz

手持ちのVB6なソースを通してVB6でビルドかけてエラーでなけりゃOK、領域に突入である。

そんなんでもとりあえず動くからいいか。

github.com

 

 

 

 

VB6のコメント消すプログラム作った

実際に仕事で使用しているソースコードを通してコメント消したソースでEXEできる。

これでコメント消す前後のソースそれぞれビルドしてEXEをバイナリ比較して同じならOK・・・と思ったがVB6は同じソースでもEXE作るたびにバイナリレベルで異なるものを吐き出しやがるので、この確認方法が使えない。

とりあえず、ビルドが通っているのだから必要なメソッドは消えていないんでいいとしよう。

 

それはさておき、コメント消すプログラム自体のコードができたので自省する。

github.com

 

①フォームアプリケーションである必要はあったか?

 ・ファイル選択さえできればコンソールアプリケーションでもよかった

②メソッドの命名がちょっとアレ

 ・proc()だのDeleteComment2()だのひどいものだ。VS優秀だから後で修正しよ。

③Program.csにつらつらとメソッド書くのはどうかな?

 ・なんとなーくVSがデフォルトで作ったクラスに自分でメソッド足すのちょっと気分悪い。別クラスに動かすかな。

 

追記:あかんわー。ちょっと込み入ったコードにぶち込んだらバグでたー。もうちょっと考え直し。

VB6のコメントじゃまやー。

VB6のコメントを消すプログラムをC#で作ってるなう。

 

単純にシングルクォート(VB6ではコメントの意味。C#でいうところの//に相当)以降を削除するロジックでは以下の場合にNG

 

<NG例>

s = "---I'm a student.---"

s = "---I

<NG例終わり>

 

で、このNG例対策ができているかテストを書くとこんな感じ。

        [TestMethod]
        public void TestMethod3()
        {
            var actual = Program.DeleteComment("s = \"---I'm a student.---\"");
            var expected = "s = \"---I'm a student.---\"";
            Assert.AreEqual(expected, actual);
        }

 

これでいいのだけども、VB6のコードにわざわざダブルクォーテーションをエスケープするという手間がかかっている。手間をかけるとそこに間違いがないとは言い切れない。できることなら、VB6のコードをコピペで済ませたい。

・・・

そうだ、リソースを使おう。

f:id:turkey_pc:20161104120922p:plain

ここならVB6の生きたコードをそのままコピペできる。あとはユニットテストでこのリソースを拾えばOK。

        [TestMethod]
        public void TestMethod3()
        {
            var s = Properties.Resources.TestMethod3InputValue;

            var actual = Program.DeleteComment(s);
            var expected = Properties.Resources.TestMethod3ExpectedValue;

            Assert.AreEqual(expected, actual);
        }

 

ユニットテストの可読性?それは知らん(をい

 

コメント邪魔やー

【コメント】ソースコード中にある邪悪な文字列。

 

いや、たまには役に立つコメントもある。千のうち一つか二つぐらいは。ほとんどが邪悪すぎて生きてるコードの解読に支障をきたすことがしばしば。

 

<邪悪なコメントの例>

(言語はVB6)

a = 3 '昨日

'昨日 a = 7 '一昨日

’一昨日 a = 8 '先週

'先週 a = 9 '先月

'先月 a = 1 '去年

'去年 a = 999 '20世紀末

'20世紀末 a = 85

<邪悪なコメントの例 終わり>

 

改修履歴をコード上に残すためのコメント(以後、改修コメント)。改修を繰り返すたびにどんどん増えていき、ついには変数aを設定する処理と改修コメントだけで画面が埋まるということも。

 

これはさすがに困ったのでコメントを消すプログラムを作ってみようと思う。

車輪の再発明な気がするが、まぁいい。

 

 

 

 

 

アクションカメラ買った。

自転車動画撮ってみたくてこれ買ってみた

www2.elecom.co.jp

 

フルHDである。高解像度は正義なり。と思ったのは動画撮るまで。

実際撮ってみると2GBのSDカードが10分で終わりですぜ旦那(どこのダンナだよ)。解像度を落とせば撮影時間延ばせるんかなと思ったが、このカメラは以下の設定しかない

・1920*1080(25fps)

・1280*720(50fps)

フレームレートが連動で変わってるのがミソである。

これ素直に掛け算してみたら

・1920*1080*25=51840000

・1280*720*50=46080000

となって一秒あたり12.5%減。てことは撮影時間が12.5%延びて11分ちょっとという計算。うーん?気が向いたら実験してみよ。

 

まぁスペック的には32GBまで対応してるのでその気になれば160分ぐらいはいける。しかも32GBのclass10なんて1000円前後である。これは買うしか!

 

それはさておき、撮った10分動画だがカメラの取り付けが緩くてずっと空ばかり撮ってるでやんのwwwアクションカメラで初めて撮った動画が10分の空動画(「"から"どうが」ではなく「"そら"どうが」)かよorz

 

でも可能性感じた。いっぱい動画撮りたい。今度はメモリカード買ってもっと長時間のを撮ってやる!