【问题标题】:How to insert a picture in to Excel from C# app?如何从 C# 应用程序将图片插入 Excel?
【发布时间】:2012-07-30 07:13:50
【问题描述】:

我正在尝试使用我的 C# 应用程序将图片插入 Excel 电子表格。

我使用以下内容作为我的来源。 http://csharp.net-informations.com/excel/csharp-insert-picture-excel.htm

整行都带有蓝色下划线。

 xlWorkSheet.Shapes.AddPicture("C:\\pic.JPG", Microsoft.Office.Core.MsoTriState.msoFalse, Microsoft.Office.Core.MsoTriState.msoCTrue, 50, 50, 300, 45); 

我的代码:

private void btnWriteSpreedSheet_Click(object sender, EventArgs e)
{
    Excel.Application xlApp;
    Excel.Workbook xlWorkBook;
    Excel.Worksheet xlWorkSheet;
    object misValue = System.Reflection.Missing.Value;

    xlApp = new Excel.ApplicationClass();
    xlWorkBook = xlApp.Workbooks.Add(misValue);
    xlWorkSheet = (Excel.Worksheet)xlWorkBook.Worksheets.get_Item(1);

    //xlWorkSheet.SetBackgroundPicture("C:/Users/Shaun/Documents/Visual Studio 2010/Projects/TestXMLToEXCEL/TestXMLToEXCEL/bin/Debugpic.JPG"); //

    //add some text 
    xlWorkSheet.Cells[1, 1] = "http://csharp.net-informations.com";
    xlWorkSheet.Cells[2, 1] = "Adding picture in Excel File";

    xlWorkSheet.Shapes.AddPicture("C:\\pic.JPG", Microsoft.Office.Core.MsoTriState.msoFalse, Microsoft.Office.Core.MsoTriState.msoCTrue, 50, 50, 300, 45); //C:\\csharp-xl-picture.JPG

     xlWorkBook.SaveAs("csharp.net-informations.xls", Excel.XlFileFormat.xlWorkbookNormal, misValue, misValue, misValue, misValue, Excel.XlSaveAsAccessMode.xlExclusive, misValue, misValue, misValue, misValue, misValue);
    xlWorkBook.Close(true, misValue, misValue);
    xlApp.Quit();

    releaseObject(xlApp);
    releaseObject(xlWorkBook);
    releaseObject(xlWorkSheet);

    MessageBox.Show ("File created !");
}

private void releaseObject(object obj)
{
    try
    {
        System.Runtime.InteropServices.Marshal.ReleaseComObject(obj);
        obj = null;
    }
    catch (Exception ex)
    {
        obj = null;
        MessageBox.Show("Unable to release the Object " + ex.ToString());
    }
    finally
    {
        GC.Collect();
    }
}

错误信息:

最好的重载方法匹配 'Microsoft.Office.Interop.Excel.Shapes.AddPicture(字符串, Microsoft.Office.Core.MsoTriState,Microsoft.Office.Core.MsoTriState, float, float, float, float)' 有一些无效参数

“Microsoft.Office.Core.MsoTriState”类型在程序集中定义 没有被引用。您必须添加对装配“办公室”的引用, 版本=12.0.0.0,文化=中性,PublicKeyToken=71e9bce111e9429c'。

参数 2:无法从 'Microsoft.Office.Core.MsoTriState 转换 [c:\用户\肖恩\文档\视觉工作室 2010\Projects\TestXMLToEXCEL\TestXMLToEXCEL\CreateSpreadSheet.cs]' 到 'Microsoft.Office.Core.MsoTriState'

参数 3:无法从 'Microsoft.Office.Core.MsoTriState 转换 [c:\用户\肖恩\文档\视觉工作室 2010\Projects\TestXMLToEXCEL\TestXMLToEXCEL\CreateSpreadSheet.cs]' 到 'Microsoft.Office.Core.MsoTriState'


我的参考资料:

using Excel = Microsoft.Office.Interop.Excel;
using Microsoft.Office.Core;
using Microsoft.Office;
using System.Xml;

【问题讨论】:

  • 只需添加对Microsoft.Office.Core.dll 的引用。错误清楚地表明:The type 'Microsoft.Office.Core.MsoTriState' is defined in an assembly that is not referenced
  • 似乎您引用了一个版本,但它使用不同。您是否添加了对 v.12 dll 的引用?
  • 不,我似乎在引用 interop.Microsoft.Office.Core.dll,它的版本是 2.4.0.0,我在哪里可以找到,v.12 Microsoft.Office.Core 最新版本?

标签: c# excel


【解决方案1】:

添加以下引用:

  • Microsoft.Office.Interop.Excel 来自 .Net 选项卡
  • Microsoft Office 14.0 Object Library 来自 COM 选项卡

添加以下 using 语句:

using Microsoft.Office.Core;
using Excel = Microsoft.Office.Interop.Excel;
using System.Runtime.InteropServices;

然后是你的方法(略有改动):

