tagCANDY CGI VBレスキュー(花ちゃん) の Visual Basic 2010 用 掲示板(VB.NET 掲示板) [ツリー表示へ]   [Home]
一括表示(VB.NET VB2005)
タイトルDataGridViewのデータをEXCELファイルにコピー&ペーストする際
記事No9043
投稿日: 2009/05/30(Sat) 17:10
投稿者tito
いつもお世話になっております。
初めて書き込ませて頂きます。

・環境
VB2005
.NET FrameWork2.0
Windows XP

VB歴1年

・内容

DataGridViewを使ったWindowsアプリケーションを作成しています。

・動作と問題点

DataGridViewにてCtrl+Cキー押下の際にキーダウンイベントを作成し、選択されたセルをクリップボードに取得する。

    Private Sub DataGridView_KeyDown(ByVal sender As Object, _
        ByVal e As System.Windows.Forms.KeyEventArgs) Handles Me.KeyDown

        If (e.Modifiers And Keys.Control) = Keys.Control And e.KeyCode = Keys.C Then
            '選択されたセルをクリップボードにコピーする
            Clipboard.SetDataObject(sender.GetClipboardContent())

        End If
    End Sub

クリップボードに無事コピーでき、DataGridView内でしたらペーストも可能なのですが、
EXCELにペーストをする際に、2バイト文字(かなや漢字など)が文字化けをしてしまい、
これを解決したく思って書きこませて頂きました。

※EXCELについてはOffice 2003を使用しています。

宜しくお願い致します。

[ツリー表示へ]
タイトルRe: DataGridViewのデータをEXCELファイルにコピー&ペーストする際
記事No9044
投稿日: 2009/05/30(Sat) 17:36
投稿者Hongliang
DataFormats.Html 辺りのせいかな。
GetClipboardContent で取得した DataObject を直接 Clipboard にセットするのではなく、
別に DataObject を作成し、DataGridView から取得した DataObject のうち
DataFormats.Text、DataFormats.UnicodeText、DataFormats.CommaSeparatedValue
の 3 つを新しい DataObject に設定して Clipboard に設定したらどうでしょうか。
// CSV も微妙かも。

[ツリー表示へ]
タイトルRe^2: DataGridViewのデータをEXCELファイルにコピー&ペーストする際
記事No9045
投稿日: 2009/06/01(Mon) 10:48
投稿者tito
Hongliang様

お返事遅れ申し訳ありませんでした。

> GetClipboardContent で取得した DataObject を直接 Clipboard にセットするのではなく、
> 別に DataObject を作成し、DataGridView から取得した DataObject のうち
> DataFormats.Text、DataFormats.UnicodeText、DataFormats.CommaSeparatedValue
> の 3 つを新しい DataObject に設定して Clipboard に設定したらどうでしょうか。

DataObject関連について、あまり知識が無く、調べながら進めていました。
Hongliang様から提案して頂いた方法の実現として、以下を実行しました。

'DataObjectの生成
Dim myDataObject As New DataObject()

myDataObject.SetData(DataFormats.UnicodeText, False, sender.GetClipboardContent)
Clipboard.SetDataObject(myDataObject)

意図としては、クリップボードにデータを格納する際に、DataFormatを指定し入れてみてはどうか?というように解釈しましたが、どうもうまくいきません。認識に相違あるようでしたら、お手数ですが指摘頂ければと思います。

[ツリー表示へ]
タイトルRe^3: DataGridViewのデータをEXCELファイルにコピー&ペーストする際
記事No9046
投稿日: 2009/06/01(Mon) 14:00
投稿者Hongliang
DataObject は複数のデータをまとめてするコンテナで、
そのデータの形式を指す文字列と実際のデータがセットで構成されます。
GetClipboardContent で取得できる DataObject には、ヘルプの解説にあるとおり
4 つのデータが格納されています。

DataObject から特定のデータを取得するには、データの形式を指す文字列を指定して
GetData メソッドを呼び出します。形式はあらかじめ DataFormats クラスに
静的メンバとして用意されているのでそれを使用できます。

GetClipboardContent で取得した DataObject から新しい DataObject へ、
Text のデータを取得して Text として設定する。
UnicodeText のデータを取得して UnicodeText として設定する。
そんな感じでおわかりでしょうか。

[ツリー表示へ]
タイトルRe^4: DataGridViewのデータをEXCELファイルにコピー&ペーストする際
記事No9055
投稿日: 2009/06/04(Thu) 19:59
投稿者tito
お返事遅くなり大変申し訳ありませんでした。

> GetClipboardContent で取得した DataObject から新しい DataObject へ、
> Text のデータを取得して Text として設定する。
> UnicodeText のデータを取得して UnicodeText として設定する。
> そんな感じでおわかりでしょうか。

ご丁寧にありがとうございました!
ご教授頂いた方法で再度ソースを書いてみました。

