Как программно вставить изображение в Excel?
Автор: Flame
Источник: faqdot.net
Источник: faqdot.net
Иногда возникает необходимость вставить изображение непосредственно в документ Excel, к сожалению именно в документ, по определенным координатам, а не в конкретную ячейку возможна вставка такого объекта. Далее описано два возможных способа программной вставки картинки.
При помощи раннего связывания, т.е. используя обертки вокруг "внутренностей" Excel. Для этого нам необходимо подключить те же библиотеки, что и для чтения данных из Excel файлов.
using Excel = Microsoft.Office.Interop.Excel;
using Office = Microsoft.Office.Core;
. . .
rg = m_workSheet.get_Range("A" + 1, "A" + 1);
float il, it, iw, ih;
// для приведения размеров изображения к размерам используемым в Shape
float zExcelPixel = 0.746835443f;
Image im = Image.FromFile(filePic);
// rg переменная хранящая ссылку на range относительно
// левого верхнего угла которого надо вставить изображение
// координата левого верхнего угола куда вставлять - находяться из range
il = (float)(double)rg.Left;// размеры поступают в double упакованый в object
it = (float)(double)rg.Top;
// размеры изображения для Shape нужно преобразовывать
iw = zExcelPixel * im.Width;// получаем из ширины исходного изображения
ih = zExcelPixel * im.Height;
// Увеличиваем высоту ячейки
if (im.Height < 409)
rg.RowHeight = zExcelPixel * im.Height;
else
rg.RowHeight = 409;
m_workSheet.Shapes.AddPicture(filePic, Office.MsoTriState.msoFalse, Office.MsoTriState.msoTrue, il, it, iw, ih);
. . .
С помощью позднего связывания
...
// rg переменная хранящая ссылку на range относительно левого верхнего угла которого надо вставить изображение
rg.Activate();//rg.Select();
object ob=worksSheet.GetType().InvokeMember("Pictures", BindingFlags.GetProperty, null, worksSheet, null);
ob.GetType().InvokeMember("Insert", BindingFlags.InvokeMethod, null, ob, new object[]{pathToPicFile});
...
Далее привожу полностью фрагмент кода вставляющий изображение в документ Excel:
void InsertPicToExcel()
{
String filePic = @”d:\test.jpg”;
Excel._Application m_app = null;
// Книга Excel.
Excel.Workbook m_workBook = null;
// Страница Excel.
Excel.Worksheet m_workSheet = null;
//Диапазон ячеек
Excel.Range rg = null;
try
{
// Создание приложения Excel.
m_app = new Excel.ApplicationClass();
// Приложение "невидимо".
m_app.Visible = false;
// Приложение управляется пользователем.
m_app.UserControl = true;
// Добавление книги Excel.
// m_workBook = m_app.Workbooks.Add(Excel.XlWBATemplate.xlWBATWorksheet);
// Открытие файла Excel.
m_workBook = m_app.Workbooks.Open(@"D:\test.xlsx", Type.Missing, Type.Missing,
Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing,
Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing);
// Связь со страницей Excel.
m_workSheet = m_app.ActiveSheet as Excel.Worksheet;
#region Вставка картинок
rg = m_workSheet.get_Range("A" + 1, "A" + 1);
float il, it, iw, ih;
float zExcelPixel = 0.746835443f;// для приведения размеров изображения к размерам используемым в Shape
Image im = Image.FromFile(filePic);
// rg переменная хранящая ссылку на range относительно левого верхнего угла которого надо вставить изображение
// координата левого верхнего угола куда вставлять - находяться из range
il = (float)(double)rg.Left;// размеры поступают в double упакованый в object
it = (float)(double)rg.Top;
// размеры изображения для Shape нужно преобразовывать
iw = zExcelPixel * im.Width;// получаем из ширины исходного изображения
ih = zExcelPixel * im.Height;
// Увеличиваем высоту ячейки
if (im.Height < 409)
rg.RowHeight = zExcelPixel * im.Height;
else
rg.RowHeight = 409;
m_workSheet.Shapes.AddPicture(filePic, Office.MsoTriState.msoFalse, Office.MsoTriState.msoTrue, il, it, iw, ih);
#endregion
}
finally
{
// Сохраняем файл с вставленным изображением
m_workBook.SaveCopyAs(@"d:\testPic.xlsx");
// Закрытие книги.
m_workBook.Close(false, "", null);
// Закрытие приложения Excel.
m_app.Quit();
m_workBook = null;
m_workSheet = null;
m_app = null;
GC.Collect();
}
}
По материалам GotDotNet.ru
