Grapecity SpreadをExcel出力する件
先日よりGrapecity Spread For Winを使い始めて、今までDataGridView使ってシコシコやってたのをSpreadに置き換えたりなんかしてるわけだが…。
当然ながら(?)「Excelに書出したい!」という要望はやってくる。
前の記事にも書いたけど、標準のファンクションであるから楽勝! と思ってたんだが、ちょっといろいろ巧くいかない状況が続いた。
問題点は大きく2つ
①ヘッダーが保存されない。
②Excel出力したものを印刷しようとすると行列番号が出力されてしまう。
結果的にはどちらも大したことしなくてもできることだったのだが、そこにたどり着くまでが長かった…。
①ヘッダー保存
DBからデータ引っ張ってきて「客先」だの「客先コード」だのと表示させているのだが、Excel出力するとこのヘッダーなしで保存されてしまう。
SaveExcelのオプションでなんとかなるのだろうとは思うのだが、ネットで調べても答えが見つからない。
やむなく取った手段は力業。
一旦仮のスプレッドシートを作って、現状スプレッドシートからシート毎にコピー → シート毎にヘッダ作るのに必要な行追加してヘッダ部分をセルに複写
しかし、これだとAddUnboundRowsした行が巧く再現できてなかったりする。
まぁ、そこも力業でなんとか再現した上でSaveExcel。
これでヘッダーがセル上に再現されてExcel出力できた…と。
今のところの最終的な解決策としては…。
やっぱりSaveExcelのオプションでなんとかなることがわかりまして。
Dim fpSD1 AS FarPoint.Win.Spread.FpSpread=FpSpread1
fpSd1.SaveExcel(fileName, FarPoint.Excel.ExcelSaveFlags.SaveCustomColumnHeaders)
事前準備として、ヘッダに明示的に文字列を渡しておく必要あり。
つまり
For i As Integer = 0 To fpSd1.ActiveSheet.ColumnCount - 1
fpSd1.ActiveSheet.ColumnHeader.Cells(0, i).Value = fpSd1.ActiveSheet.Columns(i).Label
Next
としておく。
これでOK。
なんと間抜けなことをしていたのやら…。
注意事項としてはこのオプション、SaveBothCustomRowAndColumnHeadersというのもありまして、まぁ、行ヘッダのみ、列ヘッダのみ、どちらもを選べるようになっているわけで、行ヘッダが不要な場合は上記のように列ヘッダのみ書出のオプションを選んでやらないと、シートの左端に余計な空白列ができてしまうこと。
②Excel出力したものを印刷しようとすると行列番号が一緒に印刷されてしまう件
こんな感じ…。
Excelのページ設定で「シート」タブ内の「印刷」「行列番号」のチェックを外してやれば解決なので、「印刷前にはチェック外してね」と情けないことを伝えていたのだが…。
正直この不細工な状況だと、OpenXML使ってExcel出力してるほうが数倍精神的には健康的かとも思ったり。
Grapecityのサイトでは「Excel出力前に印刷設定してやればよい」旨書いてあるので、そこに書かれていたとおり(言うてもSpread for Windows Forms 5.0Jの情報だが…)、
Dim pi As FarPoint.Win.Spread.PrintInfo = New FarPoint.Win.Spread.PrintInfo
pi.ShowRowHeader = False
pi.ShowColumnHeader = False
pi.ShowGrid = False
For Each sh As FarPoint.Win.Spread.SheetView In fpSd1.Sheets
sh.PrintInfo = pi
Next
とやるのだが、どうにも行列番号が印刷されてしまう。
しかし、ShowGridオプションはしっかり効いているようで、Falseだと罫線印刷はなくなる。…ってことは、指定するべきオプションが違ってるのか、或いは値の渡し方が間違っているのか?
結論としては…。
Grapecityのサイト、ナレッジベース内PowerTools Spread for Windows8.0Jの印刷オプションの解説を参考にして、
Dim pi As FarPoint.Win.Spread.PrintInfo = New FarPoint.Win.Spread.PrintInfo
pi.ShowRowHeader = FarPoint.Win.Spread.PrintHeader.Hide
pi.ShowColumnHeader = FarPoint.Win.Spread.PrintHeader.Hide
pi.ShowGrid = False
For Each sh As FarPoint.Win.Spread.SheetView In fpSd1.Sheets
sh.PrintInfo = pi
Next
で無事解決。
いちいち言い訳がましく「チェック外してね」などと言わなくてもよいようになりました。
うーん。Grapecityのツールにはしっかりそれなりのボリュームのドキュメントがついているのだけれども、痒いところに手が届かないというか。
使用者が少ないのか、ネット上でも情報が少ないし、あってもバージョンが違うとか、他のツールのものだったりだとか、サクッと的中する感じがないのですよね。
もっと使用者増えて情報量増えてきたら、もっとハードル低くなると思うのだけれども。