Как извлечь изображение из файла Excel и сохранить его в файл с помощью C # windows service - PullRequest
0 голосов
/ 27 октября 2018

В приложении службы C # Windows я хочу извлечь изображение из файла Excel и сохранить его в файл.Я написал этот код:

foreach Microsoft.Office.Interop.Excel.Shape shape in CurrentSheet.Shapes)
{
    shape.CopyPicture(XlPictureAppearance.xlScreen, XlCopyPictureFormat.xlBitmap);
    if (Clipboard.ContainsImage())
    {   
       images.Add(Clipboard.GetImage());
    }
}

Но проблема в том, что служба Windows не имеет доступа к буферу обмена.У кого-нибудь есть решение этой проблемы?

1 Ответ

0 голосов
/ 02 ноября 2018

AFAIK, вы не можете использовать буфер обмена WinForms для получения метаданных.

Данные, хранящиеся в буфере обмена после .CopyPicture (...), не , это просто данные изображения - это метаданные.

Вы можете получить к ним доступ следующим образом:

public const uint CF_ENHMETAFILE = 14;

[DllImport("user32.dll", CharSet = CharSet.Auto, ExactSpelling = true)]
public static extern bool OpenClipboard(IntPtr hWndNewOwner);

[DllImport("user32.dll", CharSet = CharSet.Auto, ExactSpelling = true)]
public static extern bool CloseClipboard();

[DllImport("user32.dll", CharSet = CharSet.Auto, ExactSpelling = true)]
public static extern IntPtr GetClipboardData(uint format);

[DllImport("user32.dll", CharSet = CharSet.Auto, ExactSpelling = true)]
public static extern bool IsClipboardFormatAvailable(uint format);

private Image GetMetaImageFromClipboard()
{
  try
  {
    Bitmap image;
    Metafile emf = null;
    if (OpenClipboard(IntPtr.Zero))
    {
      if (IsClipboardFormatAvailable(CF_ENHMETAFILE))
      {
        var ptr = GetClipboardData(CF_ENHMETAFILE);
        if (!ptr.Equals(IntPtr.Zero))
          emf = new Metafile(ptr, true);
      }

      CloseClipboard();
    }

    image = new Bitmap(emf.Width, emf.Height, PixelFormat.Format32bppPArgb);
    Graphics g = Graphics.FromImage(image);

    g.DrawImage(emf, 0, 0, image.Width, image.Height);
    g.Dispose();
    emf.Dispose();
    return image;
  }
  catch (Exception ex)
  {
    // some logs
    return null;
  }
  finally
  {
    CloseClipboard();
  }

}

Затем вы можете использовать это так:

Bitmap bmp = GetMetaImageFromClipboard(); bmp.Save(path);

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...