为什么我的电子表格保存为.xlsx扩展名,但是直到我将其更改为.xls才会发生?

我打开一个现有的.xlsx文件,对其进行更改,然后将其保存回磁盘。 更改正在工作,但是当我尝试打开文件(手动,通过在Windows资源pipe理器中双击),我得到“ Excel无法打开文件'Bla.xlsx',因为文件格式或文件扩展名无效validation文件没有被损坏,并且文件的扩展名与文件的格式相匹配。

如果我将扩展名从“xlsx”更改为“xls”,打开就好了。 但原始文件是.xlsx,我想保持这种方式。 这是我的代码:

// Open the file MSExcel.Excel.ApplicationClass xlApp = new MSExcel.Excel.ApplicationClass(); MSExcel.Excel.Workbook xlBook = xlApp.Workbooks.Open(sourceFilename, 0, false, 5, null, null, false, MSExcel.Excel.XlPlatform.xlWindows, null, true, false, 0, true, false, false); MSExcel.Excel.Sheets xlSheets = xlBook.Worksheets; MSExcel.Excel.Worksheet xlSheet = (MSExcel.Excel.Worksheet)xlSheets.Item[1]; // Change the file MSExcel.Excel.Range priceTypeCell = (MSExcel.Excel.Range)xlSheet.Cells[7, 3]; //if (priceTypeCell.Value2.ToString() == "Price Push") <= This is probably fine, but just in case... if (priceTypeCell.Value2.ToString().Trim().Contains("Price Push")) { priceTypeCell.Value2 = "Price Type"; } // Save the file - example code showed xlWorkbookDefault, but that either never existed or // has been deprecated; xlWorkbookNormal is what I chose from the limited available options xlApp.DisplayAlerts = false; // Was prompting about overwriting the existing file xlBook.SaveAs(sourceFilename, Microsoft.Office.Interop.Excel.XlFileFormat.xlExcel7, Type.Missing, Type.Missing, false, false, Microsoft.Office.Interop.Excel.XlSaveAsAccessMode.xlNoChange, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing); xlBook.Close(); 

我正在使用的代码有什么问题? 我从这里调整它(Igby Largeman的答案),但不得不改变xlWorkbookDefault,因为这是不被认可的。 我尝试了xlWorkbookNormal和xlExcel7,但都保存为.xlsx,但只有在更改为.xls时才会打开。

奇怪的是,也许, xlWorkbookDefault确实在这里的官方列表(最后一项)。

UPDATE

当我将types更改为“ Microsoft.Office.Interop.Excel.XlFileFormat.xlXMLSpreadsheet ”(最接近我find的“ xlOpenXMLWorkbook ”)时,如果以后以编程方式重新打开保存的文件,则会收到exception:

 System.Runtime.InteropServices.COMException was unhandled HelpLink=C:\Program Files (x86)\Microsoft Office\Office12\1033\XLMAIN11.CHM HResult=-2146827284 Message=Excel cannot open the file 'ARAMARK-04-03-2016 DISTRIBUTOR COPY.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. 

更新2

当我试图使用“ xlExcel9795 ”,它甚至不会保存它。 我有:

 System.Runtime.InteropServices.COMException was unhandled HResult=-2146827284 Message=Exception from HRESULT: 0x800A03EC Source=Microsoft.Office.Interop.Excel ErrorCode=-2146827284 StackTrace: at Microsoft.Office.Interop.Excel.WorkbookClass.SaveAs(Object Filename, Object FileFormat, Object Password, Object WriteResPassword, Object ReadOnlyRecommended, Object CreateBackup, XlSaveAsAccessMode AccessMode, Object ConflictResolution, Object AddToMru, Object TextCodepage, Object TextVisualLayout, Object Local) at PricePushETLProcess.PricePushFile.ChangeColumnHeaderVal(PricePushFile ppf) in . . . 

您将它保存为Excel 95 – 请参阅:

https://msdn.microsoft.com/en-us/library/microsoft.office.interop.excel.xlfileformat.aspx

将Microsoft.Office.Interop.Excel.XlFileFormat.xlExcel7更改为一种新的格式。

我相信最新的格式将是Excel.XlFileFormat.xlOpenXMLWorkbook

这工作:

 xlBook.SaveAs(sourceFilename, Type.Missing, Type.Missing, Type.Missing, false, false, Microsoft.Office.Interop.Excel.XlSaveAsAccessMode.xlNoChange, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing); 

(平底船)。

IOW,而不是指定一种types的Excel文件,通过在SaveAs()的调用中为该(second)参数指定“Type.Missing”,使其保持空白或默认。

这是整个dadblasted的事情:

 public void ChangeColumnHeaderVal() { MSExcel.Excel.ApplicationClass xlApp = null; MSExcel.Excel.Workbook xlBook = null; MSExcel.Excel.Worksheet xlSheet = null; try { // Open the file xlApp = new MSExcel.Excel.ApplicationClass(); xlBook = xlApp.Workbooks.Open(sourceFilename, 0, false, 5, null, null, false, MSExcel.Excel.XlPlatform.xlWindows, null, true, false, 0, true, false, false); var xlSheets = xlBook.Worksheets; //Get the first Sheet xlSheet = (MSExcel.Excel.Worksheet)xlSheets.Item[1]; // Change the file MSExcel.Excel.Range priceTypeCell = (MSExcel.Excel.Range)xlSheet.Cells[7, 3]; //if (priceTypeCell.Value2.ToString() == "Price Push") <= This is probably fine, but just in case... if (priceTypeCell.Value2.ToString().Trim().Contains("Price Push")) { priceTypeCell.Value2 = "Price Type"; } // Save the file xlApp.DisplayAlerts = false; // Was prompting about overwriting the existing file xlBook.SaveAs(sourceFilename, Type.Missing, Type.Missing, Type.Missing, false, false, Microsoft.Office.Interop.Excel.XlSaveAsAccessMode.xlNoChange, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing); xlBook.Close(); } finally { // Cleanup if (xlSheet != null) Marshal.ReleaseComObject(xlSheet); if (xlBook != null) Marshal.ReleaseComObject(xlBook); if (xlApp != null) xlApp.Quit(); GC.Collect(); GC.WaitForPendingFinalizers(); } }