Как программно вставить изображение в Excel?

Иногда возникает необходимость вставить изображение непосредственно в документ 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;
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);
. . .

С помощью позднего связывания (подробнее о позднем связывании)


rg.Activate();//rg.Select();// rg переменная хранящая ссылку на range относительно левого верхнего угла которого надо вставить изображение
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

Currently rated 5.0 by 3 people

  • Currently 5/5 Stars.
  • 1
  • 2
  • 3
  • 4
  • 5

Tags: ,

Comments

Add comment


 

biuquote
  • Comment
  • Preview
Loading