SaveCopyAs是与Excel当前的默认保存设置格式相关的,它不会根据文件名后缀来自动调整保存的格式,也就是说,如果你设置默认存储格式为Excel 97-2003 Workbook(.xls)格式,而SaveCopyAs参数里的文件名是.xlsx的话,其实真正的格式仍然是.xls的,在这种情况下,你用Excel 2007去打开这个.xlsx文件,Excel程序就无法识别文件,从而弹出这样的警告:
Excel 无法打开文件“xxxxx.xlsx”,因为文件格式或文件扩展名无效。请确定文件未损坏,并且文件扩展名与文件的格式匹配。
Excel cannot open the file 'xxxxx.xlsx' because the file format or file extension is not valid. Verify that the file has not been corrupted and that the file extension matches the format of the file.
因此,我们在调用SaveCopyAs之前最好探测一下当前的默认保存格式设置,本设置在如下注册表项中:
HKCU:Software\Microsoft\Office\12.0\Excel\Options\DefaultFormat(DWord)
若不存在本注册项,说明默认为OpenXML格式.xlsx,若存在,则0x38(56)是97-2003工作簿.xls格式,0x33(51)为.xlsx。
另外,用VSTO生成文档后,一般建议将其中的Customization关联代码去掉,否则外部用户打开文档时会出现令人讨厌的对话框。
defaultExtension = ".xlsx";
excel2007Options = Registry.CurrentUser.OpenSubKey("Software\\Microsoft\\Office\\12.0\\Excel\\Options");
if (excel2007Options != null)
{
int s = (int)excel2007Options.GetValue("DefaultFormat");
if (s == 56) defaultExtension = ".xls";
}
string filename = "workbookName" + defaultExtension;
if (System.IO.File.Exists(filename)) System.IO.File.Delete(filename);
this.SaveCopyAs(filename);
if (ServerDocument.GetCustomizationVersion(filename) == 3) ServerDocument.RemoveCustomization(filename);
excel2007Options = Registry.CurrentUser.OpenSubKey("Software\\Microsoft\\Office\\12.0\\Excel\\Options");
if (excel2007Options != null)
{
int s = (int)excel2007Options.GetValue("DefaultFormat");
if (s == 56) defaultExtension = ".xls";
}
string filename = "workbookName" + defaultExtension;
if (System.IO.File.Exists(filename)) System.IO.File.Delete(filename);
this.SaveCopyAs(filename);
if (ServerDocument.GetCustomizationVersion(filename) == 3) ServerDocument.RemoveCustomization(filename);