Переместить объединенные ячейки, чтобы имитировать вставку и удаление столбца

Могу ли я перемещать объединенные ячейки для имитации вставки/удаления столбцов в версии EPPlus 3.1? Я хочу переместить ячейки, но показывает ошибку, когда я пытаюсь переместить объединенные ячейки.

Спасибо!


person jdnichollsc    schedule 01.12.2014    source источник


Ответы (2)


Поскольку никто не ответил, я решил, что дам вам знать, что я нашел. Похоже, это невозможно сделать в EPPlus 3.1 или новой версии 4.0.1. Я создал этот тест в исходном коде:

[TestMethod]
public void Move_Merged_Cells_Test()
{
    //http://stackoverflow.com/questions/27230423/move-merged-cells-to-simulate-insert-and-delete-column

    var existingFile = new FileInfo(@"c:\temp\temp.xlsx");
    if (existingFile.Exists)
        existingFile.Delete();

    using (var package = new ExcelPackage(existingFile))
    {
        var workbook = package.Workbook;
        var worksheet = workbook.Worksheets.Add("newsheet");

        worksheet.Select("A1:C3");
        worksheet.SelectedRange.Merge = true;
        worksheet.SelectedRange.Value = "toto";

        //worksheet.Select("A1");
        worksheet.SelectedRange.Copy(worksheet.Cells["B1"]);
        worksheet.SelectedRange.Clear();

        package.Save();
    }
}

Который в конечном итоге попадает в метод после прохождения (начиная с метода теста) worksheet.SelectedRange.Copy(worksheet.Cells["B1"]) > .Clear() >Delete(this) > DeleteCheckMergedCells(Range):

private void DeleteCheckMergedCells(ExcelAddressBase Range)
{
    var removeItems = new List<string>();
    foreach (var addr in Worksheet.MergedCells)
    {
        var addrCol = Range.Collide(new ExcelAddress(Range.WorkSheet, addr));
        if (addrCol != eAddressCollition.No)
        {
            if (addrCol == eAddressCollition.Inside)
            {
                removeItems.Add(addr);
            }
            else
            {
                throw (new InvalidOperationException("Can't remove/overwrite cells that are merged"));
            }
        }
    }
    foreach (var item in removeItems)
    {
        Worksheet.MergedCells.Remove(item);
    }
}

Кажется, он специально ищет объединенные ячейки и выдает исключение. Я проверил 4.0.1, и это та же проблема (они немного изменили процедуры).

Таким образом, кажется, что единственным способом было бы разъединить, скопировать и снова объединить. Извините, я не мог дать вам лучший ответ.

Эрни

person Ernie S    schedule 03.12.2014

Нужно разъединить перед очисткой.

    worksheet.SelectedRange.Copy(worksheet.Cells["B1"]);
    foreach (var cell in worksheet.SelectedRange) cell.Merge = false;
    worksheet.SelectedRange.Clear();
person b0bi    schedule 13.12.2016