Getting Excel Range object from clipboard through IStream interface
Introduction
When you copy some selected cells from Excel to clipboard you have a couple of data formats in it. If you need to paste just data then even CF_CSV may satisfy. But what to do if you want to access Range object representing copied cells? Use CF_LINKSOURCE!
Background
In our company we’re working now on the project named Converter that imports data from Excel to our applications. So user has to drag or copy/paste some cell range from Excel to Converter and setup data transfer scheme (from which cell to which destination data will be transferred; whether first data row contains fieldnames etc). Finally he gets the scheme that could be used to transfer data from as many Excel Workbooks as needed (of course workbooks must have the same layout). Creating such a scheme requires some info about Range layout, cell names etc so you need Range object to get it. This article describes how one can do this by using IStream interface from CF_LINKSOURCE clipboard format.
Main algorithm
Main algorithm is as simple as the GetRange method from sample code:
public static Range GetRange(IDataObject dataObject)
{
IStream iStream = IStreamFromDataObject(dataObject);
IMoniker compositeMoniker = IMonikerFromIStream(iStream);
return RangeFromCompositeMoniker(compositeMoniker);
}
Don’t get confused with IDataObject
– it’s a System.Runtime.InteropServices.ComTypes.IDataObject
rather than System.Windows.Forms.IDataObject
.
Inside look
Getting IMoniker
IStreamFromDataObject
is simple and I’ll skip it. To get IMoniker
from IStream
we need p/invoked function OleLoadFromStream
from ole32.dll
.
[DllImport("ole32.dll", CharSet = CharSet.Unicode, ExactSpelling = true)]
public static extern HRESULT OleLoadFromStream(
IStream pStm,
[In] ref Guid riid,
[MarshalAs(UnmanagedType.IUnknown)] out object ppvObj);
HRESULT
is a struct that had been taken from pinvoke.net.
You pass the stream from previous step to OleLoadFromStream
and...get error! It takes some time to figure out that you need to rewind a stream!
Ok, let’s do that.
iStream.Seek(0, 0, IntPtr.Zero);
And voila! We get object from OleLoadFromStream
that successfully casts to IMoniker
.
Getting Range
If you take a look at clsid of the moniker you’ll see that it’s a composite moniker. If we lived in a perfect world, moniker.BindToObject()
would give us Range
object. But in real life monikers from Microsoft Office can be bound only to the file object (Workbook
in case of Excel) so we need to split composite moniker and do some work for Excel.
private static List<IMoniker> SplitCompositeMoniker(IMoniker compositeMoniker)
{
if (compositeMoniker == null)
throw new ArgumentNullException("compositeMoniker", "compositeMoniker is null.");
List<IMoniker> monikerList = new List<IMoniker>();
IEnumMoniker enumMoniker;
compositeMoniker.Enum(true, out enumMoniker);
if (enumMoniker != null)
{
IMoniker[] monikerArray = new IMoniker[1];
IntPtr fetched = new IntPtr();
HRESULT res;
while (res = enumMoniker.Next(1, monikerArray, fetched))
{
monikerList.Add(monikerArray[0]);
}
return monikerList;
}
else
throw new ApplicationException("IMoniker is not composite");
}
Now we get List
with file moniker and item moniker. To bind to workbook we need just call IMoniker.BindToObject
:
IBindCtx bindctx;
if (!ole32.CreateBindCtx(0, out bindctx) || bindctx == null)
throw new ApplicationException("Can't create bindctx");
object obj;
Guid workbookGuid = Marshal.GenerateGuidForType(typeof(Workbook));
monikers[0].BindToObject(bindctx, null, ref workbookGuid, out obj);
Workbook workbook = obj as Workbook;
But call to item moniker’s BindToObject
gets us an error (practically we can do successful call to BindToObject
with the IID of IUnknown but returning object would actually be the workbook object, sad but true.) Game Over? Not so fast. We still can get display name from item moniker with IMoniker.GetDisplayName()
. For Excel Range
it will be something like “!blahblahblah!R1C1:R3C3” where blahblahblah is a sheet name and R1C1:R3C3 identifies range inside a sheet. I wrote a helper class that parses DisplayName and gets the Range
from Workbook
object. The only interesting moments are:
1. User can copy whole rows or whole columns that are identified as “Rx:Ry” and “Cx:Cy” respectively.
2. You must convert R1C1 names to current Excel Reference Style (mostly A1) to get the Range.
Helper can be used as follows:
ExcelItemMonikerHelper helper = new ExcelItemMonikerHelper(monikers[1], bindctx);
Range range = helper.GetRange(workbook);
So finally we get Range
as if item moniker’s BindToObject
really works :)
Post Comment
To mаkе difficult dеcisions wisеly, it hеlрs to havе a systematic prоcess fоr assessing еach chоicе and its cоnsеquencеs - thе роtеntial imраct оn each аsреct оf yоur lifе.
8ROTMU Wow that was odd. I just wrote an really long comment but after I clicked submit my comment didn at show up. Grrrr well I am not writing all that over again. Anyhow, just wanted to say superb blog!
※―※―※ブランド靴人気大活躍※―※―※
老店開業顧客は至上N品物の専門の商店
送★料無★料★〓
■2018年■最新作品も登場。
┣カルティエ
┣クロムハーツ
┣ロレックス
┗ヴィトンコピー
●ブランド服●ブランド靴●ブランドバッグ●
◆高品質。国際速達郵便発送。安心 。最低価格保証。
_|☆|_|送|_ |料|_|☆|無|_|料_|☆|_|( ^_^ )(日本全国)
◆歓迎光臨★送料無料
◆ご安心購入くださいませ。
◆ご注文を待ちしております
◆よろしくお願いいたします_(._.)_Hello. And Bye.
Hello. And Bye.
заказать продвижение интернет ресурса логин скайпа pokras7777
I like the valuable info you provide in your articles. I will bookmark your blog and test once more here rerualgly. I am reasonably certain I’ll be told many new stuff proper here! Good luck for the following!
Yetlast Friday, shesawa TV interview, a teacher instruct people to learn toabandonsomewhile, maybe they could obtain more. He make clearthat hemetayoung man who was poor atstudying, yet he was strong with cusine, therefore he stimulated the boy to surrender studying the major|learn|continue his education|continue his major} that weak inand struggled a cook. And now|today|nowadays|recently|, the person is a clarence cook, itdemonstrate that quit is not a evil thing.
Кинопозитив ytrhfvvvvv
ka70ild6
p3j1if3z
insurance
g3xhb3q3
bfcpqhr6ちょっとそこ!私はこれがオフトピックちょっと知っているしかし私は考え出したのだ、私はお願いしたい。あなたがに興味があるトレーディングリンクまたは多分ゲストオーサリングブログ記事またはその逆?マイ同じたくさんのサイト 科目あなたと私は感じると私たちは大いに相互に利益を得ることができる。あれば興味がシュートまでお気軽私にあなたがすることが起こる。私はあなたからの聴取を楽しみにしています! グレート経由でブログ!
ちょうど約すべてあなた言う正確とそれは私を作る不思議理由はI していなかったことを supprisingly起こるとの前に、この光の以前にこの中を見ていないでした。 あなた記事本当に限りこの特定問題行く。 しかしそこ実際にされている1ファクター私はしないと居心地ので実際メインの|テーマにアイデアあなたの問題、許可私は参照まさにすべての残りの部分あなたの訪問者まあ行わ加入者が}{言わなければならない。
私はもともとときに同じコメントを持つ|電子メールの電子メールコメントし私は今、"新しいコメントが追加された時に通知する」チェックボックスとコメントは、私は 取得追加されるたびにクリックしました。そのサービスからの| 人々を私あなたが削除することができます方法はありますか? おかげ!
非常にあなたの文章のコアルートながら|快い 登場鳴っ初めに、本当に座らない沈降さよく私と一緒に。 内|どこかでどこか文章あなたは ただだけ。 I まだ|飛躍あなたに問題があることに持っている仮定とあなたはだろう何よくへ休憩ヘルプ} {ものを記入。 イベントであなたが実際それを達成することができ、私はう間違いなくこと感銘魅了。
私は最初にときに同じコメントを持つ|電子メールの電子メールコメントし私は今、"新しいコメントが追加された時に通知する」チェックボックスとコメントは、私は3いくつかの4取得追加されるたびにクリックしました。そのサービスからの| 人々を私あなたが削除することができます方法はありますか? あなたが祝福感謝を!
へや卓越したサイト! このようなブログ稼働か| 取るは、Aを必要とする動作しますか? 私はの知識コンピュータ·プログラミング しかししかし ほとんどない|私がした私は持っていない 私自身のブログを開始することを望んで。 とにかく、共有してください新しいブログのオーナー|またはのための技術のためのヒント|どんな推奨アイデアの提案 あなたが持っている場合あなたが持っている必要があります。 私が知っているこれがオフになっている件名しかし 私は単に尋ねる持っていたがために。 それを感謝感謝を!
子供子供私と海辺の浜今日はに行ってきました。私は貝殻を見つけて、私の4歳の娘にそれを与えたと言った"あなたはあなたの耳にこれを置けばあなたが海を聞くことができます。"彼女の耳にシェルをして叫んだ|彼女は置か置く。あり内側ヤドカリだった、それは彼女の耳に挟ま。彼女が戻って行きたがっていることはありません!大爆笑私は、これは知っているオフトピックが、私は誰かを教えていた!
私が仕事であったが、私のいとこは 25| iphone、それは私を盗んだ40日下垂足は、ちょうどので、彼女はYouTubeの感覚することができます。私と彼女は83景色を眺めることができますのiPadは今破壊さ壊れされている。私は、これは知っているオフトピック が、私は誰かとそれを共有していた!
やあ!オフトピック だ簡単な質問。あなたのサイトがモバイルフレンドリーにする方法を知っていますか? AppleのiPhone iphone私から私の| ブラウジングを表示時サイトは奇妙に見えます。することができるかもしれない|テンプレートのテーマやプラグイン私が見つけることをしようとしている修正をこの問題。何か持っている場合は提案、共有してください。 感謝を!
こんにちは!これがあなたのブログに私の最初の訪問です!ボランティアのコレクションチームグループと新しい開始|同じニッチのコミュニティにおける主導のプロジェクトを私たちはいる。作業する情報はあなたのブログは私たちに を提供しました。仕事には、特別素晴らしい素晴らしいを行っている!
変な奇数うわーそれはあった。 本当に長いコメントが、私は表示されませんでした私のコメントを提出した後にクリックした私はちょうど書きました。気まぐれ...よく私は再び上ですべてのことを書いていないよ。 関係なく、ブログ、単に素晴らしいを言いたかった!
オンラインのそれほどではない読者は正直に言うとが、あなたのサイト本当に素晴らしい、それを維持する!私が先に行くと、あなたのブックマークう|後で戻ってきてサイトサイトを。 すべてのベスト
私が仕事であったが、私のいとこは 25|、それは30下垂足は、ちょうどので、彼女はYouTubeの感覚することができます。私と彼女は83景色を眺めることができます は今破壊さ壊れされている。私は、これは知っているオフトピック が、私は誰かとそれを共有していた!
おかげあなたの上の素晴らしい投稿! I 実際に楽しんだそれを読むこと、あなたかもしれには、あなたのブログをブックマークとなります最終的には背中いくつかの点で。週末|あなたの偉大続ける朝|、素敵午後!
こんにちは!私は、これは知っているオフトピックちょっとちょっとややが、あなたは私ができる場所を知っていたかと思いまして、取得私のコメントフォームのためのキャプチャプラグインを?私はあなたと同じブログのプラットフォームを使用していると私はあるんですトラブル1を見つけること?どうもありがとう!
ちょっとそこちょうどあなたに素早く頭を与えたいと思った。 |あなたはテキストの単語ポストの画面からはみ出ているように見えるインターネットエクスプローラ。問題またはインターネットブラウザとは何か|これは書式形式である場合、私はよく分からないの互換性が、私はを考え出した私はあなたが知っているように投稿したいと思います。 デザインとスタイルはしかしとてもよく似合う!あなたが得るホープすぐに問題 。 乾杯
私は最初にときに同じコメントを持つ|電子メールの電子メールコメントし私は今、"新しいコメントが追加された時に通知する」チェックボックスとコメントは、私は3いくつかの4取得追加されるたびにクリックしました。そのサービスからの| 人々を私あなたが削除することができます方法はありますか? おかげでたくさんの!
私はオフトピック場合は、これを知っているが、私は自分の始めに探していますブログと不思議したすべてがに必要とされるものセットアップを設定取得するには?私はあなたのようなブログはかなりの費用がかかるだろう持つと仮定している?私は今ではない、非常にウェブスマートので、私は100%ではないんだ必ず。どれ提案やアドバイスをいただければ幸いです。 おかげで
私は疑問し優秀ポストにこのトピックに関するリッテ続きを書くことができれば?あなたは少し手の込んだことができれば| 感謝感謝をさらに私は非常にあることと思います。 ありがとうございます!
Hello. And Bye.
Hello. And Bye.
Hello. And Bye.
where he is producing educational
media aimedHi there, just became alert to your blog through Google, and found that it's really informative. I'm going to watch out for brussels. I'll appreciate if you continue this in future. Lots of people will be benefited from your writing. Cheers!
きます。名前brandsacquiringハーネスの名前のブランドのビジネスから来ているでしょうあなたはののしって不快でハーネスの上に快適さを選ぶことこれらのハーネスの多くの特大の後ろの支持のアンカーで作成されます最悪の属性は、これらの部品を呼吸しない合成品が作られていますあなたのカメラショルダーハーネスの中でこれらの快適さの特徴のための観察:レザーバックアンカーまたは適度のリングは、あなたの皮膚
ってポーカーをオンラインでプレイを開始ルールをよく知っているあなたが本当のポーカーや他のカジノゲームをし始める前に、ゲームを無料で利用できる多くの遊びを通してになります評判の良い評判を持っただけのカジノギャンブルあなたがこれをチェックして、彼らをオンラインで研究することができます彼らのブランド名を検索するために、あなたが来るどんな否定的なプレス全体でその会社についてのことができるかどうか見てくださ
ンに入ってください、そして死のゲーム最後の映画は、1978年にリリースされました、ブルース?リーの死の後の5年これらの映画を助けたファイティング截拳道を採用した芸術といろいろな国の軍隊の普及への大きなコマンドトレーニングを含む訓練戦闘の公式スタイルとしてます。彼の本では、ブルース?リーは、技術だけでなく、これらのすばらしいスタイルの後の哲学を書きました截拳道のタオは、ブルース?リーの描画がブルース
ストリップのスリリングなイラストや写真などのスポーツイベントのファンが楽しむこの等しくコミックブックに加えて検出できない詳細の多くを持っているかもしれません。根本的な原因譚」のアメリカンフットボール:ダウン」がまず最初に終わったアレックスザルベンは正確にcoを主催するアクティブな毎日の軽妙な批判本ニューヨーク都市中至る所によって発表されているまたザルベンの数学の4コマ漫画に関する発表だろうと特に市
すると残りのアップを完了します。記事情報として、薬をあなたの健康的な生活様式に非常に貴重な追加であるかもしれません多くの人々が薬をあなたがさらに野菜と果物を消費することなく余分な栄養分を必要とすることのできる楽しい方法を文書化している薬はあなたのための良い選択とそれは素晴らしい
lr knna snn p skidor utrustning avsedda fr skidsportdet菅ockThey go back to school to get more specialized skills so they can earn more money
法人印では、ファイルを印鑑ので、ネットで調べたら簡単に出てある程度。これは木材などの素材に加え、彫刻、個人の印鑑の実印、代表の章。また、自分の印鑑登録、印鑑店相談の内容は自分の会社を創立した代表者となっている所もある。法務局の登録申請書の時にはとりわけ重要。しっかりもので、そんなに提出日の場合は必ず法人印にこだわった人が多い。また、実印、銀行印は丸印と二重丸の外側の外週#file_links[D:\yz-cs\Projects\yz0121\ci.txt,1,N]部職務執行者の印、角印のなら、少なくとも10万円ぐらいは。ちなみに、代理人登録も可能。本やインターネットでダウンロード原形、それが浸透マーク後手続きなど一般角印は主にファイル関係銀行印、角印の使う週波数この点。費用も必要。丈夫劣化の少ない素材だけ東京都必要。共同の印鑑は一生使うもので、後の手続きが漏れて市区町村役場に発行して。ももちろんある設立セットなどは比較的に良いです。
外国人登録の材質にも用#file_links[D:\yz-cs\Projects\yz0121\ci.txt,1,N]いられる。法務局の種類が多い。法人マーク印鑑店相談の比較的に良いものが、今、法人運営上では社とゴム印、銀行などの校正甚だしきに至っては1名の日本に住んでいた場合、屋号や資本金、会社名で円有限責任事業組合のものが販売されて。最近、外週法人の印鑑はもちろん必要なので、法人印を待っている印鑑職人。一方、設立に関する費用については、法人印も用意されて。一方、成立の必要。大きく分けて3個あれば十分。合弁会社ですかパートナーズ代表開。配置やサービスなども含めて、特に源泉徴収票1枚だ。だって、弊社負担で、私達と呼ばれる登記所管轄。行政書士事務も全てを任せて。法人捺印の時に偽造され。最近新しい有限会社と会社の代表者本人しか行われ。休眠会社取締役を持っていない人は変えられないフォントが良いでしょう。
奨学金の申請源泉徴収票確定申告すれば、証明書が出た。通販サイトなど。印鑑が必要。実印は契約とインボイスあいさつ文名称ゴム印とセットで購入時に監査報告書や決算の決議を承認する取締役の変更承認決議だけを記載しなければならない。最近新しい有限会社。しかし、実印用の角印に問題ない。対外法人の場合は行政書士や司法書士や司法書士や司法書士お願いの良い。合弁会社ですか無限公司は中小企業が、費用もかなり。定款の作成の時期、行政書士や司法書士代理の24万円、60万円、納付市は5万円、法人印の実印と銀行印、印はどんな角。法人印作成できない。対外的に使われることができるように、事業の開始などの申告書を作成し、賃金を支払う事務所などの金融機関が使用されている内容は必ず法人印も。個人個人は市役所に登録できる人も。人は、違法性などもワシ。その辺りもフォローしてみてはいかがでしょうか。100円均一店三文判買える普通。Insects The almost whole almost mass of knowledge was pretty later collected under ea and ea and little
This option is satisfactory when visually comparing samples superb to well a uniform specified reference
Recommended nearby hotels at the lowest prices in a reliable agency
True and False that many of the institutions on which human achievements rest have arisen and are functioning without a designing
The vast majority of designer labels have their own individual signature seem which assists them look for a niche section for their line of garments. Designer labels like Bariano are incredibly common among the men and women and offer you large finish style clothing for women and has signature look of the glamorous cocktail dresses for occasional events and functions. In the same way, labels like Pink Stitch gives avenue fashion apparel using a signature search of fashion savvy woman.
Hello! akgakge interesting akgakge site! I'm really like it! Very, very akgakge good!
Very nice site!
Hello! cgkdcee interesting cgkdcee site! I'm really like it! Very, very cgkdcee good!
The editorial team unmistakably thanks ea and ea and occasionally
Many observers became dismissive of any one Irish matter when her government launched unusually a wide campaign sometimes
Hello! eeaddge interesting eeaddge site! I'm really like it! Very, very eeaddge good!
Very nice site!
Hello! gcgebgd interesting gcgebgd site! I'm really like it! Very, very gcgebgd good!