使用Microsoft.Office.Interop.Excel保存为.xlsx文件时出现SaveAs错误

41

我正在编写一个使用 Microsoft.Office.Interop.Excel 导出 DataTable 到 Excel 的模块,但在正式开始之前,我想先让基本操作起作用:打开文件、另存为和关闭文件。

我已经成功地以 .xls 扩展名打开并保存了文件,但是以 .xlsx 扩展名保存不起作用。它会生成 .xlsx 文件,但当我尝试打开它时,会出现以下错误:

Excel 无法打开文件“SomeFile.xlsx”,因为文件格式无效。请验证该文件未被损坏,并且文件扩展名匹配文件格式。

我用于打开、保存和关闭文件的代码如下:

Excel.Application excelApplication = new Excel.Application();
//excelApplication.Visible = true;
//dynamic excelWorkBook = excelApplication.Workbooks.Add();
Excel.Workbook excelWorkBook = excelApplication.Workbooks.Add();
//Excel.Worksheet wkSheetData = excelWorkBook.ActiveSheet;
int rowIndex = 1; int colIndex = 1;
excelApplication.Cells[rowIndex, colIndex] = "TextField";

// This works.
excelWorkBook.SaveAs("C:\\MyExcelTestTest.xls", Excel.XlFileFormat.xlWorkbookNormal,
    System.Reflection.Missing.Value, System.Reflection.Missing.Value, false, false,
    Excel.XlSaveAsAccessMode.xlShared, false, false, System.Reflection.Missing.Value,
    System.Reflection.Missing.Value, System.Reflection.Missing.Value);

// This does not!?
excelWorkBook.SaveAs("C:\\MyExcelTestTest.xlsx", Excel.XlFileFormat.xlWorkbookNormal, 
    System.Reflection.Missing.Value, System.Reflection.Missing.Value, false, false, 
    Excel.XlSaveAsAccessMode.xlShared, false, false, System.Reflection.Missing.Value, 
    System.Reflection.Missing.Value, System.Reflection.Missing.Value);

excelWorkBook.Close(Missing.Value, Missing.Value, Missing.Value);

我还尝试使用Excel.XlFileFormat.xlExcel12文件格式替换Excel.XlFileFormat.xlWorkbookNormal,但这样并没有写入成功,反而抛出了COMException异常:

HRESULT Exception: 0x800A03EC

非常感谢任何能够帮助解决这个问题的帮助。

编辑:我现在也尝试过:

excelWorkBook.SaveAs("C:\\MyExcelTestTest", Excel.XlFileFormat.xlExcel12, 
    System.Reflection.Missing.Value, System.Reflection.Missing.Value, false, false, 
    Excel.XlSaveAsAccessMode.xlShared, false, false, System.Reflection.Missing.Value, 
    System.Reflection.Missing.Value, System.Reflection.Missing.Value);

3
你的电脑上安装了哪个版本的Excel? - Jodrell
4个回答

103

以下是如何将相关文件保存为 Excel12(.xlsx)文件的方法...... 这并不是你最初直觉以为的,即使用Excel.XlFileFormat.xlExcel12,而是要使用Excel.XlFileFormat.xlOpenXMLWorkbook。实际的C#命令是:

excelWorkbook.SaveAs(strFullFilePathNoExt, Excel.XlFileFormat.xlOpenXMLWorkbook, Missing.Value,
    Missing.Value, false, false, Excel.XlSaveAsAccessMode.xlNoChange, 
    Excel.XlSaveConflictResolution.xlUserResolution, true, 
    Missing.Value, Missing.Value, Missing.Value);

Missing.Value 位于 System.Reflection 命名空间中。


2
这非常有帮助!我只需要稍微调整一下代码,就可以使用Office 2007库(版本12)了,如下:xlsWorksheet.SaveAs(filename, XlFileFormat.xlOpenXMLWorkbook, Missing.Value, Missing.Value, false, false, false, Missing.Value, Missing.Value); - Ted

11

尝试更改SaveAs调用中的第二个参数为Excel.XlFileFormat.xlWorkbookDefault。

我这样做后,生成了一个xlsx文件,我能够成功打开它。(在更改之前,我可以生成一个xlsx文件,但是无法打开它。)

另外,我不确定是否重要,但我正在使用Excel 12.0对象库。


