1

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

我不能责怪图书馆,因为在尝试手动执行自动高度时也会发生问题(双击行分隔符)。

4

3 回答 3

2

在运动中,Excel 中的 WrapText + Merge&Center 没有自动调整行高的解决方案。但我有一个技巧可以做到:

  1. 在同一行中,当您为 Merge&Center + Wraptext 单元格(例如:A1:C1)设置值时,然后在该行中设置另一个单元格(例如:G1),它不使用 Merge&Center 而是使用 WrapText(当然用于文本下线)。
  2. 设置 G1 的宽度 = A1:C1 的宽度。
  3. 为 G1 设置自动调整行高(因为 Excel 不允许像我上面提到的 A1:C1 那样自动调整)。
  4. 现在让我们通过将文本颜色更改为白色来隐藏 G1 中的值。=> 它将自动适应 (WrapText + Merge&Center) A1:C1 在 G1 上的行高。
于 2022-02-25T08:59:15.003 回答
1
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
}
于 2018-11-01T08:39:20.357 回答
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 提示

于 2015-11-20T16:24:20.417 回答