【NetOffice】Rangeを返すメソッド・プロパティをまとめてみた。

  • 2012.11.19 Monday
  • 03:18
JUGEMテーマ:コンピュータ

Source and Project

Excelのオートメーションの実装をする上で、必ず学習しなければならないのがセルの参照と操作だとおもうのですが、セルを参照する方法がやたらと多く、何がどこにあって、どういうセルを取得するのか、全体像が見えません。ということで、クラス間に点在するセルを参照するであろうメソッドやクラスをまとめてみることにしてみました。方法は簡単、ExcelApiをリフレクションを利用してRagenオブジェクトを返すメソッド・プロパティを収集するだけ、せっかくExcelもほんの少し扱えるようになったので、Excelに出力してみることにしてみます。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Reflection;
using NetOffice.ExcelApi;

namespace Art55.NetOfficeDemo20121119_001
{
    class Program
    {
        static void Main()
        {
            var rangeType = typeof (Range);
            var targetTypes = rangeType.Assembly
                                       .GetModules()
                                       .SelectMany(m => m.GetTypes())
                                       .Where(m => !m.IsInterface)
                                       .ToList();

            var methodList = targetTypes
                .SelectMany(t => t.GetMethods())
                .Where(m => m.IsPublic)
                .Where(m => m.ReturnParameter != null && m.ReturnParameter.ParameterType == rangeType)
                .Select(m => new Info { ReflectedType = m.ReflectedType, Name = m.Name, MemberType = m.MemberType })
                .Distinct();

            var propertyList = targetTypes
                .SelectMany(t => t.GetProperties())
                .Where(m => m.CanRead)
                .Where(m => m.PropertyType == rangeType)
                .Select(m => new Info {ReflectedType = m.ReflectedType, Name = m.Name, MemberType = m.MemberType})
                .Distinct();

            var valueSeq = methodList
                .Concat(propertyList)
                .GroupBy(m => m.ReflectedType)
                .SelectMany(m => m)
                .Select(
                    m => new object[]
                        {
                            m.ReflectedType.FullName,
                            m.Name,
                            (m.MemberType == MemberTypes.Method ? "メソッド" : "プロパティ")
                        })
                .SelectMany(o => o);

            object[,] values = new object[] { "クラス名", "メンバー名", "メンバータイプ" }
                .Concat(valueSeq)
                .ToMultiArrary(3);

            var application = new Application {Visible = true};
            Worksheet worksheet = application.Workbooks.Add().Worksheets.OfType<Worksheet>().First();
            Range top = worksheet.Cells.First();
            Range printRange = worksheet.Range(top, top.Cells[values.GetLength(0), values.GetLength(1)]);
            printRange.Value2 = values;

            printRange.Columns.EntireColumn.AutoFit();
        }

        struct Info
        {
            public Type ReflectedType { get; set; }
            public string Name { get; set; }
            public MemberTypes MemberType { get; set; }
        }
    }

        public static class Utils
    {
        public static IEnumerable<T[]> ToArrarySeq<T>(this IEnumerable<T> source, int count)
        {
            return source.ToGroupingSeq(
                (value, index) => index / count,
                seq => seq.ToArray());
        }

        public static IEnumerable<TGroup> ToGroupingSeq<T, TKey, TGroup>(this IEnumerable<T> source, Func<T, int, TKey> createKey, Func<IEnumerable<T>, TGroup> createInnerResult)
        {
            int rowIndex = 0;
            return source
                .GroupBy(value => createKey(value, rowIndex++))
                .Select(group => createInnerResult(group));
        }

        public static T[,] ToMultiArrary<T>(this IEnumerable<T> source, int count)
        {
            IEnumerable<T> enumerable = source as T[] ?? source.ToArray();
            return enumerable.ToMultiArrary(count, 0);
        }

        public static T[,] ToMultiArrary<T>(this IEnumerable<T> source, int count, int origin)
        {
            IEnumerable<T> seq = source as T[] ?? source.ToArray();
            var result = (T[,])Array.CreateInstance(
                typeof(T),
                new[] { seq.Count() / count + (seq.Count() % count == 0 ? 0 : 1), count },
                new[] { origin, origin });
            int index = 0;
            seq
                .ToList()
                .ForEach(value => result[index / count + origin, index++ % count + origin] = value);
            return result;
        }
    }
}

