Форум программистов, компьютерный форум, киберфорум
Наши страницы
C#: WPF, UWP и Silverlight
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.75/4: Рейтинг темы: голосов - 4, средняя оценка - 4.75
47911
0 / -1 / 0
Регистрация: 18.06.2016
Сообщений: 130
1

Excel и картинки

04.01.2017, 14:41. Просмотров 718. Ответов 18

В общем не нашёл нужной инфы, пишу сюда. Если ошибся разделом - не пинайте, пожалуйста.

Идея: вывести в ячейках Экселя картинки и в соседних столбцах какую-то инфу.
Нашёл: вставка картинок в Эксель(Лист).
Но: нигде не сказано "Как вставить картинку в Ячейку экселя". Где-то натыкался(когда-то) на "Позиционирования картинки чтобы выглядело "в ячейке".", но при изменения ширины - картинка оставалась на старом месте.

Собственно вопрос: как вставить картинку в Ячейку экселя.(Типо таблица: Картинка-Данные-Данные)
Используется "Microsoft.Office.Interop.Excel". Можно использовать сторонние библиотеки, только я не в курсе "Какие нужны для данного фокуса".
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
04.01.2017, 14:41
Ответы с готовыми решениями:

Экспорт в Excel: Прекращена работа программы "Microsoft Excel"
Файл сохраняется успешно, но поле строки excelApp.Quit(); Появляется окно...

Экспорт картинки в Excel
Добрый день! На форме имеется image, как отправить содержимое в Excel в...

Вывод картинки в Excel
Доброго времени суток. Столкнулся с проблемой вставки картинки в Excel из...

Добавление картинки в Excel
Доброго времени суток Вот только начинаю разбираться с OLE, не получается...

Вставка картинки в excel
Добрый день! Имеется excel файл, внутри файла в ячейках столбца "D",...

18
47911
0 / -1 / 0
Регистрация: 18.06.2016
Сообщений: 130
06.01.2017, 09:53  [ТС] 2
Я открыт для идей и предложений.
0
nicolas2008
256 / 241 / 85
Регистрация: 30.04.2009
Сообщений: 714
Завершенные тесты: 1
07.01.2017, 00:54 3
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
            Application excel = new Application();
            Workbook workbook = excel.Workbooks.Add();
            Worksheet worksheet = workbook.Worksheets.Add();
            object missing = System.Reflection.Missing.Value;
            Range pictureTargetRange = worksheet.Range["B2", "C4"];
            pictureTargetRange.Select();
            Pictures pictures = (Pictures) worksheet.Pictures(missing);
            Picture picture = pictures.Insert("testpicture.jpg",missing);
            picture.ShapeRange.LockAspectRatio = MsoTriState.msoFalse;
            picture.Width = pictureTargetRange.Width;
            picture.Height = pictureTargetRange.Height;
            picture.Placement = XlPlacement.xlMoveAndSize;
            workbook.SaveAs("test.xlsx");
            workbook.Close();
            excel.Quit();
1
_exp10der_
Warrior
490 / 417 / 177
Регистрация: 23.11.2014
Сообщений: 932
07.01.2017, 01:06 4
Вставить изображение в Excel без Shapes.AddPicture?
Вставка рисунка в Excel из буфера обмена
1
47911
0 / -1 / 0
Регистрация: 18.06.2016
Сообщений: 130
07.01.2017, 17:38  [ТС] 5
Цитата Сообщение от _exp10der_ Посмотреть сообщение
Вставить изображение в Excel без Shapes.AddPicture?
Вставка рисунка в Excel из буфера обмена
Читал. 1-я ссылка - ОпенОфис
2 ссылка - не в ячейку. Т.е. изменяя ширину столбцов - изображение останется на месте.

nicolas2008, В вашем коде:
Я использую:
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
using nODKLiy4EHue_using_Excel = Microsoft.Office.Interop.Excel;
                nODKLiy4EHue_using_Excel.Application excel = new nODKLiy4EHue_using_Excel.Application();
                nODKLiy4EHue_using_Excel.Workbook workbook = excel.Application.Workbooks.Add();
                nODKLiy4EHue_using_Excel.Worksheet worksheet = workbook.Worksheets.Add();
                object missing = System.Reflection.Missing.Value;
                nODKLiy4EHue_using_Excel.Range pictureTargetRange = worksheet.Range[1, 1];
                pictureTargetRange.Select();
                nODKLiy4EHue_using_Excel.Pictures pictures = (nODKLiy4EHue_using_Excel.Pictures)worksheet.Pictures(missing);
                nODKLiy4EHue_using_Excel.Picture picture = pictures.Insert("testpicture.jpg", missing);
                picture.ShapeRange.LockAspectRatio = MsoTriState.msoFalse;
                picture.Width = pictureTargetRange.Width;
                picture.Height = pictureTargetRange.Height;
                picture.Placement = nODKLiy4EHue_using_Excel.XlPlacement.xlMoveAndSize;
                workbook.SaveAs("test.xlsx");
                workbook.Close();
                excel.Quit();
