【NetOffice】Worksheet.UsedRangeプロパティから更に値の有無で絞り込むロジック組んでみた。(2)

  • 2012.12.01 Saturday
  • 22:50
JUGEMテーマ:コンピュータ

------------------------------------
追記
以下でロジックのチューニングを行いました。
【NetOffice】Worksheet.UsedRangeプロパティから更に値の有無で絞り込むロジック組んでみた。(3)
http://pro.art55.jp/?eid=1304133
以下で条件の不安を解消するロジックを組んでみました。
【NetOffice】Worksheet.UsedRangeプロパティから更に値の有無で絞り込むロジック組んでみた。(4)
http://pro.art55.jp/?eid=1304135

以下で条件の不安を解消するロジックを組んでみました。
【NetOffice】Worksheet.UsedRangeプロパティから更に値の有無で絞り込むロジック組んでみた。(4)
http://pro.art55.jp/?eid=1304135
------------------------------------

Source and Project

「【NetOffice】Worksheet.UsedRangeプロパティから更に値の有無で絞り込むロジック組んでみた。」
http://pro.art55.jp/?eid=1304131
で、組んでみたロジックが無駄な部分が多いと思ったので改善してみました。

もともとのロジックは、



ロジックを文章にすると

1.最上部の列から下方向に検索して、値が存在する行の最上部を取得する
2.最下部の列から上方向に検索して、値が存在する行の最下部を取得する
3.最左部の行から右方向に検索して、値が存在する行の最左部を取得する
4.最上部の行から左方向に検索して、値が存在する行の最右部を取得する
5.1,2,3,4で得た範囲をRangeで返す。

というものですが、1の処理を実行した時点で2,3は分かってしまうことは明白です。

絵にするとこんな感じ。


文章にすると

1.最上部の列から下方向に検索し、値が存在する列に対して、終端になる行と列を取得する。
2.1の結果から、値が存在する行の最上部を取得する。
3.1の結果から左方向から、行の最左部を取得する。
4.1の結果から右方向から、行の最右部を取得する。
5.1の結果から値が存在する列に対して、値が存在する最下部を取得する。

using System.Collections.Generic;
using System.Linq;
using NetOffice.ExcelApi;
using NetOffice.ExcelApi.Enums;
namespace Art55.NetOfficeDemo20121201_002
{
    public static class WorksheetUtils
    {
        public static Range GetHasContentUsedRange(this Worksheet sheet)
        {
            Range usedRange = sheet.UsedRange;
            int usedRangeTailIndex = usedRange.Row + usedRange.Rows.Count - 1;
            List<ValueInfo> topColumnValueInfos = usedRange
                .Rows
                .First()
                .Columns
                .Select(cell => cell.Value2 != null
                                    ? ValueInfo.CreateValueInfo(cell)
                                    : ValueInfo.CreateValueInfo(cell.End(XlDirection.xlDown)))
                .Where(info => info.RowIndex <= usedRangeTailIndex)
                .ToList();
            if (topColumnValueInfos.Count == 0)
            {
                return null;
            }
            int top = topColumnValueInfos.Min(info => info.RowIndex);
            int left = topColumnValueInfos.First().ColumnIndex;
            int right = topColumnValueInfos.Last().ColumnIndex;
            int tail = topColumnValueInfos
                .Select(info => sheet.Cells[usedRangeTailIndex, info.ColumnIndex])
                .Select(cell => cell.Value2 != null
                                    ? cell.Row
                                    : cell.End(XlDirection.xlUp).Row)
                .Max();
            return sheet.Range(sheet.Cells[top, left], sheet.Cells[tail, right]);
        }
        struct ValueInfo
        {
            public int RowIndex { get; private set; }
            public int ColumnIndex { get; private set; }
            public static ValueInfo CreateValueInfo(Range cell)
            {
                var valueInfo = new ValueInfo {RowIndex = cell.Row, ColumnIndex = cell.Column};
                return valueInfo;
            }
        }
    }
}



UsedRangeの範囲で上下左右の全ての行と列を全検索する処理よりもループの数が減っているのでおそらくは、効率が上がったかと思われます。時間測って測っていませんけど(笑)
ただし、これでもシートの全範囲を検索してしまうような自体になった場合は、短気な私では時間を計れないほど遅くなります。実際のアプリケーションでシートの全ての範囲を利用するようなケースというのは考えにくいので、上下限は仕様で決めておくというのも一つの手かもしれません。

ロジックは上下の判定を同時に行えば、さらに効率が上がりそうです。

Source and Project

--------------------------------------
(追記)
ふと、もっと効率の良い方法があることに気づいた・・・。


------------------------------------
追記
以下でロジックのチューニングを行いました。
【NetOffice】Worksheet.UsedRangeプロパティから更に値の有無で絞り込むロジック組んでみた。(3)
http://pro.art55.jp/?eid=1304133
以下で条件の不安を解消するロジックを組んでみました。
【NetOffice】Worksheet.UsedRangeプロパティから更に値の有無で絞り込むロジック組んでみた。(4)
http://pro.art55.jp/?eid=1304135

以下で条件の不安を解消するロジックを組んでみました。
【NetOffice】Worksheet.UsedRangeプロパティから更に値の有無で絞り込むロジック組んでみた。(4)
http://pro.art55.jp/?eid=1304135
------------------------------------
--------------------------------------
本投稿は、CodePlexで公開されているNetOfficeを利用していませんが、紹介します。
NetOffice - MS Office in .NET
http://netoffice.codeplex.com/

NetOffice関連の記事は下記にまとめています。
【NetOffice】【Excel】NetOfficeのまとめ
http://pro.art55.jp/?eid=1304102
--------------------------------------

コメント
コメントする








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

calendar

S M T W T F S
1234567
891011121314
15161718192021
22232425262728
2930     
<< April 2018 >>

あわせて読みたい

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

selected entries

categories

archives

recent comment

  • 【キーボード】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)
  • 【C#】Dictionaryの実装・データ構造・アルゴリズムを観察する。
    karuakun (01/16)
  • 【NetOffice】【Excel】死なないExcelプロセスをKillする。
    art55 (12/05)

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