実行すると



思ったよりも量が少なく、すでに把握しているものの多いことが分かったので、「なんじゃこりゃ!?」みたいなのをちまちま落ち葉拾いしていけば、いいのかなっと思います。なんか分かったら、自分以外は周知の事実であろうと、ここに書きます。

あと、ひとつ感想なのですが、NetOfficeを使う前までは、この手の調べ物は知りたい情報をカンマ区切りの文字列でコンソールに出力させて、それをコピーしてExcelに貼り付けてとやっていたのですが、Excelに直接出力した方が、何度も作業するのであれば、こちらの方が効率がいいかなとおもいました。まあ、効率が上がる一番の要因はLinq to objectのおかげなんですが・・・。

Source and Project

 

コメント
管理者の承認待ちコメントです。
  • -
  • 2018/03/31 2:48 PM
コメントする








    
この記事のトラックバックURL
トラックバック

calendar

S M T W T F S
     12
3456789
10111213141516
17181920212223
24252627282930
31      
<< March 2024 >>

あわせて読みたい

あわせて読みたいブログパーツ

selected entries

categories

archives

recent comment

  • 【WPF】DataGridに編集可能なComboBoxを表示するには?
    art55 (07/16)
  • 【WPF】DataGridに編集可能なComboBoxを表示するには?
    arisa (07/16)
  • 【キーボード】6年前のRealForceを復活させることはできる!?その3
    art55 (05/22)
  • 【キーボード】6年前のRealForceを復活させることはできる!?その3
    分解大好き (05/18)
  • 【.NET Framework 4.5】 IListがIReadOnlyListを継承してない理由。
    art55 (02/04)
  • 【.NET Framework 4.5】 IListがIReadOnlyListを継承してない理由。
    Gen (02/04)
  • 【キーボード】RealForce が壊れて帰ってきた。
    art55 (04/29)
  • 【.NET Framework 4.5】 IListがIReadOnlyListを継承してない理由。
    art55 (02/23)
  • 【.NET Framework 4.5】 IListがIReadOnlyListを継承してない理由。
    かるあ (02/22)
  • 【C#】Dictionaryの実装・データ構造・アルゴリズムを観察する。
    art55 (01/16)

recent trackback

recommend

recommend

recommend

C#プログラマのための.NETアプリケーション最適化技法 (Programmer's SELECTION)
C#プログラマのための.NETアプリケーション最適化技法 (Programmer's SELECTION) (JUGEMレビュー »)
Sasha Goldshtein,Dima Zurbalev,Ido Flatow,サシャ・ゴルドシュタイン,ディマ・ズルバレフ,イド・フラトー

recommend

ろんりと集合
ろんりと集合 (JUGEMレビュー »)
中内 伸光
とてもわかりやすいです。

recommend

recommend

シャノン・ノイマン・ディジタル世界
シャノン・ノイマン・ディジタル世界 (JUGEMレビュー »)
市川 忠男
4章がリレーショナルデータベースな内容になってます。ページ数があまりありませんが、ポイントがものすごく的確にまとまっていて、感動します。

recommend

recommend

東プレ Realforce91UBK-S 静音キーボード 静電容量無接点方式 変荷重 ブラック NG01BS
東プレ Realforce91UBK-S 静音キーボード 静電容量無接点方式 変荷重 ブラック NG01BS (JUGEMレビュー »)

テンキーレス、静音のRealForce91UBK-S。スコスコ感がたまらなく気持ちいいです。家と会社で2台持ってます。

recommend

recommend

プログラミング.NET Framework 第4版 (プログラミングシリーズ)
プログラミング.NET Framework 第4版 (プログラミングシリーズ) (JUGEMレビュー »)
Jeffrey Richter
発売予定美 2013年10月10日。.NET Frameworkとお付き合いする人のバイブルですね。

recommend

recommend

キャット・シッターの君に。
キャット・シッターの君に。 (JUGEMレビュー »)
喜多嶋 隆
私のイラストレータデビュー本です。

recommend

Essential .NET ― 共通言語ランタイムの本質
Essential .NET ― 共通言語ランタイムの本質 (JUGEMレビュー »)
ドン・ボックス,クリス・セルズ,Don Box,Chris Sells,吉松 史彰

links

profile

search this site.

others

mobile

qrcode

powered

無料ブログ作成サービス JUGEM