取消合并并清除 epplus 4.1 中的单元格

Unmerge and clear cells in epplus 4.1

我没有成功删除 excel 中的行,所以现在我尝试清除它们的内容,但仍然出现错误: "Can't delete/overwrite merged cells. A range is partly merged with the another merged range. A57788:J57788".

第 1-10 列确实已合并,但如何取消合并?

这是我的代码:

cntr = 0;
while (ws.Cells[RowNum + cntr, 1].Value == null || !ws.Cells[RowNum + cntr, 1].Value.ToString().StartsWith("Report generation date"))
{
    ws.Cells[RowNum + cntr, 1, RowNum + cntr, 18].Value = "";
    ws.Cells[RowNum + cntr, 1, RowNum + cntr, 10].Merge = false;
    for (int i = 1; i < 17; i++)
    {
        ws.Cells[RowNum + cntr, i].Style.Border.BorderAround(OfficeOpenXml.Style.ExcelBorderStyle.None);
        ws.Cells[RowNum + cntr, i].Clear();
    }
    cntr++;
}
//ws.DeleteRow(RowNum, cntr);

问题是你不能取消合并一个范围内的单个单元格,你必须取消合并整个范围。

为此,您可以使用我的解决方案获得单元格所属的合并范围 :

 public string GetMergedRange(ExcelWorksheet worksheet, string cellAddress)
    {
        ExcelWorksheet.MergeCellsCollection mergedCells = worksheet.MergedCells;
        foreach (var merged in mergedCells)
        {
            ExcelRange range = worksheet.Cells[merged];
            ExcelCellAddress cell = new ExcelCellAddress(cellAddress);
            if (range.Start.Row<=cell.Row && range.Start.Column <= cell.Column)
            {
                if (range.End.Row >= cell.Row && range.End.Column >= cell.Column)
                {
                    return merged.ToString();
                }
            }
        }
        return "";
    }

第二步是使用以下方法取消合并整个范围:

public void DeleteCell(ExcelWorksheet worksheet, string cellAddress)
    {
        if (worksheet.Cells[cellAddress].Merge == true)
        {
            string range = GetMergedRange(worksheet, cellAddress); //get range of merged cells
            worksheet.Cells[range].Merge = false; //unmerge range
            worksheet.Cells[cellAddress].Clear(); //clear value
        }
    }

这种方式将使您失去对其他单元格及其价值的合并,为了克服这个问题,您可以在清除和取消合并之前保存价值,然后您可以将其写回,例如:

public void DeleteCell(ExcelWorksheet worksheet, string cellAddress)
    {
        if (worksheet.Cells[cellAddress].Merge == true)
        {
            var value = worksheet.Cells[cellAddress].Value;
            string range = GetMergedRange(worksheet, cellAddress); //get range of merged cells
            worksheet.Cells[range].Merge = false; //unmerge range
            worksheet.Cells[cellAddress].Clear(); //clear value
            //merge the cells you want again.
            //fill the value in cells again
        }
    }