【问题标题】:c# excel. How pass workbook/sheet as referencec# excel。如何通过工作簿/工作表作为参考
【发布时间】:2018-04-17 00:29:41
【问题描述】:

我想在几个函数之间传递一个 Excel 工作簿/工作表作为参考,以便对其进行不同的操作。我一直在寻找几个小时,无法找到如何做到这一点。以这种方式在 Excel 工作表上工作的多个功能不是常见的做法吗?下面的代码不起作用..如果我按值传递也不起作用。

'System.Runtime.InteropServices.COMException:'来自 HRESULT 的异常:0x800401A8' '

pass_ref(ref xlWorkSheet1);  //call this


void pass_ref(ref Excel.Worksheet sheet) {

        MessageBox.Show("Pass Ref:" + sheet.Name); //can't produce sheet name
    }

【问题讨论】:

  • 首先,我认为将参数设置为 ref 不会导致此异常。其次,如果您不将sheet 重新分配给不同的工作表,则无需将其设为参考。它已经是一个引用类型,所以默认情况下它是通过引用传递的。这更有可能是由您使用 Excel 的方式引起的,例如根据stackoverflow.com/questions/10285549/…
  • 我在没有 'ref' 的情况下运行它。仍然没有工作。有些东西我没有到达这里。我是否必须声明一个完整的其他 excel 应用程序才能使其工作?
  • 您将工作表传递给不同的函数这一事实不会导致错误,因此实际上无关紧要。创建minimal reproducible example 可能很棘手,但添加一些有关您使用 Excel 应用程序或工作表所做的详细信息会有所帮助
  • 我在 excel 中创建了两列字符串。我可以从调用 pass_ref(xlWorkSheet) 的函数中做到这一点。我无法通过该工作表进行进一步修改。

标签: c# excel reference


【解决方案1】:
xlWorkBook.SaveAs(path, Excel.XlFileFormat.xlWorkbookNormal, misValue, misValue, misValue, misValue, Excel.XlSaveAsAccessMode.xlExclusive, misValue, misValue, misValue, misValue, misValue);

pass_ref(xlWorkSheet1);


xlWorkBook.Close(true, misValue, misValue);

找到了解决方法。在尝试传递工作表之前保存工作簿。这行得通。

【讨论】:

    【解决方案2】:

    有 3 种处理 Office 格式的基本方法,具体取决于您需要支持的那些。另一个可能会更好:

    • 您只需要新格式 (xlsx)。您可以使用 OpenXML SDK 或任何 Wrapper 类。在紧要关头,您也可以使用 ZipArchive 和 XMLReader 类来修改这些格式。它们只是 .zip 容器中的一堆 XML 文件。
    • 您需要支持新旧版本。 (t)rusty office COM 互操作是通常的方式。这是你现在选择的。当然,除了 COM 互操作固有的所有 正常 问题之外,它需要安装 office,并且不能从非交互式(服务、服务器)运行。我敢打赌你会遇到其中之一。
    • 需要支持新旧2:OleDB Provider。我只是被告知这个选项,并没有实际了解它。

    我总是建议使用 OpenXML SDK/选项 1。而不是限制支持的格式,然后返回 COM 方式。尽管不知道细节,但 OleDB 将是我的第二个赌注。如果没有其他方法,COM 最好留作备用解决方案。

    【讨论】:

    • 如何使用 COM 将工作簿或工作表传递给另一个函数?有可能吗?
    猜你喜欢
    • 2017-11-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多