以编程方式在Excel中导入图片变得太慢

时间:2011-02-21 16:58:57

标签: c# excel com

我编写了一个Windows窗体应用程序,其中对于Excel文件的每一行,我正在导入位于我的Intranet网络上的服务器中的jpg图片。 Excel文件由大约2000行组成。 插入图片的代码如下所示:

String currentFilePath = getCurrentFileName(pictureDirectory, stagione, currentLine, currentModello, currentMateriale, currentColore);
Excel.Range oRange = (Excel.Range)xlWorkSheet.Cells[rowIndex, indexColumnFoto];
Picture picture = ((Pictures)xlWorkSheet.Pictures(Type.Missing)).Insert(currentFilePath, Type.Missing);
picture.Left = (double)oRange.Left;
picture.Top = (double)oRange.Top;

if (picture.Height > (double)oRange.Height)
{
    if (picture.Height > 400)
    {
        oRange.RowHeight = 400;
    }
    else
    {
        oRange.RowHeight = picture.Height;
    }
}

此操作在BackgroundWorker中运行,一切正常,但一段时间后进程变得非常慢。 我在网上寻找解决方案,但我一无所获。我找到的唯一解决方案是相关的代码片段,它们在Excel中导入文本而不是图片。

如果您有任何想法,请告诉我。考虑到我的用户在抱怨,但我认为用于在Excel中导入1500-2000个图像的软件应该非常慢,不应该吗?

还有一件事,正如您所见,我使用COM来完成工作。有没有其他方法可以导入图片?

非常感谢!!!

2 个答案:

答案 0 :(得分:2)

使用COM并将数据从服务器中拉出来,正如您所做的那样,您可能只会在这里和那里进行一些调整,看到边际改进。

首先,对于Excel应用程序,您应该在例程开头设置Application.ScreenUpdating = false;,然后在完成后将其设置回Application.ScreenUpdating = true;。这有助于提高性能。

您可能还需要先考虑抓取所有图片,然后将它们放入List<T>对象中,其高度,目标oRangeoRange.RowHeight已预先确定,然后再将它们放入Excel中。当你在BackgroundWorker中运行它时,这可能是你想要做的。结合上面的#1,您可能会看到一些改进。

如果您使用的是Excel 2007/2010(这将与早期版本一起使用),您可以使用Open XML SDK。它可能会远远快得多。这不是客户端操作 - 在执行此操作时应关闭XLSX,但结果只会与从服务器通过线路传输图片一样慢。以下是使用SDK将多张图片插入Excel的示例:http://polymathprogrammer.com/2010/11/10/how-to-insert-multiple-images-in-excel-open-xml/

答案 1 :(得分:0)

C# - &gt; Office COM很慢。结束。我一直在使用EPPlus,虽然它允许您创建Excel无法打开的xlsx文件,但速度要快得多。它声称也做照片。