Форум программистов, компьютерный форум, киберфорум
C# Windows Forms
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.67/6: Рейтинг темы: голосов - 6, средняя оценка - 4.67
0 / 0 / 0
Регистрация: 15.12.2016
Сообщений: 48

Как растянуть картинку на определенное количество ячеек в excel?

21.12.2021, 08:49. Показов 1198. Ответов 5
Метки c#, excel (Все метки)

Студворк — интернет-сервис помощи студентам
Есть метод который добавляет картинку в excel файл но не растягивает её в определенном диапазоне ячеек, как это можно сделать? Вот функция:
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
public void WriteShape(Excel.Picture shape, int curRow)
        {
            try
            {
 
                this.SelectCells("B13", "AE42");
                int width = Convert.ToInt32(this.range.Width) - 5;
                int height = Convert.ToInt32(this.range.Height) - 5;
 
 
 
                Excel.Picture pic = shape;
 
 
 
                int width = 820;
                int height = 405;              
 
                int oneCellWidth = width / 29;
                int oneCellHeight = height / 26;
 
                float ratioX = 0;
                float ratioY = 0;
                float ratio = 1;
 
                if ((float)pic.Width > (float)width)
                {
                    ratioX = (float)width / (float)pic.Width;
                    ratio = ratioX;
                }
                if ((float)pic.Height > (float)height)
                {
                    ratioY = (float)height / (float)pic.Height;
                    ratio = ratioY;
                }
 
                if (ratioX != 0 && ratioY != 0) ratio = Math.Min(ratioX, ratioY);
 
                int left = Convert.ToInt32(width * 0.5 - pic.Width * 0.5 * ratio);
                int top = Convert.ToInt32(height * 0.5 - pic.Height * 0.5 * ratio);
 
                int colPaste = left / oneCellWidth;
                int rowPaste = Convert.ToInt32(top / oneCellHeight);
 
                pic.Width = Convert.ToInt32(pic.Width * ratio);
                pic.Height = Convert.ToInt32(pic.Height * ratio);
 
                pic.Left = left;
                pic.Top = top;
 
                pic.Copy();               
 
 
                this.SelectCell(String.Format("{0}{1}", "B", curRow - 3));//rowPaste == 0 ? curRow : curRow + rowPaste));
 
                //this.SelectCell(String.Format("B{0}", curRow));
                System.Threading.Thread.Sleep(1500);
                this.xlWorkSheet.Paste(this.range, pic);
                System.Threading.Thread.Sleep(1500);
            }
            catch (Exception ex) { LOG.LogPrint.WriteLog(String.Format("{0}{1}{2}", "Ошибка при копировании картинки в документ!", Environment.NewLine, ex.ToString())); }
        }
0
Лучшие ответы (1)
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
21.12.2021, 08:49
Ответы с готовыми решениями:

