如何获取合并单元格在Excel中使用的行数,使用ClosedXml和C#

作为一个概述,我目前正在从我的数据库中导出数据,并将其导出到Excel工作表。

我已经使用ClosedXml格式化了一些单元格(即合并单元格等)在excel表格中,现在我很less遇到一个小问题,我现在可以解决这个问题。

我想用背景颜色填充单元格,但阻碍的是合并的单元格。 我无法为合并的单元格使用的行中的所有单元格着色。

在Excel中的当前输出是这样的:

这就是输出的一部分

我试过的解决scheme正确地填充了合并的单元格,但行中相邻的未合并单元格都没有填充背景颜色。

有人可以给我一个想法去解决这个问题吗?

这是我一直在努力的一个样本POC代码,

private static void ToExcel(System.Data.DataTable dataTable, HttpResponseBase response, string fileName) { using (XLWorkbook wb = new XLWorkbook()) { wb.CalculateMode = XLCalculateMode.Auto; var ws = wb.Worksheets.Add(dataTable, "OKR Quater Report"); ws.Tables.FirstOrDefault().ShowAutoFilter = false; var colRange = ws.Columns(); colRange.Style.Alignment.Horizontal = XLAlignmentHorizontalValues.Left; colRange.Style.Alignment.Vertical = XLAlignmentVerticalValues.Center; var headingCells = ws.Row(1).Cells(); headingCells.Style.Font.Bold = true; headingCells.Style.Fill.SetBackgroundColor(XLColor.AirForceBlue); headingCells.Style.Font.SetFontColor(XLColor.White); ws.SheetView.FreezeRows(1); ws.Column(3).Hide(); ws.Column(8).Hide(); for (int i = 2; i <= dataTable.Rows.Count + 1; i++) { for (int k = 1; k <= dataTable.Columns.Count - 4; k++) { if (ws.Column(k).IsHidden) { continue; } List<IXLCell> mergeRange = new List<IXLCell>(); int j = i; while (j <= dataTable.Rows.Count + 1) { if (ws.Column(k).Cell(j).Value.ToString().Equals(ws.Column(k).Cell(j + 1).Value.ToString()) && ws.Column(1).Cell(j).Value.ToString().Equals(ws.Column(1).Cell(j + 1).Value.ToString())) //&& ws.Column(5).Cell(j).Value.ToString().Equals(ws.Column(5).Cell(j + 1).Value.ToString()) { mergeRange.Add(ws.Column(k).Cell(j)); j++; } else { mergeRange.Add(ws.Column(k).Cell(j)); break; } } if (mergeRange != null && mergeRange.Count > 0) { ws.Range(mergeRange.First(), mergeRange.Last()).Merge(false); } } } //Converting All string in the attachement column to Hyperlinks for (int i = 2; i <= dataTable.Rows.Count + 1; i++) { if (!(ws.Column(10).Cell(i).Value.ToString().Equals(string.Empty))) { ws.Column(10).Cell(i).FormulaA1 = "=HYPERLINK" + ws.Column(10).Cell(i).Value.ToString(); } } //Writing datatable to Excel MemoryStream stream = GetStream(wb);// The method is defined below response.Clear(); response.Buffer = true; response.AddHeader("content-disposition", "attachment; filename=" + fileName + "_" + DateTime.Now.ToString() + ".xlsx;"); response.ContentType = "application/vnd.ms-excel"; response.BinaryWrite(stream.ToArray()); response.End(); } } 

您可以使用ws.MergedRanges获取工作表中所有已合并的单元格的列表。 要find包含给定单元格的合并范围,可以这样做: ws.MergedRanges.First(r => r.Contains("B4")) 。 将样式应用于您检索的整个范围。