Проблема: что такое "MsoTriState", т.к. подчёркивает красным. Что я не подключил?

Добавлено через 7 часов 41 минуту
Если важно: .NET 4.0
0
nicolas2008
256 / 241 / 85
Регистрация: 30.04.2009
Сообщений: 714
Завершенные тесты: 1
07.01.2017, 18:29 6
Цитата Сообщение от 47911 Посмотреть сообщение
Проблема: что такое "MsoTriState", т.к. подчёркивает красным. Что я не подключил?

Если важно: .NET 4.0
.NET 4.0 - ок. Важно еще какая студия и какой офис.
Пример сделал на MS Visual Studio 2015 и будет работать в MS Office 2010 и выше.
Для MS Office 2007 есть нюансы, если билд приложения сделан в Visual Studio > 2010

Нужно добавить ссылку на 'C:\Program Files (x86)\Microsoft Visual Studio 14.0\Visual Studio Tools for Office\PIA\Office14\office.dll' и добавить using Microsoft.Office.Core
А вообще на будущее - поставь Resharper и будешь получать подсказки на добавление нужных ссылок и using-ов

Добавлено через 12 минут
Кстати не забудь еще, что все обьекты, к которым обращаешся при работе с interop excel (Application, Workbook, Workbooks, Worksheet, Worksheets, Pictures, Picture и даже Range) - это COM-обьекты, поэтому если их правильно не освободить после работы, то будут утечки памяти.
1
47911
0 / -1 / 0
Регистрация: 18.06.2016
Сообщений: 130
07.01.2017, 18:50  [ТС] 7
Вообщем: офис может быть любой(на компе пользлвателя. Возможно имеет смысл таскать за собой *.dll По логике вещей должен быть не ниже 2007. По факту - не известно), для работы. Студия 2015.

Почитал об освобождении ресурсов COM-объектов. Пишут "надо закрыть эксель, для освобождения ресурсов". так дело в том, что надо чтобы человек сам сказал: куда ему сохранить - утечка памяти, ибо неизвестно: когда он это сделает. . .
0
nicolas2008
256 / 241 / 85
Регистрация: 30.04.2009
Сообщений: 714
Завершенные тесты: 1
07.01.2017, 19:20 8
Цитата Сообщение от 47911 Посмотреть сообщение
Вообщем: офис может быть любой(на компе пользлвателя. Возможно имеет смысл таскать за собой *.dll По логике вещей должен быть не ниже 2007. По факту - не известно), для работы. Студия 2015.
Почитал об освобождении ресурсов COM-объектов. Пишут "надо закрыть эксель, для освобождения ресурсов". так дело в том, что надо чтобы человек сам сказал: куда ему сохранить - утечка памяти, ибо неизвестно: когда он это сделает. . .
Надо проверять как оно будет с 2007 офисом. Точно знаю, что Excel Add-In написаный в VS 2015 не будет корреткно запускаться в Excel 2007 и для запуска необходимо устанавливать Visual Studio 2010 Tools for Office Runtime

По поводу утечек памяти при использовании office interop: https://support.microsoft.com/en-us/kb/317109
Статья старая, но все еще актуальная, и таких статей много.
После вызова excel.Quit() сам процесс EXCEL.EXE не закроется, если остались активные COM-обьекты. Закроется только после выхода из приложения.
0
47911
0 / -1 / 0
Регистрация: 18.06.2016
Сообщений: 130
08.01.2017, 03:20  [ТС] 9
Такое уточнение: картинка поверх ячеек. И только так? Никак нельзя именно вставить её в ячейку?(Чтобы при изменении ширины - картинка была именно в ячейке(1 шт.).)
0
_exp10der_
Warrior
490 / 417 / 177
Регистрация: 23.11.2014
Сообщений: 932
08.01.2017, 05:14 10
Лучший ответ Сообщение было отмечено 47911 как решение

Решение

Цитата Сообщение от 47911 Посмотреть сообщение
Читал. 1-я ссылка - ОпенОфис
2 ссылка - не в ячейку. Т.е. изменяя ширину столбцов - изображение останется на месте.
Так это одно и тоже и причем тут опен офис?

