印刷設定したExcelファイルを読み込んで、シートをコピーしてからExcelファイルに出力した場合、印刷設定の一部が欠落する

文書番号 : 37657     文書種別 : 不具合     登録日 : 2014/10/28     最終更新日 : 2014/12/15
文書を印刷する
対象製品
SPREAD for Windows Forms 7.0J
状況
修正済み
詳細
「印刷範囲」「印刷タイトル」が設定されたExcelファイルをインポートしてからシートをコピーした場合、コピーしたシートの「印刷範囲」「印刷タイトル」の設定がExcelファイルにエクスポートされません。

【手順】
1.新規フォームにSPREADとButtonを配置します
2.下記サンプルコードをコピーし、アプリケーションを実行します
3.ButtonをクリックしてエクスポートされたExcelファイルを開きます
  --「印刷範囲」「印刷タイトル」の設定がエクスポートされません

【サンプルコード】
  Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
    ' Excelファイルをインポート
    FpSpread1.OpenExcel("..¥..¥Book1.xlsx")

    ' シートのコピー
    Dim NewSheet As New FarPoint.Win.Spread.SheetView
    NewSheet = FarPoint.Win.Serializer.LoadObjectXml(GetType(FarPoint.Win.Spread.SheetView), FarPoint.Win.Serializer.GetObjectXml(FpSpread1.Sheets(0), "temp"), "temp")
    NewSheet.SheetName = "NewSheet"
    FpSpread1.Sheets.Add(NewSheet)
    FpSpread1.LoadFormulas(False)

    ' Excelファイルにエクスポート
    FpSpread1.SaveExcel("..¥..¥test.xlsx", FarPoint.Excel.ExcelSaveFlags.UseOOXMLFormat)
  End Sub
回避方法
Service Pack 4(v7.0.2016.2008)で修正済み。
Service Pack 4(v7.0.2016.2008)より前のバージョンでは次の回避方法が有効です。
------------------------------------------

以下のサンプルコードのように、シートのコピー後にPrintInfoを修正してからExcelファイルにエクスポートします。

【サンプルコード】
  Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
    ' Excelファイルをインポート
    FpSpread1.OpenExcel("..¥..¥Book1.xlsx")

    ' シートのコピー
    Dim NewSheet As New FarPoint.Win.Spread.SheetView
    NewSheet = FarPoint.Win.Serializer.LoadObjectXml(GetType(FarPoint.Win.Spread.SheetView), FarPoint.Win.Serializer.GetObjectXml(FpSpread1.Sheets(0), "temp"), "temp")
    NewSheet.SheetName = "CopySheet"
    FpSpread1.Sheets.Add(NewSheet)
    FpSpread1.LoadFormulas(False)

    ' PrintInfoを修正
    CorrectSheetPrintInfo(NewSheet, "Print_Area")
    CorrectSheetPrintInfo(NewSheet, "Print_Titles")

    ' Excelファイルにエクスポート
    FpSpread1.SaveExcel("..¥..¥test.xlsx", FarPoint.Excel.ExcelSaveFlags.UseOOXMLFormat)
  End Sub

  Private Sub CorrectSheetPrintInfo(ByVal sheet As FarPoint.Win.Spread.SheetView, ByVal customName As String)
    Dim exp As FarPoint.CalcEngine.Expression = sheet.GetCustomName(customName, True)
    If exp IsNot Nothing AndAlso CorrectPrintInfoSource(sheet.Models.Data, exp) IsNot Nothing Then
      sheet.RemoveCustomName(customName, True)
      exp = CorrectPrintInfoSource(sheet.Models.Data, exp)
      sheet.AddCustomName(customName, exp, True, customName)
    End If
  End Sub

  Private Function CorrectPrintInfoSource(ByVal source As Object, ByVal exp As FarPoint.CalcEngine.Expression) As FarPoint.CalcEngine.Expression
    If TypeOf exp Is FarPoint.CalcEngine.ExternalRangeExpression Then
      Dim erExp As FarPoint.CalcEngine.ExternalRangeExpression = DirectCast(exp, FarPoint.CalcEngine.ExternalRangeExpression)
      Return New FarPoint.CalcEngine.ExternalRangeExpression(source, erExp.Row, erExp.Column, erExp.RowCount, erExp.ColumnCount, erExp.RowRelative, erExp.ColumnRelative)
    ElseIf TypeOf exp Is FarPoint.CalcEngine.BinaryOperatorExpression Then
      Dim boExp As FarPoint.CalcEngine.BinaryOperatorExpression = DirectCast(exp, FarPoint.CalcEngine.BinaryOperatorExpression)
      Dim arg0 As FarPoint.CalcEngine.Expression = CorrectPrintInfoSource(source, boExp.Arg0)
      Dim arg1 As FarPoint.CalcEngine.Expression = CorrectPrintInfoSource(source, boExp.Arg1)
      Return New FarPoint.CalcEngine.BinaryOperatorExpression(boExp.Operator, arg0, arg1)
    Else
      Return exp
    End If
  End Function