在EPPlus中自动调整合并单元格的行高

cmb*_*t87 9 c# excel epplus

我正在使用EPPlus和C#并试图自动调整/自动调整行的高度以适应显示带有文本换行的合并单元格的所有内容所需的高度.但无论我尝试什么,文本总是截断.由于我在各种工作表上使用各种文本大小重复此过程,因此我不想对行高进行硬编码(除了强制行的最小高度).如果可能的话,我想在EPPlus/C#中做到这一点.

单元格A2:E2合并,WrapText = true:

文本截断的单元格

在此输入图像描述

这是所需的Cell Height应该是什么样子

在此输入图像描述

这是我的相关简短C#代码

Int32 intToCol;
intToCol = 5;
eppWorksheet.Cells[2, 1, 2, intToCol].Merge = true;
eppWorksheet.Cells[2, 1].Style.WrapText = true; 
//Check if at the minimum height. If not, resize the row
if (eppWorksheet.Row(2).Height < 35.25)
{
    eppWorksheet.Row(2).Height = 35.25;
}
Run Code Online (Sandbox Code Playgroud)

我看过EPPlus中的Autofit行,除非我读错了,否则它似乎没有直接回答我的问题.

Ben*_*pka 23

这是可重用方法的解决方案.传入文本值,用于单元格的字体,合并列的总宽度,以及接收行高度.使用结果设置行高.

使用方法

eppWorksheet.Row(2).Height = MeasureTextHeight(cell.Value, cell.Style.Font, [enter the SUM of column widths A-E]);
Run Code Online (Sandbox Code Playgroud)

可重复使用的方法

    public double MeasureTextHeight(string text, ExcelFont font, int width)
    {
        if (string.IsNullOrEmpty(text)) return 0.0;
        var bitmap = new Bitmap(1, 1);
        var graphics = Graphics.FromImage(bitmap);

        var pixelWidth = Convert.ToInt32(width * 7.5);  //7.5 pixels per excel column width
        var drawingFont = new Font(font.Name, font.Size);
        var size = graphics.MeasureString(text, drawingFont, pixelWidth);

        //72 DPI and 96 points per inch.  Excel height in points with max of 409 per Excel requirements.
        return Math.Min(Convert.ToDouble(size.Height) * 72 / 96, 409);
    }
Run Code Online (Sandbox Code Playgroud)

  • 非常好的解决方案。请注意,您将需要处理“ Bitmap”和“ Graphics”对象。 (3认同)
  • 很棒的总体想法。一些可能对其他人有帮助的评论: - 每个 Excel 列宽度有 7.0017094 (7) 个像素。我认为您可能一直在尝试考虑行间距和格式?- 切换到 7 像素/列宽后,我发现了不错的结果:a) 乘以 `font.Size * 1.01` 和 b) 将 `StringFormat` 参数传递给 `MeasureString`,并使用 `FormatFlags = StringFormatFlags.MeasureTrailingSpaces` (2认同)
  • @Jedidja 感谢您发布建议。我编辑了我的帖子以反映它们。这些编辑已在我们的应用程序中进行了测试,并解决了我们遇到的问题! (2认同)