【问题标题】:How do I get the number of rows used by the merged cells in Excel, using ClosedXml and C#如何使用 ClosedXml 和 C# 获取 Excel 中合并单元格使用的行数
【发布时间】:2017-01-17 06:02:18
【问题描述】:

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

我已经使用 ClosedXml 格式化了 Excel 工作表中的一些单元格(即合并的单元格等),现在我几乎没有遇到一个小问题,我现在可以解决这个问题。

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

excel中的当前输出有点像这样:

我尝试过的解决方案可以正确填充合并的单元格,但是该行中相邻的未合并单元格并没有全部填充背景色。

有人可以给我一个想法来解决这个障碍吗?

这是我一直在处理的示例 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();
        }
    }

【问题讨论】:

  • 能否分享代码,应用背景色后输出excel和预期输出excel?
  • @selvakumar 我已经编辑了问题并添加了我 POC 中的代码,输出 excel 如屏幕截图所示。

标签: c# asp.net excel closedxml


【解决方案1】:

您可以使用ws.MergedRanges 获取工作表上所有合并单元格的列表。要查找包含给定单元格的合并范围,您可以执行以下操作:ws.MergedRanges.First(r =&gt; r.Contains("B4"))。将样式应用于您检索的整个范围。

【讨论】:

  • Francois Botha:嗨,我知道 StackOverFlow 的礼仪,但我没有足够的声望点来标记答案。因此,评论说谢谢。 :)
猜你喜欢
  • 1970-01-01
  • 2013-02-18
  • 1970-01-01
  • 2010-10-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-02-12
  • 1970-01-01
相关资源
最近更新 更多