Цитата Сообщение от 47911 Посмотреть сообщение
Такое уточнение: картинка поверх ячеек. И только так? Никак нельзя именно вставить её в ячейку?(Чтобы при изменении ширины - картинка была именно в ячейке(1 шт.).)
Если вы про это https://www.youtube.com/watch?v=TSjEMLBAYVc?

То делается элементарно

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
namespace ConsoleApplication253
{
    using System.Drawing;
    using System.IO;
    using OfficeOpenXml;
    using OfficeOpenXml.Drawing;
 
    internal class Program
    {
        private static void Main()
        {
            var image = Image.FromFile("1.jpg");
 
            using (var excel = new ExcelPackage())
            {
                var ws = excel.Workbook.Worksheets.Add("MyWorksheet");
                var picture = ws.Drawings.AddPicture("One", image);
                picture.From.Column = 1;
                picture.From.Row = 1;
                picture.EditAs = eEditAs.TwoCell;
                picture.SetSize(64, 20);
 
                excel.SaveAs(new FileInfo("test.xlsx"));
            }
        }
    }
}
1
Вложения
Тип файла: zip ConsoleApplication253.zip (2.49 Мб, 2 просмотров)
47911
0 / -1 / 0
Регистрация: 18.06.2016
Сообщений: 130
08.01.2017, 13:38  [ТС] 11
Хорошо. Вот только где брать нужные dll? И получается, их надо таскать за проектом. Т.к. у человека небудет опенофиса, а будет эксель.
0
_exp10der_
Warrior
490 / 417 / 177
Регистрация: 23.11.2014
Сообщений: 932
08.01.2017, 14:53 12
это библиотека https://www.nuget.org/packages/EPPlus/
1
Миниатюры
Excel и картинки  
47911
0 / -1 / 0
Регистрация: 18.06.2016
Сообщений: 130
08.01.2017, 19:26  [ТС] 13
Цитата Сообщение от 47911 Посмотреть сообщение
Если важно: .NET 4.0
Полагаю проэкт не для меня?

Добавлено через 5 минут
Также вопрос: получится задать размер картинки во время вставки?(в смысле ужать, чтобы влезало в определённые рамки)

Добавлено через 13 минут
Разобрался. Благодарю. Полагаю: соблюдение пропорций картинки - дело высчитывания программно...

Добавлено через 1 минуту
Где ж ты такие элементарные вещи то находишь?
0
_exp10der_
Warrior
490 / 417 / 177
Регистрация: 23.11.2014
Сообщений: 932
08.01.2017, 19:27 14
Цитата Сообщение от 47911 Посмотреть сообщение
Полагаю проэкт не для меня?
http://epplus.codeplex.com/SourceControl/latest#SampleApp/Sample1.cs
сэмплы написаны на .Net framework 3.5 client profile

Цитата Сообщение от 47911 Посмотреть сообщение
Также вопрос: получится задать размер картинки во время вставки?(в смысле ужать, чтобы влезало в определённые рамки)
Да получиться задать размер картинки. Даже если бы нельзя было, никто вам не мешает ужать картинку самостоятельно в памяти и затем вставлять.
1
47911
0 / -1 / 0
Регистрация: 18.06.2016
Сообщений: 130
08.01.2017, 20:24  [ТС] 15
Да я уже всё поставил на широкую ногу. . .

Добавлено через 43 минуты
Что-то понять не могу: а как через:
C#
1
2
3
4
5
6
7
8
9
10
11
            using (var excel = new ExcelPackage())
            {
                var ws = excel.Workbook.Worksheets.Add("MyWorksheet");
                var picture = ws.Drawings.AddPicture("One", image);
                picture.From.Column = 1;
                picture.From.Row = 1;
                picture.EditAs = eEditAs.TwoCell;
                picture.SetSize(64, 20);
 
                excel.SaveAs(new FileInfo("test.xlsx"));
            }
Вставить рядом с картинкой, в соседнюю ячейку: текст.
0
_exp10der_
Warrior
490 / 417 / 177
Регистрация: 23.11.2014
Сообщений: 932
08.01.2017, 21:56 16
Лучший ответ Сообщение было отмечено 47911 как решение

Решение

Ну что бы вставить с чем то рядом это надо с начало найти и узнать его позицию.
Конкретно в вашем коде вы же сами задаете куда вставлять From.Column, From.Row

