Как получить количество строк, используемых объединенными ячейками в Excel, используя ClosedXml и C#
В качестве обзора я в настоящее время экспортирую данные из моей базы данных и экспортирую их в таблицу Excel.
Я отформатировал некоторые ячейки (т.е. объединенные ячейки и т. Д.) В листе Excel с использованием ClosedXml, теперь я немного застрял с небольшой проблемой, которую я могу обойти на данный момент.
Я хочу заполнить ячейки цветом фона, но что мешает, так это объединенные ячейки. Я не могу закрасить все ячейки в строках, которые используются объединенными ячейками.
Текущий вывод в 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();
}
}
1 ответ
Ты можешь использовать ws.MergedRanges
чтобы получить список всех слитых ячеек на листе. Чтобы найти объединенный диапазон, который включает данную ячейку, вы можете сделать что-то вроде этого: ws.MergedRanges.First(r => r.Contains("B4"))
, Примените стиль ко всему диапазону, который вы получите.