忍者ブログ

VB.NET-TIPS などプログラミングについて

VB.NETのTIPS(小技集)を中心に、Javascript、PHP その他のプログラミングについて少し役に立つ情報を発信します。いわゆる個人的な忘備録ですが、みなさんのお役に立てれば幸いです。

VB.NET:Spread(GrapeCity)シートのPDF出力と表示を行う方法
SPREADには、シートのそのままをPDFに出力する機能が備わっています。 「SheetView」クラスの「PrintInfo」のPDF出力の指示を行えば、「SheetView」の印刷メソッドでPDF出力ができます。

以下のソースですが、「Button1_Click」の前までは以前のソースを踏襲していまして、 単に単一行選択表示で1000行3カラムのテストデータを表示しています。

「Button1_Click」の中で、PDFファイルへの出力処理を行っています。 「ActiveSheet.PrintInfo」の「PrintToPdf」をTrueに設定し、「PdfFileName」にPDF出力ファイル名を設定しています。 その後、SPREADコントロールの「PrintSheet」メソッドで「ActiveSheet」の印刷処理を行います。

ここで注意点があります。「PrintSheet」メソッドの直後でのPDFファイルの表示処理がコメントになっていますが、 コメント部分を実行に戻して処理すると、「AcrobatReader」は起動するのですがPDFファイルが見つからないとエラーになります。 「PrintSheet」メソッドの直後ではタイミング的に、まだPDFファイルの出力が終了していないので、エラーになる様です。

そこで解決方法として、「PrintSheet」メソッドの終了時点で「AcrobatReader」を起動することになります。 ちょうど「PrintMessageBox」イベントがそれに当たります。引数の「e」の「BeginPrinting」が「False」になった時が 「PrintSheet」が終わったことを通知してくれますので、そのタイミングで「AcrobatReader」起動の関数をコールします。

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 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

    'PDF出力ボタン
    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs)
                Handles Button1.Click
        'アクティブシートをPDFとして出力
        Me.FpSpread1.ActiveSheet.PrintInfo.PrintToPdf = True
        'PDFファイル名
        Me.FpSpread1.ActiveSheet.PrintInfo.PdfFileName = "test.pdf"
        'アクティブシートをPDFとして印刷
        Me.FpSpread1.PrintSheet(Me.FpSpread1.ActiveSheet)
        ''PDF表示
        'Call DispPdf("test.pdf")
    End Sub

    Private Sub FpSpread1_PrintMessageBox(ByVal sender As Object,
                                          ByVal e As FarPoint.Win.Spread.PrintMessageBoxEventArgs)
                Handles FpSpread1.PrintMessageBox
        '印刷終了タイミングか??
        If e.BeginPrinting = False Then
            'PDF表示
            Call DispPdf("test.pdf")
        End If
    End Sub

    '拡張子PDFに関連付けられているAcrobatReader起動
    Private Sub DispPdf(ByVal strFileName As String)
        Dim pStartInfo As New ProcessStartInfo
        Dim p As New Process
        With pStartInfo
            .FileName = strFileName
            .CreateNoWindow = False
            .WindowStyle = ProcessWindowStyle.Normal
        End With
        'プロセスのStartInfoプロパティに設定
        p.StartInfo = pStartInfo
        If p.Start() = True Then
            'AcrobatReaderの終了を待つ
            p.WaitForExit()
        Else
            MsgBox("起動に失敗しました。")
        End If
    End Sub
End Class

下図は、プログラムが起動しした時の表示です。

下図は、「Button1」をクリックした時の表示です。



=====
2016/03/07:の時の情報











PR

コメント

コメントを書く