【问题标题】:Exporting to .xlsx using Microsoft.Office.Interop.Excel SaveAs Error使用 Microsoft.Office.Interop.Excel SaveAs 错误导出到 .xlsx
【发布时间】:2012-04-03 21:51:33
【问题描述】:

我正在编写一个模块以使用 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 异常: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);

【问题讨论】:

  • 你的机器上安装了什么版本的Excel?

标签: c# excel winforms-interop


【解决方案1】:

这就是您将相关文件保存为 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 命名空间中。

【讨论】:

  • 这很有帮助!我只需稍微调整代码即可将 Office 2007 库(版本 12)用作 xlsWorksheet.SaveAs(filename, XlFileFormat.xlOpenXMLWorkbook, Missing.Value, Missing.Value, false, false, false, Missing.Value, Missing。值);
【解决方案2】:

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

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

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

【讨论】:

  • 不幸的是,这没有奏效。使用 Excel.XlFileFormat.xlWorkbookDefault 给我一个 .xls 文件。我正在使用新的 Excel 14.0 对象库作为参考...
  • 我不确定它给你一个 xls 文件是什么意思。我的机器上有 Excel 2007。如果我点击左上角的 Office 按钮,按 Excel 选项按钮,然后选择保存,我会看到“以这种格式保存文件”选项。我的说.xlsx。你说什么?
  • 创建工作簿时,Add方法中有一个参数:“workbook = excelApp.Workbooks.Add(Excel.XlWBATemplate.xlWBATWorksheet);”此外,您可能已经知道这一点,但您可能希望研究 open xml 作为使用电子表格的替代方法。
  • 我们目前与 SpreadSheetgear 合作,这是您可能遇到的最快的电子表格工具。但是,我们需要将当前项目移交给另一家公司/一组开发人员,因此使用这个非常缓慢和笨重的 COM 接口。我还编写了一个导出文件,可以使用 OleDb 和 Access Database Engin 执行 excel 文件,但这不允许格式化。非常感谢您的帮助。
  • 我怀疑您会发现 xlWorkbookDefault 将其保存为用户定义的默认文件格式。文件 -> 选项 -> 保存 -> “以这种格式保存文件”
【解决方案3】:
    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();
            }
        }



    }

【讨论】:

    【解决方案4】:
    myBook.Saved = true;
    myBook.SaveCopyAs(xlsFileName);
    myBook.Close(null, null, null);
    myExcel.Workbooks.Close();
    myExcel.Quit();
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-07-18
      • 2015-04-27
      • 2014-05-07
      相关资源
      最近更新 更多