我正在开发一个以Excel xlsx格式生成输出文档的程序。我编写了这个功能,并且最初使用Excel Interop获得了预期的输出/结果,但是完成单个输出需要花费很长时间,因此我尝试使用OpenXML复制相同的功能(目前使用ClosedXML库来简化转换从Excel Interop,但我对任何其他库或方法开放......)
基本过程是打开模板文件(具有初始打印区域[A1:M27]并且已经设置并定义了打印设置),然后使用数据填充模板。第一行数据在单元格A11中开始,根据需要在其下方插入附加行。 (模板上还有一些位于此数据表下方的内容,因此插入的最后一行不是实际打印区域的底部。)
插入第二行数据后,我有一个函数可以检查给定单元格的值和位于其上方的单元格的值是否相同。如果是这样,那么它会检查以确保在合并它们之前没有任何分页符。
以下是相关代码的部分:
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除外)?
非常感谢任何帮助或建议。
修改/更新: 我设法找到了解决当前情况的方法,但是在插入第一个初始分页符后它不能很好地工作。
我拿了模板并逐渐增加行高,直到找到将任何行高增加一个额外点的点导致自动分页移位。我写了一个函数,在页面扩展之前总计行高,给我一个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
缺点是我需要对我使用的每个不同的输出模板使用此过程的变体,因为页面布局,缩放,页面方向等的差异,所以它不是一个非常实用的解决方案这一个具体的应用。此外,插入第一个分页符后似乎会出现一些“漂移”,并且分页符不再适合第三页插入Excel的自动分页符。
所以...仍在寻找更好的解决方案。