【问题标题】:Excel Interop Save as is giving compatibility checker in excel 2007Excel 互操作另存为在 excel 2007 中提供兼容性检查器
【发布时间】:2013-08-24 09:11:31
【问题描述】:

这是我的SaveAs 方法代码:

m_FilePath="D:\Build\abc.xlsx"
m_objOpt=System.Reflection.Missing.Value;
m_objBook.SaveAs(m_FilePath, m_objOpt, m_objOpt,
    m_objOpt, m_objOpt, m_objOpt, XlSaveAsAccessMode.xlShared,
    m_objOpt, m_objOpt, m_objOpt, m_objOpt, m_objOpt);

现在我的问题不是如何禁用兼容性检查器,这已经被回答了很多次。我的问题是为什么兼容性检查器会出现。 excel如何知道该文件有excel 2003的痕迹。D:\ Build是空的。

【问题讨论】:

  • 我知道您正在打开一个 2003-Excel 文件,对其进行某些修改,然后依靠此代码将其保存为 2007(或更高版本)文件吗?
  • 我没有让你明白你说打开 2003-Excel 文件的地方?是的,我的开发环境有 excel 2003,但是使用它的客户端有 excel 2007
  • 我的意思是一个 *.xls 文件。问题是:您是否使用此代码打开 *.xls 文件并将其保存为 *.xlsx 文件?
  • @varocarbas 不,我没有打开任何已经保存的 xls,这是创建的新实例
  • 显然互联网连接不会很快恢复并且无法提供帮助。尽管如此,我的回答与 Chris 的回答(为他 +1)类似

标签: c# excel excel-interop


【解决方案1】:

如果要创建特定版本的Excel文件,你必须在SaveAs方法中设置正确的FileFormat

即使在路径中设置了.xls,如果没有指定文件格式,也会使用运行版本的Excel,使用SaveAs方法保存文件。这意味着如果您使用 Excel 2007 或更高版本打开 Excel 1997-2003 文件,如果您不设置 FileFormat 参数,SaveAs 方法将默认将文件保存为 Excel 2007 文件。

可选对象。保存文件时使用的文件格式。为一个 有效选项列表,请参阅 FileFormat 属性。对于现有的 文件,默认格式是最后指定的文件格式; 对于新的 文件,默认为正在使用的 Excel 版本格式


如果我想同时保存 2003 和 2007取决于系统安装的是哪个excel?

不要像您一样设置文件格式,或者xlWorkbookDefault 是您想要在 2003 和 2007 上保存时使用的文件格式,具体取决于系统中安装的 Excel。

您需要检测当前版本的 Excel 以便在文件名中设置正确的扩展名(.xls 或 .xlsx)。如果扩展名与实际使用的文件格式不对应,打开文件时会提示扩展名与文件格式不对应。

或者,你提出的方案好像没有在fileName中设置扩展名,让Excel在检测到Excel版本后根据你指定的fileFormat用正确的扩展名完成fileName。你在这里使用:

  • 56:xlExcel8Excel8
  • 46 : xlXMLSpreadsheet Excel 电子表格格式。

关于FileFormat的链接


另请注意,如果您在 Excel 2003 文件中使用某些 Excel 2007 功能,它不会阻止显示兼容性检查器。要隐藏消息,您可以将Application.DisplayAlerts 属性设置为false

【讨论】:

  • 如果我想同时保存 2003 年和 2007 年的文件格式应该是什么,具体取决于系统中安装的 excel 文件
  • @Shrivallabh 不要像你一样设置文件格式,或者xlWorkbookDefault 是如果你想根据系统中安装的 excel 在 2003 和 2007 上保存时使用的文件格式。您需要检测当前版本的 Excel,以便在文件名中设置正确的扩展名(.xls 或 .xlsx)。如果扩展名与所使用的实际文件格式不对应,则在您打开文件时,您将收到一条消息说扩展名与文件格式不对应。如果你愿意,我可以用某种方式更新我的答案。
  • @Shrivallabh 但是如果您在 Excel 2003 文件中使用某些 Excel 2007 功能,它不会阻止显示兼容性检查器。要隐藏消息,您可以将 Application.DisplayAlerts 属性设置为 False。
  • 很高兴能帮上忙 :)。我将编辑我的答案以反映我的最后一个 cmets,因为我没有正确理解你试图做什么。
  • 对我来说,正如你在最后所说的那样,这是格式的问题。非常感谢!
【解决方案2】:

我做了这样的事情:

if (11.0 < Convert.ToDouble(report.Version))
          {
              //For excel 2003
              workbook.SaveAs(filename, 56, Missing.Value, Missing.Value, Missing.Value, Missing.Value, XlSaveAsAccessMode.xlShared, Missing.Value, Missing.Value, Missing.Value, Missing.Value, Missing.Value);
           }
          else
          {
            //For excel 2007 and above
        workbook.SaveAs(filename, 51, misval, misval, misval, misval, XlSaveAsAccessMode.xlShared, misval, misval, misval, misval, misval);
            }

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2010-12-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-08-06
    • 1970-01-01
    • 2011-07-15
    相关资源
    最近更新 更多