我在使用 ClosedXML 库生成 Excel 文件时遇到了以下问题:包含合并单元格和换行文本的行。
我不能责怪图书馆,因为在尝试手动执行自动高度时也会发生问题(双击行分隔符)。
我在使用 ClosedXML 库生成 Excel 文件时遇到了以下问题:包含合并单元格和换行文本的行。
我不能责怪图书馆,因为在尝试手动执行自动高度时也会发生问题(双击行分隔符)。
在运动中,Excel 中的 WrapText + Merge&Center 没有自动调整行高的解决方案。但我有一个技巧可以做到:
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
}
我为这个问题找到的解决方案如下:将数据从工作表定义的打印区域之外的合并单元格复制到非合并列中,确保目标列的宽度非常接近合并列的宽度一和然后执行自动调整。
代码如下所示:
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 提示。