我尝试将单元格范围从excel文件保存到图片。 我使用了来自interop.excel api的CopyPicture方法,因此图片位于剪贴板上。 例如,当我在Word文档上按ctrl + v时,我得到了图片,但是我无法成功通过代码获得它。 从GetImageFromClipBoard方法返回的数据为空。
public void SaveAsImage()
{
var usedRange = ws.UsedRange;
int startRow = usedRange.Row;
int endRow = startRow + usedRange.Rows.Count - 1;
int startColumn = usedRange.Column;
int endColumn = startColumn + usedRange.Columns.Count - 1;
Xl.Range rng = wb.ActiveSheet.Range[ws.Cells[1, 1],
ws.Cells[endRow, endColumn]];
rng.CopyPicture(Xl.XlPictureAppearance.xlScreen,
Xl.XlCopyPictureFormat.xlBitmap);
Image image = GetImageFromClipBoard();
image.Save("image.bmp", System.Drawing.Imaging.ImageFormat.Bmp);
}
[STAThread]
private Image GetImageFromClipBoard()
{
IDataObject clipboardData = Clipboard.GetDataObject();
Exception threadEx = null;
Thread staThread = new Thread(
delegate ()
{
try
{
clipboardData = Clipboard.GetDataObject();
}
catch (Exception ex)
{
threadEx = ex;
}
});
staThread.SetApartmentState(ApartmentState.STA);
staThread.Start();
staThread.Join();
return (Bitmap)clipboardData.GetData(DataFormats.Bitmap);
}
答案 0 :(得分:0)
您要执行的操作是从剪贴板中检索位图,类型为“位图”。不过,我不确定Office是否使用该类型。
请注意,DataFormats
不是枚举;它们只是引用剪贴板内容中常用的字符串ID。这立即意味着您可以添加自定义项。这些自定义项通常作为字节流放在剪贴板上。 This answer详细说明了在剪贴板上存储和获取这些字节数组的方式。
使用的主要文件之一是DIB(基本上是没有特定文件头的BMP文件),但是Office专门使用了这些文件:
"PNG+Office Art"
"JFIF+Office Art"
"GIF+Office Art"
"PNG"
"JFIF"
"GIF"
(我听说“ + Office Art”也只是图像,但我自己还没有尝试过)
是的,如果您尝试获取它们,使用剪贴板中的字节创建一个新的MemoryStream
,然后使用MemoryStream创建一个新的Bitmap
,那么您应该在那里。从PNG开始,您基本上可以尝试使用它们直到出现可粘贴的东西。
前一段时间我写了more detailed explanation with full code,它专门用于在剪贴板上复制和检索PNG和DIB。