不幸的是,这并没有起作用。使用Excel.XlFileFormat.xlWorkbookDefault会给我一个 .xls 文件。我正在使用新的 Excel 14.0 对象库进行参考... - MoonKnight
我不确定你所说的是它给你一个xls文件。我在我的计算机上安装了Excel 2007。如果我点击左上角的Office按钮,然后按Excel选项按钮,再选择保存,我会看到一个“以这种格式保存文件”的选项。我的显示为.xlsx。你的显示的是什么? - Steve
当我创建工作簿时,在Add方法中有一个参数:“workbook = excelApp.Workbooks.Add(Excel.XlWBATemplate.xlWBATWorksheet);”。此外,您可能已经知道了,但您可能希望考虑使用Open XML作为处理电子表格的替代方案。 - Steve
我们目前使用的是SpreadSheetgear,这是您可能遇到的最快的电子表格工具。然而,由于需要将当前项目移交给另一家公司/开发人员,因此我们使用了这个非常缓慢和笨重的COM接口。我还编写了一个导出程序,可以使用OleDb和Access数据库引擎处理Excel文件,但这不允许进行格式设置。非常感谢您的帮助。 - MoonKnight
1
我猜你会发现xlWorkbookDefault将其保存为用户定义的默认文件格式。 文件->选项->保存->“以此格式保存文件” - Roger Willcocks

1
    public static void ExportToExcel(DataGridView dgView)
    {
        Microsoft.Office.Interop.Excel.Application excelApp = null;
        try
        {
            // instantiating the excel application class
            excelApp = new Microsoft.Office.Interop.Excel.Application();
            Microsoft.Office.Interop.Excel.Workbook currentWorkbook = excelApp.Workbooks.Add(Type.Missing);
            Microsoft.Office.Interop.Excel.Worksheet currentWorksheet = (Microsoft.Office.Interop.Excel.Worksheet)currentWorkbook.ActiveSheet;
            currentWorksheet.Columns.ColumnWidth = 18;


            if (dgView.Rows.Count > 0)
            {
                currentWorksheet.Cells[1, 1] = DateTime.Now.ToString("s");
                int i = 1;
                foreach (DataGridViewColumn dgviewColumn in dgView.Columns)
                {
                    // Excel work sheet indexing starts with 1
                    currentWorksheet.Cells[2, i] = dgviewColumn.Name;
                    ++i;
                }
                Microsoft.Office.Interop.Excel.Range headerColumnRange = currentWorksheet.get_Range("A2", "G2");
                headerColumnRange.Font.Bold = true;
                headerColumnRange.Font.Color = 0xFF0000;
                //headerColumnRange.EntireColumn.AutoFit();
                int rowIndex = 0;
                for (rowIndex = 0; rowIndex < dgView.Rows.Count; rowIndex++)
                {
                    DataGridViewRow dgRow = dgView.Rows[rowIndex];
                    for (int cellIndex = 0; cellIndex < dgRow.Cells.Count; cellIndex++)
                    {
                        currentWorksheet.Cells[rowIndex + 3, cellIndex + 1] = dgRow.Cells[cellIndex].Value;
                    }
                }
                Microsoft.Office.Interop.Excel.Range fullTextRange = currentWorksheet.get_Range("A1", "G" + (rowIndex + 1).ToString());
                fullTextRange.WrapText = true;
                fullTextRange.HorizontalAlignment = Microsoft.Office.Interop.Excel.XlHAlign.xlHAlignLeft;
            }
            else
            {
                string timeStamp = DateTime.Now.ToString("s");
                timeStamp = timeStamp.Replace(':', '-');
                timeStamp = timeStamp.Replace("T", "__");
                currentWorksheet.Cells[1, 1] = timeStamp;
                currentWorksheet.Cells[1, 2] = "No error occured";
            }
            using (SaveFileDialog exportSaveFileDialog = new SaveFileDialog())
            {
                exportSaveFileDialog.Title = "Select Excel File";
                exportSaveFileDialog.Filter = "Microsoft Office Excel Workbook(*.xlsx)|*.xlsx";

                if (DialogResult.OK == exportSaveFileDialog.ShowDialog())
                {
                    string fullFileName = exportSaveFileDialog.FileName;
                   // currentWorkbook.SaveCopyAs(fullFileName);
                    // indicating that we already saved the workbook, otherwise call to Quit() will pop up
                    // the save file dialogue box

                    currentWorkbook.SaveAs(fullFileName, Microsoft.Office.Interop.Excel.XlFileFormat.xlOpenXMLWorkbook, System.Reflection.Missing.Value, Missing.Value, false, false, Microsoft.Office.Interop.Excel.XlSaveAsAccessMode.xlNoChange, Microsoft.Office.Interop.Excel.XlSaveConflictResolution.xlUserResolution, true, Missing.Value, Missing.Value, Missing.Value);
                    currentWorkbook.Saved = true;
                    MessageBox.Show("Error memory exported successfully", "Exported to Excel", MessageBoxButtons.OK, MessageBoxIcon.Information);
                }
            }
        }
        catch (Exception ex)
        {
            MessageBox.Show(ex.Message, "Exception", MessageBoxButtons.OK, MessageBoxIcon.Error);
        }
        finally
        {
            if (excelApp != null)
            {
                excelApp.Quit();
            }
        }



    }

0
myBook.Saved = true;
myBook.SaveCopyAs(xlsFileName);
myBook.Close(null, null, null);
myExcel.Workbooks.Close();
myExcel.Quit();

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接