Форум программистов, компьютерный форум, киберфорум
Наши страницы

C#: WPF, UWP и Silverlight

Войти
Регистрация
Восстановить пароль
 
 
47911
0 / -1 / 0
Регистрация: 18.06.2016
Сообщений: 130
#1

Excel и картинки - C# WPF/.NET 4.x

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

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

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

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

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

Вывод картинки в Excel - Delphi
Доброго времени суток. Столкнулся с проблемой вставки картинки в Excel из буфера обмена. Код: //загружаем картинку из БД. Secur -...

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

Экспорт картинки в Excel - C++ Builder
Добрый день! На форме имеется image, как отправить содержимое в Excel в указанное место, например: "A1:C10"? Добавлено через 29...

Добавление картинки в Excel - C++ COM
Доброго времени суток Вот только начинаю разбираться с OLE, не получается вставить картинку, выдаёт ошибку неизвестного имени, подскажите...

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

18
47911
0 / -1 / 0
Регистрация: 18.06.2016
Сообщений: 130
06.01.2017, 09:53  [ТС] #2
Я открыт для идей и предложений.
0
nicolas2008
173 / 163 / 27
Регистрация: 30.04.2009
Сообщений: 481
Завершенные тесты: 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
412 / 369 / 106
Регистрация: 23.11.2014
Сообщений: 865
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
173 / 163 / 27
Регистрация: 30.04.2009
Сообщений: 481
Завершенные тесты: 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
173 / 163 / 27
Регистрация: 30.04.2009
Сообщений: 481
Завершенные тесты: 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
412 / 369 / 106
Регистрация: 23.11.2014
Сообщений: 865
08.01.2017, 05:14 #10
Лучший ответ Сообщение было отмечено автором темы, экспертом или модератором как ответ
Цитата Сообщение от 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
412 / 369 / 106
Регистрация: 23.11.2014
Сообщений: 865
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
412 / 369 / 106
Регистрация: 23.11.2014
Сообщений: 865
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
08.01.2017, 20:24
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
08.01.2017, 20:24
Привет! Вот еще темы с ответами:

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

Как скопировать файл картинки из таблицы Access в Excel? - VBA
Здравствуйте! У меня есть таблица Access, а в ней поле, в котором тип «вложение» и хранится “jpg” файл. Мне необходимо скопировать их в...

Вставка картинки в Excel 2010 (сохранения самих картинок в тушке файле) - VBA
Добрый день! Возможно проблема где-то уже всплывала. Суть такова, есть макрос, который полу-автоматом вставляет картинки в файл...

Excel 2007: добавление фоновой картинки для указанного диапазона ячеек - VBA
Добрый вечер. Подскажите, можно ли указанному диапазону ячеек добавлять фоновую картинку? Если да, то можно ли делать подобное...


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

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

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