Вот как можно найти элемент
C#
1
2
3
4
5
6
7
8
9
10
11
12
using (var excel = new ExcelPackage(new FileInfo("test.xlsx")))
            {
                var ws = excel.Workbook.Worksheets.Single(n => n.Name == "MyWorksheet");
 
                var picture = ws.Drawings.Single(n => n.Name == "One");
 
                var position = picture.To;
 
                ws.Cells[position.Row, position.Column + 1].Value = "One";
 
                excel.SaveAs(new FileInfo("test.xlsx"));
            }
Полный код
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
namespace ConsoleApplication253
{
    using System.Drawing;
    using System.IO;
    using System.Linq;
    using OfficeOpenXml;
    using OfficeOpenXml.Drawing;
 
    internal class Program
    {
        private static void Main()
        {
            var image = Image.FromFile("1.jpg");
 
            using (var excel = new ExcelPackage())
            {
                var ws = excel.Workbook.Worksheets.Add("MyWorksheet");
                var picture = ws.Drawings.AddPicture("One", image);
                picture.From.Column = 1;
                picture.From.Row = 1;
                picture.EditAs = eEditAs.TwoCell;
                picture.SetSize(64, 20);
 
                excel.SaveAs(new FileInfo("test.xlsx"));
            }
 
            using (var excel = new ExcelPackage(new FileInfo("test.xlsx")))
            {
                var ws = excel.Workbook.Worksheets.Single(n => n.Name == "MyWorksheet");
 
                var picture = ws.Drawings.Single(n => n.Name == "One");
 
                var position = picture.To;
 
                ws.Cells[position.Row, position.Column + 1].Value = "One";
 
                excel.SaveAs(new FileInfo("test.xlsx"));
            }
        }
    }
}
1
47911
0 / -1 / 0
Регистрация: 18.06.2016
Сообщений: 130
08.01.2017, 22:49  [ТС] 17
Речь идёт о том, чтобы: во время цикла вставлять данные - Картинка, Текст, текст, текст.
Т.е. Картинка - ячейка 1
Текст - ячейка 2
Текст - ячейка 3
Текст - ячейка 4

Без поиска.

Добавлено через 19 минут
На всякий случай, в посте выше - уже есть решение этого вопроса, даже больше.

Добавлено через 17 минут
_exp10der_, Последнее. Пытаюсь сделать косметический ремонт, чтобы картинка выглядела нормально. Не нашёл ширину и высоту ячейки.
Скажем:
ws.Cells[CTPOKA, CTOL6Etc].? - перерыл там всё, что намекает на связь со стилями или размером. Где ещё не смотрел?

Добавлено через 1 минуту
Нужно именно ячейки, т.к. Не планируется использование "Объединение ячеек", т.е. чтобы в 1 строке были все данные.(Картинка, текст, текст, текст).
0
_exp10der_
Warrior
490 / 417 / 177
Регистрация: 23.11.2014
Сообщений: 932
08.01.2017, 22:54 18
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
namespace ConsoleApplication254
{
    using System;
    using System.IO;
    using System.Linq;
    using OfficeOpenXml;
 
    internal class Program
    {
        private static void Main()
        {
            using (var excel = new ExcelPackage())
            {
                var ws = excel.Workbook.Worksheets.Add("MyWorksheet");
 
                ws.Row(3).Height = 100;
                ws.Column(3).Width = 100;
 
                excel.SaveAs(new FileInfo("test.xlsx"));
            }
        }
    }
}
1
47911
0 / -1 / 0
Регистрация: 18.06.2016
Сообщений: 130
08.01.2017, 23:38  [ТС] 19
А вот до такого ws.Row(3).Height = 100; я не додумался. Благодарю, не знал что так можно использовать методы.

Добавлено через 24 минуты
Щас поэкспериментировал над стилями. Вообщем: картинку вставляет в ячейку правее, чем ту "Которую я указываю". Полагаю: если я хочу сохранить "Изменение размера картинки, зависимо от ячейки ГдеКартинка" - то придётся извращаться со стилями и кодом, чтобы "Всё выглядело нормально", я прав?
0
08.01.2017, 23:38
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
08.01.2017, 23:38

Отредактировать картинки из файла Excel и сохранить на те же места
Добрый вечер! Опишу ситуацию: есть файл .xlsx (Excel 2010). В нем содержится...

Изменить положение картинки в Excel, не используя макросы
Можно ли изменить положение картинки в Excel, не используя макросы? Если...

Как скопировать файл картинки из таблицы Access в Excel?
Здравствуйте! У меня есть таблица Access, а в ней поле, в котором тип...


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

Или воспользуйтесь поиском по форуму:
19
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru