1

我正在开发一个以 Excel xlsx 格式生成输出文档的程序。我最初使用 Excel Interop 编写了该功能并获得了预期的输出/结果,但是完成单个输出需要相当长的时间,因此我尝试使用 OpenXML 复制相同的功能(目前使用 ClosedXML 库来简化转换来自 Excel 互操作,但我对任何其他库或方法持开放态度......)

基本过程是打开模板文件(具有初始打印区域 [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 的自动分页符的位置。

所以......仍在寻找更好的解决方案。

4

0 回答 0