private void BtnWriteSpreedSheetClick(object sender, EventArgs e)
{
    var xlApp = new Excel.Application();
    Excel.Workbook xlWorkBook = xlApp.Workbooks.Add();
    Excel.Worksheet xlWorkSheet = xlWorkBook.Sheets[1];

    xlWorkSheet.Cells[1, 1] = "http://csharp.net-informations.com";
    xlWorkSheet.Cells[2, 1] = "Adding picture in Excel File";

    xlWorkSheet.Shapes.AddPicture(@"C:\pic.JPG", MsoTriState.msoFalse, MsoTriState.msoCTrue, 50, 50, 300, 45);

    xlWorkBook.SaveAs("csharp.net-informations.xls", Excel.XlFileFormat.xlWorkbookNormal);
    xlWorkBook.Close(true);
    xlApp.Quit();

    Marshal.ReleaseComObject(xlApp);

    MessageBox.Show("File created !");
}

【讨论】:

  • 在我的应用程序图像插入是一个瓶颈。每个生成的 XLSX 文件至少有 300-400 张图像。当前解决方案调用 worksheet.Shapes.AddPicture() 方法的次数与图片数量一样多。这真的很慢。有没有办法让它更快?
  • 能否将 Internet 上的位置而不是本地文件用作 AddPicture() 的第一个参数,例如:“bla.com/someImage.png”?
【解决方案2】:

您需要添加 Microsoft excel 库。

【讨论】:

  • 尽管你的答案是四年前的,但你比我早了两个版本;我所有可用的是 MS Excel 12.0 对象库的 1.60 版。好吧,我也有 Excel 5.0,版本 1。
  • 好吧,这并没有帮助 - 我应该需要它来使用 MS.Office.Core,但后来得到了 922 build err msgs。所以我删除了它,并恢复到我已经拥有的东西。
【解决方案3】:

作为替代方案,您可以使用诸如EPPlus 之类的Open Xml 库来执行此操作。

在我看来,EPPlus 比 Excel 互操作更容易、更直观,无需手动释放资源。它还有一个额外的好处是它可以在没有安装 Excel 的机器上执行。

像这样简单的 EPPlus 效果很好:

using (var excel = new ExcelPackage())
{
    var wks = excel.Workbook.Worksheets.Add("Sheet1");
    wks.Cells[1, 1].Value = "Adding picture below:";
    var pic = wks.Drawings.AddPicture("MyPhoto", new FileInfo("image.png"));
    pic.SetPosition(2, 0, 1, 0);
    excel.SaveAs(new FileInfo("outputfile.xlsx"));
}

【讨论】:

    【解决方案4】:

    只需添加

    using Microsoft.Office.Interop.Excel;
    using Excel = Microsoft.Office.Interop.Excel;
    using Microsoft.Office.Core;
    

    到您的代码并在再次运行之前重建您的解决方案。

    【讨论】:

      【解决方案5】:

      我在 Microsoft.Office.Interop.Excel v 14.0 中使用此代码:

      xlWorksheet.Shapes.AddPicture(@"c:\pics\logosmall.jpg", Microsoft.Office.Core.MsoTriState.msoFalse, Microsoft.Office.Core.MsoTriState.msoCTrue, 0, 0, 185, 42);
      

      并且在我的 excel 表格中有图片(jpgpng)。

      【讨论】:

        【解决方案6】:
            private void Button1_Click(object sender, EventArgs e)
            {
        
                Microsoft.Office.Interop.Excel._Application application = new Microsoft.Office.Interop.Excel.Application();
                Microsoft.Office.Interop.Excel._Workbook workbook = application.Workbooks.Add(Type.Missing);
                Microsoft.Office.Interop.Excel._Worksheet worksheet = null;
        
                SaveFileDialog saveDialog = new SaveFileDialog();
                saveDialog.FileName = "ImageToExcel.xlsx";
                if (saveDialog.ShowDialog() == System.Windows.Forms.DialogResult.OK)
                {
                    try
                    {
                        worksheet = workbook.ActiveSheet;
                        worksheet.Name = "Image to Excel";
                        string imageNetworkLocation = "\\\\192.168.240.110\\images\\image.png";
                        worksheet.Shapes.AddPicture(imageNetworkLocation, Microsoft.Office.Core.MsoTriState.msoFalse, Microsoft.Office.Core.MsoTriState.msoCTrue, 0, 0, 170, 85);
                        workbook.SaveAs(saveDialog.FileName);
                    }
                    catch (Exception ex)
                    {
                        MessageBox.Show(ex.Message, "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
                    }
        
                    finally
                    {
                        application.Quit();
                        workbook = null;
                        application = null;
        
                    }
                }
        
                else
                    try
                    {
                        workbook.Close(0);
                        application.Quit();
                        workbook = null;
                        application = null;
                        System.Runtime.InteropServices.Marshal.ReleaseComObject(application);
                    }
                    catch (System.Exception ex) 
                    {
                        MessageBox.Show(ex.Message, "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
                    }
            }
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2012-11-13
          • 1970-01-01
          • 1970-01-01
          • 2013-05-11
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多