異なるSPREADのシート間でのコピーを行う方法が2種類あります。 一つはクリップボードを使う方法と、XML文字列を使う方法です。
■クリップボードを使う方法
コピー元のActiveSheetの「ClipboardCopy」メソッドを使うことで、指定された範囲のセルをクリップボードにコピーします。 その後、コピー先のActiveSheetの行・列の数を合わせておいて、「ClipboardPaste」メソッドで貼付を行います。 以下のソースでは、「Button1_Click」の処理です。
■XML文字列を使う方法
コピー元のシートを「GetObjectXml」メソッドにてシリアライズ化しXML文字列化します。 その後、コピー先のシートに「SetObjectXml」メソッドにてXML文字列を逆シリアライズ化してやります。 以下のソースでは、「Button2_Click」の処理です。
尚、ここではやっていませんが、数式を含むシートの場合には、シートの追加後にLoadFormulasメソッドを呼び出すことで数式が有効になるそうです。
下図は、プログラムが起動した時の表示です。
下図は、「Button2」をクリック後の表示です。「Button1」と「Button2」では若干結果が異なります。 「Button1」では行選択状態はコピーされず、左上のセルがアクティブになります。 「Button2」は行選択状態もコピーされる様です。
=====
2016/03/05:の時の情報
■クリップボードを使う方法
コピー元のActiveSheetの「ClipboardCopy」メソッドを使うことで、指定された範囲のセルをクリップボードにコピーします。 その後、コピー先のActiveSheetの行・列の数を合わせておいて、「ClipboardPaste」メソッドで貼付を行います。 以下のソースでは、「Button1_Click」の処理です。
■XML文字列を使う方法
コピー元のシートを「GetObjectXml」メソッドにてシリアライズ化しXML文字列化します。 その後、コピー先のシートに「SetObjectXml」メソッドにてXML文字列を逆シリアライズ化してやります。 以下のソースでは、「Button2_Click」の処理です。
尚、ここではやっていませんが、数式を含むシートの場合には、シートの追加後にLoadFormulasメソッドを呼び出すことで数式が有効になるそうです。
Imports FarPoint.Win.Spread
Public Class Form1
'フォームロード時にSPREADの初期化
Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
'SPREADの初期化
Call InitilayzeSpread(Me.FpSpread1)
Call InitilayzeSpread(Me.FpSpread2)
'一覧データ表示
Call Me.DisplayData()
End Sub
'SPREADの初期化
Private Sub InitilayzeSpread(ByVal spd As FpSpread)
'SPREADの設定
With spd
'スクロールバーの設定
.HorizontalScrollBarPolicy = ScrollBarPolicy.AsNeeded
.VerticalScrollBarPolicy = ScrollBarPolicy.AsNeeded
'分割ボックスの設定
.ColumnSplitBoxPolicy = SplitBoxPolicy.Never
.RowSplitBoxPolicy = SplitBoxPolicy.Never
'カーソル設定
.SetCursor(CursorType.Normal, Windows.Forms.Cursors.Arrow)
.SetCursor(CursorType.LockedCell, Windows.Forms.Cursors.Arrow)
'セルがアクティブ時に編集モードにしない
.EditModePermanent = False
'セルがアクティブ時に既存の内容を選択しない
.EditModeReplace = False
End With
'アクティブシートの設定
With spd.ActiveSheet
'選択状態
.SelectionStyle = SelectionStyles.SelectionRenderer
'編集モードの設定
.OperationMode = OperationMode.SingleSelect
'列のサイズ変更可、行のサイズ変更不可に設定する。
.Columns.Default.Resizable = True
.Rows.Default.Resizable = False
'SPREADのアクティブシートのカラム数を3に設定
.ColumnCount = 3
'SPREADの行クリア
.RowCount = 0
End With
End Sub
'一覧データ表示
Private Sub DisplayData()
'ソースが長くなるのでWith宣言
With Me.FpSpread1.ActiveSheet
'描画を停止させる
Me.FpSpread1.SuspendLayout()
'データの行数分の処理
For i As Integer = 0 To 999
'行数を増やす
.RowCount += 1
'各セルへのデータ設定
.SetText(i, 0, "A" & i.ToString("000"))
.SetText(i, 1, "B" & (i Mod 100).ToString("000")) '100で割った余り
.SetText(i, 2, "C" & (i Mod 10).ToString("000")) '10で割った余り
Next
End With
'描画を再開させる
Me.FpSpread1.ResumeLayout(True)
'先頭行を選択設定(1行目が選択色になる)
Me.FpSpread1.ActiveSheet.AddSelection(0, 0, 1, 1)
End Sub
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs)
Handles Button1.Click
'SPREAD1の全部をクリップボードにコピー
With Me.FpSpread1.ActiveSheet
.ClipboardCopy(New Model.CellRange(0, 0, .RowCount, .ColumnCount))
End With
'SPREAD2
With Me.FpSpread2.ActiveSheet
'SPREAD2の行列数を設定
.RowCount = Me.FpSpread1.ActiveSheet.RowCount
.ColumnCount = Me.FpSpread1.ActiveSheet.ColumnCount
'SPREAD2にペースト
.SetActiveCell(0, 0)
.ClipboardPaste(FarPoint.Win.Spread.ClipboardPasteOptions.All)
'SPREAD2の選択状態を解除
.ClearSelection()
End With
End Sub
Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs)
Handles Button2.Click
Dim pstrXML As String
'Sheet情報をxml形式で取得
pstrXML = FarPoint.Win.Serializer.GetObjectXml
(CType(Me.FpSpread1.ActiveSheet, FarPoint.Win.ISerializeSupport), "Sheet")
'取得した情報を設定
FarPoint.Win.Serializer.SetObjectXml
(CType(Me.FpSpread2.ActiveSheet, FarPoint.Win.ISerializeSupport), pstrXML, "Sheet")
End Sub
End Class
下図は、プログラムが起動した時の表示です。
下図は、「Button2」をクリック後の表示です。「Button1」と「Button2」では若干結果が異なります。 「Button1」では行選択状態はコピーされず、左上のセルがアクティブになります。 「Button2」は行選択状態もコピーされる様です。
=====
2016/03/05:の時の情報
PR
コメント