Как в dataGridView указать определенное количество ячеек в столбце?
как в dataGridView1 указать определенное количество ячеек в столбце и втором тоже к примеру Collum1 30 ячеек (создавать больше нельзя...

Разделение числа на определённое количество ячеек
Здравствуйте, задача такая: Есть число, его нужно разделить на нужное количество ячеек (выходные дни), чтобы при округлении сумма этих...

Как увеличить количество ячеек Excel?
Hi, All Проблема такая: в Excel максимум 256 столбцов а мне надо больше. Знаю, что очень много строк (65536). Если нельзя как-то...

5
 Аватар для ViterAlex
8952 / 4864 / 1886
Регистрация: 11.02.2013
Сообщений: 10,246
21.12.2021, 11:58
Из кода непонятно, как быть с соотношением сторон? Если изображение не вписывается в выделенный диапазон, как изменять размер? Чтобы вписался по ширине или по высоте?
Размер изображения нужно вычислять, исходя из координат верхней левой и нижней правой ячеек в выделении.

Добавлено через 29 минут
Предложу такой вариант. Переписал из VBA, не тестировал, но на VBA работает:
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
/// <summary>
/// Вставка изображения в заданный диапазон ячеек
/// </summary>
/// <param name="path">Путь к файлу изображения</param>
/// <param name="sel">Диапазон ячеек</param>
/// <param name="mode">Режим подгонки размера</param>
static void InsertPicture(string path, Excel.Range sel, AspectRatioMode mode)
{
    var xlSheet = sel.Worksheet;
    var lastCell = (Excel.Range)(xlSheet.Cells[sel.Row + sel.Rows.Count - 1, sel.Column + sel.Columns.Count - 1]);
    var w = lastCell.Left + lastCell.Width - sel.Left;
    var h = lastCell.Top + lastCell.Height - sel.Top;
    var pic =(Excel.Shape)xlSheet.Shapes.AddPicture(path,
        LinkToFile: 0,
        SaveWithDocument: Microsoft.Office.Core.MsoTriState.msoTrue,
        Left: sel.Left,
        Top: sel.Top,
        Width: -1, Height: -1);
    var ar = pic.Width / pic.Height;
    switch (mode)
    {
        case AspectRatioMode.None:
            pic.LockAspectRatio = Microsoft.Office.Core.MsoTriState.msoFalse;
            break;
        case AspectRatioMode.FitToRows:
            pic.LockAspectRatio = Microsoft.Office.Core.MsoTriState.msoTrue;
            w /= ar;
            break;
        case AspectRatioMode.FitToColumns:
            pic.LockAspectRatio = Microsoft.Office.Core.MsoTriState.msoTrue;
            h *= ar;
            break;
    }
    pic.Width = w;
    pic.Height = h;
}
enum AspectRatioMode
{
    None,
    FitToRows,
    FitToColumns
}
1
0 / 0 / 0
Регистрация: 15.12.2016
Сообщений: 48
21.12.2021, 17:05  [ТС]
Только я не знаю как путь получить до картинки, у меня есть Excel.Picture который я получаю из другого excel файла в цикле
C#
1
Excel.Picture pic = (Excel.Picture)xlWorkSheetloc.Pictures(i);
0
 Аватар для ViterAlex
8952 / 4864 / 1886
Регистрация: 11.02.2013
Сообщений: 10,246
21.12.2021, 17:31
Лучший ответ Сообщение было отмечено black96zm как решение

Решение

Ну тогда путь не нужен. Можно передавать объект, никакой разницы, только убрать фрагмент вставки на лист:
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
static void InsertPicture(Excel.Picture pic, Excel.Range sel, AspectRatioMode mode)
{
    var xlSheet = sel.Worksheet;
    var lastCell = (Excel.Range)(xlSheet.Cells[sel.Row + sel.Rows.Count - 1, sel.Column + sel.Columns.Count - 1]);
    var w = lastCell.Left + lastCell.Width - sel.Left;
    var h = lastCell.Top + lastCell.Height - sel.Top;
    var ar = pic.Width / pic.Height;
    switch (mode)
    {
        case AspectRatioMode.None:
            pic.LockAspectRatio = Microsoft.Office.Core.MsoTriState.msoFalse;
            break;
        case AspectRatioMode.FitToRows:
            pic.LockAspectRatio = Microsoft.Office.Core.MsoTriState.msoTrue;
            w /= ar;
            break;
        case AspectRatioMode.FitToColumns:
            pic.LockAspectRatio = Microsoft.Office.Core.MsoTriState.msoTrue;
            h *= ar;
            break;
    }
    pic.Width = w;
    pic.Height = h;
}
enum AspectRatioMode
{
    None,
    FitToRows,
    FitToColumns
}
1
0 / 0 / 0
Регистрация: 15.12.2016
Сообщений: 48
21.12.2021, 17:36  [ТС]
Тогда я сталкиваюсь с такой проблемой
Миниатюры
Как растянуть картинку на определенное количество ячеек в excel?  
0
 Аватар для ViterAlex
8952 / 4864 / 1886
Регистрация: 11.02.2013
Сообщений: 10,246
21.12.2021, 17:42
Странный объект этот Picture. В объектной модели VBA его нет, только в Interop. Ну не используй это свойство, просто задавай ширину и высоту
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
21.12.2021, 17:42
Помогаю со студенческими работами здесь

Найти количество ячеек, содержащих определенное слово
Здравствуйте. Пытаюсь найти колличество ячеек содержащих в себе определенное слово (может находится это слово в ячейке и больше одного...

Копирование одного и того же текста через определенное количество ячеек
Здравствуйте. а не подскажите как через определеное количество ячеек вставить текст. Пример в BR 39 и BR 40 записать текст потом его же...

Как растянуть картинку в label?
Есть картинка она большая не а label нужен маленький как сделать чтобы картинка подганяла размеры под label

Как растянуть картинку? CSS
Как растянуть картинку которая стоит на фоне текста(картинка с анимацией)? Вот код: .menu a:hover{background-image:...

как растянуть картинку в delphi
И так, здравствуйте. Прошу помочь мне с одной задачей: имеется pbg-изображение. Как то нужно растянуть его в редакторе, ибо в фотошопе...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
6
Ответ Создать тему
Новые блоги и статьи
SDL3 для Desktop (MinGW): Рисуем цветные прямоугольники с помощью рисовальщика SDL3 на Си и C++
8Observer8 17.03.2026
Содержание блога Финальные проекты на Си и на C++: finish-rectangles-sdl3-c. zip finish-rectangles-sdl3-cpp. zip
Символические и жёсткие ссылки в Linux.
algri14 15.03.2026
Существует два типа ссылок — символические и жёсткие. Ссылка в Linux — это запись в каталоге, которая может указывать либо на inode «файла-ИСТОЧНИКА», тогда это будет «жёсткая ссылка» (hard link),. . .
[Owen Logic] Поддержание уровня воды в резервуаре количеством включённых насосов: моделирование и выбор регулятора
ФедосеевПавел 14.03.2026
Поддержание уровня воды в резервуаре количеством включённых насосов: моделирование и выбор регулятора ВВЕДЕНИЕ Выполняя задание на управление насосной группой заполнения резервуара,. . .
делаю науч статью по влиянию грибов на сукцессию
anaschu 13.03.2026
прикрепляю статью
SDL3 для Desktop (MinGW): Создаём пустое окно с нуля для 2D-графики на SDL3, Си и C++
8Observer8 10.03.2026
Содержание блога Финальные проекты на Си и на C++: hello-sdl3-c. zip hello-sdl3-cpp. zip Результат:
Установка CMake и MinGW 13.1 для сборки С и C++ приложений из консоли и из Qt Creator в EXE
8Observer8 10.03.2026
Содержание блога MinGW - это коллекция инструментов для сборки приложений в EXE. CMake - это система сборки приложений. Здесь описаны базовые шаги для старта программирования с помощью CMake и. . .
Как дизайн сайта влияет на конверсию: 7 решений, которые реально повышают заявки
Neotwalker 08.03.2026
Многие до сих пор воспринимают дизайн сайта как “красивую оболочку”. На практике всё иначе: дизайн напрямую влияет на то, оставит человек заявку или уйдёт через несколько секунд. Даже если у вас. . .
Модульная разработка через nuget packages
DevAlt 07.03.2026
Сложившийся в . Net-среде способ разработки чаще всего предполагает монорепозиторий в котором находятся все исходники. При создании нового решения, мы просто добавляем нужные проекты и имеем. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru