Копирование диапазона ячеек с изображениями в файлы Excel

Я копирую ячейки с одного листа Excel на другой с помощью GemBox.Spreadsheet. Ячейки поступают из определенного именованного диапазона, и я использую метод CellRange.CopyTo следующим образом:

ExcelFile book = ExcelFile.Load("sv-data.xlsx");
ExcelWorksheet sheet1 = book.Worksheets[0];
CellRange range1 = sheet1.NamedRanges["SV"].Range;
ExcelWorksheet sheet2 = book.Worksheets.Add("Sheet2");
range1.CopyTo(sheet2, 14, 3);

Это отлично работает для всех значений и форматирования ячеек, но не копирует изображения.

Это предполагаемое поведение? Как я могу копировать и данные, и изображения?


person Morgan Rose    schedule 04.11.2020    source источник
comment
На листе есть коллекция Shapes. Вот как вы обрабатываете изображения. Он работает аналогично диапазонам, но, очевидно, сложнее. Это должно поставить вас на путь: ocs.microsoft.com/en-us/previous-versions/office/developer/office-2003/aa174305(v=office.11)   -  person Marc G    schedule 04.11.2020


Ответы (1)


Да, похоже, так и задумано, потому что изображения хранятся не внутри ячеек, а внутри листа. Они являются частью отдельной коллекции, ExcelWorksheet.Pictures.

Итак, возможно, вы могли бы перебрать эту коллекцию и скопировать необходимые элементы.

Например, что-то вроде следующего:

ExcelFile book = ExcelFile.Load("sv-data.xlsx");
ExcelWorksheet sheet1 = book.Worksheets[0];
CellRange range1 = sheet1.NamedRanges["SV"].Range;

ExcelWorksheet sheet2 = book.Worksheets.Add("Sheet2");

int row2 = 14;
int column2 = 3;
range1.CopyTo(sheet2, row2, column2);

int rowOffset = row2 - range1.FirstRowIndex;
int columnOffset = column2 - range1.FirstColumnIndex;

foreach (ExcelPicture picture1 in sheet1.Pictures)
{
    ExcelDrawingPosition position1 = picture1.Position;
    CellRange pictureRange1 = sheet1.Cells.GetSubrangeAbsolute(position1.From.Row.Index, position1.From.Column.Index, position1.To.Row.Index, position1.To.Column.Index);

    if (range1.Overlaps(pictureRange1))
    {
        ExcelPicture picture2 = sheet2.Pictures.AddCopy(picture1);
        ExcelDrawingPosition position2 = picture2.Position;

        position2.From.Row = sheet2.Rows[position2.From.Row.Index + rowOffset];
        position2.To.Row = sheet2.Rows[position2.To.Row.Index + rowOffset];
        position2.From.Column = sheet2.Columns[position2.From.Column.Index + columnOffset];
        position2.To.Column = sheet2.Columns[position2.To.Column.Index + columnOffset];
    }
}

book.Save("output.xlsx");
person Mario Z    schedule 05.11.2020