【问题标题】:Autofit Row Height of Merged Cell in EPPlusEPPlus中合并单元格的自动调整行高
【发布时间】:2017-01-13 16:32:44
【问题描述】:

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

将单元格 A2:E2 合并并且 WrapText = true:

文本被截断的单元格

这是所需单元格高度的样子

这是我的相关且简短的 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;
}

我查看了Autofit rows in EPPlus,它似乎没有直接回答我的问题,除非我读错了。

【问题讨论】:

标签: c# excel epplus


【解决方案1】:

这是一种可重用方法中的解决方案。传入文本值、用于单元格的字体、合并列的总宽度,并接收回行高。用结果设置行高。

使用方法

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

可重用方法

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

        var pixelWidth = Convert.ToInt32(width * 7);  //7 pixels per excel column width
        var fontSize = font.Size * 1.01f;
        var drawingFont = new Font(font.Name, fontSize);
        var size = graphics.MeasureString(text, drawingFont, pixelWidth, new StringFormat { FormatFlags = StringFormatFlags.MeasureTrailingSpaces });

        //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);
    }

【讨论】:

  • 非常好的解决方案。请注意,您将需要处理 BitmapGraphics 对象。
  • 很好的解决方案。它在锡上说了什么。干杯伙伴。
  • 它应该是 / 0.75 而不是 * 用于将点转换为像素。 var pixelWidth = Convert.ToInt32(width / 7.5)
  • 伟大的总体思路。一些可能对其他人有所帮助的 cmets: - 每个 excel 列宽有 7.0017094 (7) 个像素。我想您可能一直在尝试考虑行距和格式? - 切换到 7 像素/列宽后,我通过以下方式发现了不错的结果:a) 将 font.Size * 1.01 和 b) 将 StringFormat 参数传递给 MeasureStringFormatFlags = StringFormatFlags.MeasureTrailingSpaces
  • @Jedidja 感谢您发布建议。我编辑了我的帖子以反映它们。这些修改已在我们的应用程序中进行了测试,并解决了我们看到的问题!
【解决方案2】:

我为此使用了一种解决方法,并且我有一个打印区域 A:Q。

  1. 我将合并的单元格值复制到 z 列。
  2. 设置 z 列的宽度以合并单元格宽度。
  3. 然后在格式中设置自动行高为真。
  4. 隐藏 z 列。
  5. 设置打印区域A:Q

缺点: 有重复数据。但是我们没关系,因为报告正在打印而不是打印 z 列。

优点: 行高工作正常,不像计算方法。

【讨论】:

    【解决方案3】:

    必须通过删除返回行的乘法因子来稍微调整代码。可能是因为我正在使用此代码来获取列的宽度。

    ws1.Column(colIndx).Width * 7
    

    乘数是合并的列数。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-09-04
      • 2023-01-31
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多