印刷設定したExcelファイルを読み込んで、シートをコピーしてからExcelファイルに出力した場合、印刷設定の一部が欠落する
対象製品
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
【手順】
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
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