Как программно вставить изображение в 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