【问题标题】:Importing Excel Charts from Excel to PowerPoint causes `RPC_E_SERVERFAULT` on some machines将 Excel 图表从 Excel 导入 PowerPoint 会在某些机器上导致 `RPC_E_SERVERFAULT`
【发布时间】:2018-03-25 15:22:10
【问题描述】:

这很烦人。我创建了一种将工作簿中的所有 Excel 图表复制到 PowerPoint 幻灯片的方法。

public int ImportExcelChartsFromWorkbookToSlides(int startingSlideIndex, string workbookPath, string[] slideTitles, int chartPosTop, int chartPosLeft = 10, int titleWidth = 680, int titleHeight = 20, int titlePosTop = 90, int titlePosLeft = 20, int titleFontSize = 18)
{
    int slideIndex = startingSlideIndex;
    int titleIndex = 0;
    EXCL.Application objExclApp = new EXCL.Application();
    EXCL.Workbook objWorkbook = objExclApp.Workbooks.Open(workbookPath, Editable: false);
    foreach (EXCL.Worksheet objSheet in objWorkbook.Worksheets)
    {
        foreach (EXCL.ChartObject objChart in objSheet.ChartObjects())
        {
            AddBlankSlide(slideIndex);
            AddTextBox(titleWidth.ToString(), titleHeight.ToString(), titlePosTop.ToString(), titlePosLeft.ToString());
            AddTextBoxParagraph(slideTitles[titleIndex], fontSize: titleFontSize.ToString(), useThemeFont: true);

            // Copy Chart from Sheet to Slide
            objChart.CopyPicture();

            PPT.ShapeRange objShapeRange = objSlide.Shapes.Paste();

            objShapeRange.Left = chartPosLeft;
            objShapeRange.Top = chartPosTop;

            slideIndex++;
            titleIndex++;

            Marshal.ReleaseComObject(objChart);
            Marshal.ReleaseComObject(objShapeRange);
        }
        Marshal.ReleaseComObject(objSheet);
    }
    objWorkbook.Close();
    objExclApp.Quit();
    Marshal.ReleaseComObject(objWorkbook);
    Marshal.ReleaseComObject(objExclApp);
    objWorkbook = null;
    objExclApp = null;
    return slideIndex;
}

通常情况下,这在我的机器上运行良好,但有些用户报告了此方法的RPC_E_SERVERFAULT。 (HRESULT: 0x80010105)

此方法中的某个地方导致了问题。要么是这个问题,要么是办公室安装不同的问题,内存问题或导致问题的加载项。我已经在其他几台机器上尝试过这个,但它们仍然可以工作。

【问题讨论】:

    标签: c# .net interop office-interop excel-interop


    【解决方案1】:

    我在尝试将图表添加到 Excel 时也遇到了 (HRESULT 异常:0x80010105 (RPC_E_SERVERFAULT)) 的问题。我发现这是由我的文件的访问模式设置引起的,这些设置是通过 Excel 和我自己的代码在文件中设置的。

    我发布了我的解决方案,在我的情况下效果很好,在另一个主题中,您可以查看here。我希望这会对那里的人有所帮助!

    【讨论】:

      【解决方案2】:

      我在使用 ChartObject.Copy() 方法时遇到了类似的问题。当我尝试使应用程序可见以查看是否显示任何对话框时,它实际上最终修复了 RPC 错误。作为一种解决方法,我在运行 ChartObject.Copy() 和其他操作之前执行了以下操作以打开 excel 应用程序并使其短暂可见但最小化。

      var excel = new Microsoft.Office.Interop.Excel.Application();
      excel.WindowState = Microsoft.Office.Interop.Excel.XlWindowState.xlMinimized;
      excel.Visible = true;
      var workbooks = excel.Workbooks;
      var workbook = workbooks.Open(excelFilePath, ReadOnly: false);
      excel.Visible = false;
      

      【讨论】:

        【解决方案3】:

        RPC_E_SERVERFAULT 令人讨厌且难以诊断。当 Excel 崩溃时,您会收到此错误。没有任何细节,这种崩溃应该由应用程序本身报告。这没有发生,更糟糕的是,即使发生了一些相当糟糕的事情,Excel 也会继续运行。除非您得到一台出现此问题的机器,否则您无法在此类事故上取得任何真正的进展。

        然而,找到其他受害者并不难,只需谷歌“chartobject rpc_e_serverfault”。它们看起来都和你的一样。减去一个很好的解决方案。

        对于潜在的问题,我有一个相当好的理论。问题在于,微软已经设法保持 Office 互操作接口兼容 19 年。相当惊人的成就,虽然没有什么小事,但每个人都认为是理所当然的事情,但它已经耗尽了燃料。图表作为常见的麻烦制造者值得注意。

        看看IChartObject interface 的定义。在 Office 2013 和 2003 定义之间来回切换。并注意神秘的_Copy() 方法添加。似乎完全没有必要,因为已经有一个 Copy() 方法。并且没有记录。

        这是个问题。如果您在 VS 中使用 GoTo Definition 查看接口定义,请注意它是接口表中的 second 方法。这是一个很大很大的问题。它破坏了接口的二进制兼容性。

        后果是可怕的,如果您使用 Office 2013 的互操作库来构建您的程序并且用户在他的机器上安装了 Office 2003(或 2007,无法确定),那么您程序中的 CopyPicture() 调用将完全调用错误的实现方法。大概是 Cut(),一种不带参数的方法。这很糟糕,如果方法本身没有内爆,那么堆栈不平衡会导致各种破坏。 RPC_E_SERVERFAULT 是预期的结果。

        所以一个可行的理论是,这会在具有旧 Office 版本的机器上炸弹。除了构建使用 2003 互操作库的程序的另一个版本并指示 IT 人员在分发它时要小心之外,您对此几乎无能为力。到目前为止,升级机器是一种简单的解决方法。

        【讨论】:

        • 感谢汉斯提供的信息。我们所有的用户都在使用 Office 2013,但是对于不同的用户,设置总是不同的,这总是很难诊断
        • 您认为一个好的解决方法是将图表保存为图像,然后导入图片吗?我知道这是一个冗长的方法,但它删除了剪贴板元素
        • 不知道你是怎么做到的。请记住,如果我的理论是正确的,那么这与剪贴板没有任何关系,并且 所有 IChartObject 的成员都会有麻烦。除了第一个。
        猜你喜欢
        • 2011-09-15
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多