none
将blob图片通过剪切板粘贴到Excel单元格中 RRS feed

  • 问题

  • 我需要将oracle数据库中blob图片插入到Excel的单元格中。打算先将图片放在clipboard中,然后粘贴,但以下代码会抛出异常,请问如何处理?还有能否设置图片的尺寸?

    using (OracleDataReader dataReader = OracleHelper.GetReader(sql, connectionString))
    {
    	while (dataReader.Read())
    	{
    		if (dataReader["img"] != DBNull.Value)
    		{
    			MemoryStream memoryStream = new MemoryStream((byte[])dataReader["img"]);
    			Image image = Image.FromStream(memoryStream, true);
    			Clipboard.SetImage(image);
    
    			Excel.Range range = workSheet.Cells[i, 3];
    			range.Activate();
    			range.PasteSpecial();//抛出异常:类Range的PasteSpecial方法无效
    		}
    	}
    }

    2020年5月14日 3:57

答案

  • Hi leon1526,

    根据我的研究以及搜索,我发现range.PasteSpecial()只能粘贴exccel内部的东西,不能粘贴excel外面的东西 ,所以这个方法适用于剪贴板中的粘贴图像。

    我推荐你使用另外一种方法来实现对图片的添加。

    首先你需要根据你的image对象去生成一个图像文件。

    MemoryStream memoryStream = new MemoryStream((byte[])dataReader["img"]);
    Image image = Image.FromStream(memoryStream, true);
    string filename = "D:\\2.jpg";
    image.Save(filename);

    然后可以根据以下代码来添加图片。

        private void button1_Click(object sender, EventArgs e)
            {
                Excel.Application xlApp;
                Excel.Workbook xlWorkBook;
                Excel.Worksheet xlWorkSheet;
                object misValue = System.Reflection.Missing.Value;
    
                xlApp = new Excel.Application();
                xlWorkBook = xlApp.Workbooks.Add(misValue);
                xlWorkSheet = (Excel.Worksheet)xlWorkBook.Worksheets.get_Item(1);
    
                //add some text 
                xlWorkSheet.Cells[1, 1] = "http://csharp.net-informations.com";
                xlWorkSheet.Cells[2, 1] = "Adding picture in Excel File";
    
                xlWorkSheet.Shapes.AddPicture(filename, Microsoft.Office.Core.MsoTriState.msoFalse, Microsoft.Office.Core.MsoTriState.msoCTrue, 200, 300, 300, 400);
    
    
                xlWorkBook.SaveAs("D:\\test.xls", Excel.XlFileFormat.xlWorkbookNormal, misValue, misValue, misValue, misValue, Excel.XlSaveAsAccessMode.xlExclusive, misValue, misValue, misValue, misValue, misValue);
                xlWorkBook.Close(true, misValue, misValue);
                xlApp.Quit();
    
    
                MessageBox.Show("File created !");
                //range.PasteSpecial()
    
            }

    我加重的代码就是如何添加图片的代码,其中有4个参数,设置了图片的位置的同时,也设置了他的大小。

    希望这会帮到你。

    Best Regards,

    Jack


    MSDN Community Support
    Please remember to click "Mark as Answer" the responses that resolved your issue, and to click "Unmark as Answer" if not. This can be beneficial to other community members reading this thread. If you have any compliments or complaints to MSDN Support, feel free to contact MSDNFSF@microsoft.com.

    • 已标记为答案 leon1526 2020年5月22日 7:43
    2020年5月14日 9:08
    版主

全部回复

  • Hi leon1526,

    根据我的研究以及搜索,我发现range.PasteSpecial()只能粘贴exccel内部的东西,不能粘贴excel外面的东西 ,所以这个方法适用于剪贴板中的粘贴图像。

    我推荐你使用另外一种方法来实现对图片的添加。

    首先你需要根据你的image对象去生成一个图像文件。

    MemoryStream memoryStream = new MemoryStream((byte[])dataReader["img"]);
    Image image = Image.FromStream(memoryStream, true);
    string filename = "D:\\2.jpg";
    image.Save(filename);

    然后可以根据以下代码来添加图片。

        private void button1_Click(object sender, EventArgs e)
            {
                Excel.Application xlApp;
                Excel.Workbook xlWorkBook;
                Excel.Worksheet xlWorkSheet;
                object misValue = System.Reflection.Missing.Value;
    
                xlApp = new Excel.Application();
                xlWorkBook = xlApp.Workbooks.Add(misValue);
                xlWorkSheet = (Excel.Worksheet)xlWorkBook.Worksheets.get_Item(1);
    
                //add some text 
                xlWorkSheet.Cells[1, 1] = "http://csharp.net-informations.com";
                xlWorkSheet.Cells[2, 1] = "Adding picture in Excel File";
    
                xlWorkSheet.Shapes.AddPicture(filename, Microsoft.Office.Core.MsoTriState.msoFalse, Microsoft.Office.Core.MsoTriState.msoCTrue, 200, 300, 300, 400);
    
    
                xlWorkBook.SaveAs("D:\\test.xls", Excel.XlFileFormat.xlWorkbookNormal, misValue, misValue, misValue, misValue, Excel.XlSaveAsAccessMode.xlExclusive, misValue, misValue, misValue, misValue, misValue);
                xlWorkBook.Close(true, misValue, misValue);
                xlApp.Quit();
    
    
                MessageBox.Show("File created !");
                //range.PasteSpecial()
    
            }

    我加重的代码就是如何添加图片的代码,其中有4个参数,设置了图片的位置的同时,也设置了他的大小。

    希望这会帮到你。

    Best Regards,

    Jack


    MSDN Community Support
    Please remember to click "Mark as Answer" the responses that resolved your issue, and to click "Unmark as Answer" if not. This can be beneficial to other community members reading this thread. If you have any compliments or complaints to MSDN Support, feel free to contact MSDNFSF@microsoft.com.

    • 已标记为答案 leon1526 2020年5月22日 7:43
    2020年5月14日 9:08
    版主
  • 多谢你的回复,也考虑过Shapes.AddPicture,但更希望直接粘贴而不是产生图片文件再删除。

    如果不能直接粘贴,那也就只能这样了

    2020年5月15日 9:28