Dim myDataObject As New DataObject()    '最終的にClipBordに代入するDataObject
Dim GridDataObject As New DataObject()  'DataGridViewから取得するDataObject

'GetClipboardContentでDataGridViewから取得
GridDataObject.SetData(sender.GetClipboardContent) '

'GridDataObjectからmyDataObjectへ、型を指定して代入
myDataObject.SetData(DataFormats.UnicodeText, True, GridDataObject.GetData(DataFormats.UnicodeText))
myDataObject.SetData(DataFormats.Text, True, GridDataObject.GetData(DataFormats.Text))
myDataObject.SetData(DataFormats.CommaSeparatedValue, True, GridDataObject.GetData(DataFormats.CommaSeparatedValue))
'myDataObjectをセット
Clipboard.SetDataObject(myDataObject)

このソースを用いてコピー処理を行いましたが、結果EXCELに貼り付ける際に、書式がHtmlに自動選択されてしまい、EXCELには表示されませんでした。

原因としてはっきりとした情報では無いのですが、他IT系情報サイトにて、
.NET FlameWorkが、キーイベント後にDataGridViewのセルをコピーしてしまうため、現時点で
DataGridViewからのキーイベントでのコピーは、スリープなどを使わなければ無理であるという記事をみたのですが、
もしそうだとしても回避方法など無いものでしょうか。

毎度のこと申し訳ありません。
ソースの意図等相違ありましたら、ご指摘頂ければ幸いです。

[ツリー表示へ]
タイトルRe^5: DataGridViewのデータをEXCELファイルにコピー&ペーストする際
記事No9057
投稿日: 2009/06/04(Thu) 21:12
投稿者Hongliang
> Dim myDataObject As New DataObject()    '最終的にClipBordに代入するDataObject
> Dim GridDataObject As New DataObject()  'DataGridViewから取得するDataObject
>
> 'GetClipboardContentでDataGridViewから取得
> GridDataObject.SetData(sender.GetClipboardContent) '

これだと、GridDataObject に GetClipboardContent で取得される DataObject そのものが
格納されてしまいます。
形式を指定せず SetData したものは(一部を除き)型名が形式文字列になりますから、
この GridDataObject は "System.Windows.Forms.DataObject" 形式のデータを持っている
だけということになります。
当然、GridDataObject.GetData(DataFormats.Text) とやっても、
GridDataObject には DataFormats.Text のデータが含まれないので Nothing が返るだけ。
結局 myDataObject には 3 つの中身が空の形式が SetData されているだけなので、
「貼り付け」られてもなにもできません。
では DataFormats.Text のデータを含んでいるのはというと、GetClipboardContent
で取得された DataObject です。これから GetData してください。
要するに、この GridDataObject なる変数は無用です。

> 原因としてはっきりとした情報では無いのですが、他IT系情報サイトにて、
> .NET Frameworkが、キーイベント後にDataGridViewのセルをコピーしてしまうため、
> 現時点で DataGridViewからのキーイベントでのコピーは、
> スリープなどを使わなければ無理である
こちらは、編集中のセルと GetClipboardContent で取得できるデータ間の問題でしょうか。
文脈が分からないので解説できません。
そのページを示していただければ説明できるかも知れません。
// 私の知識外の話だったら私にはどうしようもないですけど。

[ツリー表示へ]
タイトルRe^2: DataGridViewのデータをEXCELファイルにコピー&ペーストする際
記事No9061
投稿日: 2009/06/09(Tue) 21:06
投稿者れお
> DataFormats.Html 辺りのせいかな。
> GetClipboardContent で取得した DataObject を直接 Clipboard にセットするのではなく、
> 別に DataObject を作成し、DataGridView から取得した DataObject のうち
> DataFormats.Text、DataFormats.UnicodeText、DataFormats.CommaSeparatedValue
> の 3 つを新しい DataObject に設定して Clipboard に設定したらどうでしょうか。
> // CSV も微妙かも。

まぁ、アラシっぽい発言だが。
2005ってのは、2008に比べると、性能が、かなり低い。
2008に変えたほうが良いですよ。

[ツリー表示へ]
タイトルRe^3: DataGridViewのデータをEXCELファイルにコピー&ペーストする際
記事No9062
投稿日: 2009/06/09(Tue) 22:53
投稿者れ_お
> > DataFormats.Html 辺りのせいかな。
> > GetClipboardContent で取得した DataObject を直接 Clipboard にセットするのではなく、
> > 別に DataObject を作成し、DataGridView から取得した DataObject のうち
> > DataFormats.Text、DataFormats.UnicodeText、DataFormats.CommaSeparatedValue
> > の 3 つを新しい DataObject に設定して Clipboard に設定したらどうでしょうか。
> > // CSV も微妙かも。
>
> まぁ、アラシっぽい発言だが。
> 2005ってのは、2008に比べると、性能が、かなり低い。
> 2008に変えたほうが良いですよ。
復元掲示板とは?謎ですね。

[ツリー表示へ]