出力ドキュメントを Excel xlsx 形式で生成するプログラムに取り組んでいます。私は機能を作成し、当初は Excel Interop を使用して期待される出力/結果を得ていましたが、単一の出力を完了するのにかなりの時間がかかっていたため、OpenXML を使用して同じ機能を複製しようとしています (現在、変換を簡素化するために ClosedXML ライブラリを使用しています)。 Excel Interop からですが、私は他のライブラリやメソッドを受け入れています...)
基本的なプロセスは、テンプレート ファイル (最初の印刷領域 [A1:M27] があり、印刷設定が既にセットアップおよび定義されている) を開いてから、テンプレートにデータを入力することです。データの最初の行はセル A11 から始まり、必要に応じてこの下に追加の行が挿入されます。(このデータ テーブルの下にあるテンプレートには追加のものがあるため、挿入される最後の行は実際の印刷領域の下部ではありません。)
2行目のデータを挿入した後、指定されたセルの値とそのすぐ上にあるセルの値が同じかどうかをチェックする関数があります。その場合は、マージする前に改ページがないことを確認します。
関連するコードのセクションは次のとおりです。
For Each HBreak In outputSheet.PageSetup.RowBreaks
If HBreak = FirstCell.CellAbove.WorksheetRow.RowNumber Then Exit Sub
Next HBreak
ただし、出力を生成すると、改ページを越えてセルをマージすることになります。コードをステップ実行したところ、常にoutputSheet.PageSetup.RowBreaks空であることがわかりました...それでも、出力ファイルを Excel で開くと、結合されたセルの途中で自動改ページが行われます。
テストを行い、データ行がテンプレートに挿入される場所に水平改ページを挿入して、手動で配置された改ページが正しく検出されるかどうかを確認し、改ページのチェックが意図したとおりに機能するかどうかを確認しました...ただし、手動で挿入されたブレーク。
したがって、私の問題は、既存の印刷とページ設定に基づいて自動的に決定される改ページの場所にあるようです。
自動改ページが OpenXML (またはExcel Interop 以外のもの)で どこにあるかを判断することは可能ですか?
ヘルプやアドバイスをいただければ幸いです。
編集/更新: 現在の状況でこれを回避する方法を考え出すことができましたが、最初の最初の改ページを挿入した後はうまく機能しません。
テンプレートを使用して、行の高さを 1 ポイント増やすと自動改ページがシフトするポイントが見つかるまで、行の高さを段階的に増やしました。その改ページの前の行の高さを合計して の値を与える関数を書きました943。
次に、改ページをチェックする前に、次のプロシージャを呼び出します。
Private Sub InsertPageBreaks(outputSheet As IXLWorksheet)
Dim TotalHeight As Double = 0
Dim PageBreakHeight As Double = 943.5 ' Worksheet/Page Layout-specific value
' Reset/clear all of the horizontal row breaks
outputSheet.PageSetup.RowBreaks.Clear()
For x = 1 To (outputSheet.LastRowUsed(True).RowNumber)
TotalHeight += outputSheet.Row(x).Height
If TotalHeight > PageBreakHeight Then
' If the total height exceeds the page break point, insert a new
' new page break at this point and then reset TotalHeight
outputSheet.PageSetup.AddHorizontalPageBreak(x - 1)
TotalHeight = 0
End If
Next x
End Sub
欠点は、ページ レイアウト、スケーリング、ページの向きなどの違いにより、使用するさまざまな出力テンプレートごとにこの手順のバリエーションを使用する必要があることです。応用。さらに、最初の改ページが挿入された後に発生する「ドリフト」が少しあるように見え、3 ページ目までに Excel の自動改ページが挿入される場所に改ページが収まりません。
だから...まだより良い解決策を探しています。