2017-10-17 34 views
2
因为Excel忽略合并单元格时,自动调整一个行跨行合并单元格

文本被切断。OfficeOpenXML Excel中调整行与细胞穿过它们合并

我如何可以调整单元格的高度,以它的内容为调整为不工作行?

我张贴了这一点,在那里帮助其他人有这个问题。我发布了一个解决方案作为答案。

+0

@TomBlodget感谢。编辑使这更容易阅读。 –

回答

2

对于这个解决方案,我只是显示了关于调整不显示数据

行代码

解决方案:

/// 
/// Merged Row Model Psuedo Code 
/// 
MergedRow { 
    // Fields merged across rows 
    ... 
    // list of rows with non merged data 
    list<indvidulerow> data 
} 

/// 
/// Code to find rows with merged cells. 
/// 

... // worksheet prep 
var mergedRows = new Dictionary<int, MergedRow>(); 
... // begin generating rows 
... 
// code generating the first merged cell of a row 
using (var r = sheet.Cells[rowIndex, 1, rowIndex+ mergedRow.Data.Count - 1, 1]){ 
if(mergedRow.Data.count>1){ 
    r.Merge=true; 
    mergedRows.Add(rowIndex, mergedRow); 
} 
... // code for remainder of of cell 


/// 
/// Code to Resize Rows. Making last row expand enough to see 
/// all content in merged cells 
/// 

foreach (var firstRowIndex in mergedRows.Keys){ 
    var numRowsMerged = mergedRows[firstRowIndex].Data.Count; 
    var columnHeights = new List<ColumnHeightCalcModel>(); 
    for (var colIndex = 0; colIndex < totalColumns; colIndex++){ 
     var calcModel = new ColumnHeightCalcModel(); 
     var combinedHeight = 0.0; 
     var lastRowHeight = 0.0; 
     for (rowIndex = 0; rowIndex < numRowsMerged; rowIndex++){ 
      var cell = sheet.Cells[firstRowIndex + rowIndex, colIndex + 1]; 
      var cellText = cell.Text; 
      var cellmerged = cell.Merge; 
      var cellWidth = sheet.Column(colIndex+1).Width; 
      var font = cell.Style.Font; 
      if (string.IsNullOrEmpty(cellText)) combinedHeight += 0.0; 
      var bitmap =new Bitmap(1,1); 
      var graphics = Graphics.FromImage(bitmap); 
      var pixelWidth = Convert.ToInt32(cellWidth * 6.0); //6.0 pixels per excel column width 
      var drawingFont = new Font(font.Name, font.Size); 
      var size = graphics.MeasureString(cellText, drawingFont, pixelWidth); 

      //72 DPI and 96 points per inch. Excel height in points with max of 409 per Excel requirements. 
      combinedHeight += Math.Min(Convert.ToDouble(size.Height) * 72/96, 409); 
      if (cellmerged) break; 
      lastRowHeight = Math.Min(Convert.ToDouble(size.Height) * 72/96, 409);       
     } 
     calcModel.TotalCombinedHeight = combinedHeight; 
     calcModel.LastRowHeight = lastRowHeight; 
     columnHeights.Add(calcModel); 
    } 
    var row = sheet.Row(firstRowIndex + numRowsMerged - 1); 
    row.CustomHeight = true; 
    var maxCombo = columnHeights.Max(col => col.TotalCombinedHeight); 
    var maxLast = columnHeights.Max(col => col.LastRowHeight); 
    row.Height = maxCombo - maxLast; 
} 

端到端解决方案

链接,帮我找到这个解决方案

以下链接适用于合并列,但它有助于合并行。

Autofit Row Height of Merged Cell in EPPlus