对包含带换行文本的合并单元格的行进行自动高度调整



使用ClosedXML库生成Excel文件时遇到以下问题:行包含带换行文本的合并单元格。

我不能责怪库,因为在尝试手动执行自动高度(双击行分隔符)时也会出现问题。

在移动时,WrapText+Merge&以Excel为中心。但我有一个技巧你可以做:

  1. 在同一行中,当您为Merge&居中+换行符单元格(例如:A1:C1),然后也在该行中设置另一个不使用Merge&居中,但使用WrapText(当然用于文本下线)
  2. 设置G1的宽度=A1的宽度:C1
  3. 为G1设置自动调整行高(因为Excel不允许像上面提到的A1:C1那样自动调整)
  4. 现在,让我们通过将文本颜色更改为白色来隐藏G1中的值。=>它将在G1上自动调整(换行文本+合并居中)A1:C1的行高

我为这个问题找到的解决方案如下:将合并单元格中的数据复制到工作表定义的打印区域之外的非合并列中,确保目标列的宽度非常接近合并列的宽度1,然后执行自动调整。

代码如下:

private Dictionary<int, IList<int>> _RowAutofitBufferToMergedColsMapping = new Dictionary<int, IList<int>>();
// tells the exporter what column to use as a buffer
public void RegisterAutofitMapping(int startCol, int stopCol, int bufferCol)
{
  var mergedCols = Enumerable.Range(startCol, stopCol - startCol + 1).ToList();
   if (_RowAutofitBufferToMergedColsMapping.ContainsKey(bufferCol))
      throw new ArgumentException(String.Format("Current worksheet already contains a mapping for buffer column {0}", bufferCol));
            _RowAutofitBufferToMergedColsMapping[bufferCol] = mergedCols;
            Worksheet.Column(bufferCol).Width = mergedCols.Sum(item => Worksheet.Column(item).Width + ColumnSeparatorWidth);
}
// performs row autofit 
public void RowAutofit(int rowNo, int startCol, int stopCol, bool merge = true)
{
   // finding mapping to use for autofit
   IList<int> vals = Enumerable.Range(startCol, stopCol - startCol + 1).ToList();
   String valsStr = String.Join(",", vals);
   var mappingKey = _RowAutofitBufferToMergedColsMapping.Keys.FirstOrDefault(key => vals.SequenceEqual(_RowAutofitBufferToMergedColsMapping[key]));
   if (mappingKey == 0)
      throw new ArgumentException(String.Format("Could not mapping for provided columns - {0}", valsStr));
   var range = Worksheet.Worksheet.Range(rowNo, startCol, rowNo, stopCol);
   if (merge)
      range.Merge();
    range.Style.Alignment.SetWrapText();
    if (copyStyles)
       ClosedXmlExporter.CopyStyles(this, this, rowNo, startCol, rowNo, mappingKey, CopyStyleOptions.CopyAll());
    var sourceValue = Worksheet.Cell(rowNo, startCol).Value;
    Worksheet.Cell(rowNo, mappingKey)
      .SetValue(sourceValue)
      .Style.Alignment.SetWrapText(true);
      Worksheet.Column(AutofitDummyCol).AdjustToContents(rowNo, rowNo);
}

灵感来自Excel技巧。

private void mergeCellAutoFit(Excel.Range range) //range had value
{
     range.HorizontalAlignment = 7;//format center across Selection
     range.WrapText = true;//set wrap text
     double dRowHeight = Convert.ToDouble(range.RowHeight);//get row heigth now
     range.MergeCells = true; //merge cell
     range.EntireRow.RowHeight = dRowHeight; //perfect row heigth
     range.HorizontalAlignment = 2; //align text left
}

最新更新