【问题标题】:save data in excel file -将数据保存在excel文件中 -
【发布时间】:2011-02-05 19:47:47
【问题描述】:

我有一个小型应用程序,最终用户可以将结果保存在 excel 文件中。一切看起来都很好,但几秒钟后出现 Microsoft Windows 通信:“Program Microsoft Office Excel stop working”。好的 - 输入它。

如果用户将数据保存为 *.xls 文件,则打开此文件没有问题 - 保存到此文件中的数据是正确的。

如果用户将数据保存为 *.xlsx 文件,则会出现问题。当我尝试打开此文件时,显示消息:“程序 Microsoft Excel 无法打开文件 *.xlsx,因为文件格式或扩展名错误。检查文件是否损坏以及文件扩展名是否与他的格式正确” .

我用来将数据保存为 excel 文件的代码如下:

public void SaveData(ExcelWriter ew)
    {
        SaveFileDialog saveFD = new SaveFileDialog();

        saveFD.InitialDirectory = "C:\\users\\Documents";
        saveFD.FileName = this._saveExcelFileName;
        saveFD.Filter = "excel 97-03(*.xls)|*.xls|excel 2007 (*.xlsx)|*.xlsx";
        saveFD.FilterIndex = 2;
        saveFD.RestoreDirectory = true;

        if (saveFD.ShowDialog() == DialogResult.OK)
        {
            try
            {
                this._saveExcelFileName = saveFD.FileName;
                ew.RunExcelWriter(_dt, _saveExcelFileName);
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message);
            }
        }
    }


    public void RunExcelWriter(DataTable DataT, string fileName)
    {
        StartExcel();
        GetANewWorkbook();
        GetTheActiveSheet();
        ProcessTheDataTable(DataT);
        SaveTheSheet(fileName);
        Clean();
    }

private void StartExcel()
    {
        // Start Excel and get Application object.
        oXL = new Excel.Application();
        // Set some properties
        oXL.Visible = true;
        oXL.DisplayAlerts = false;
    }

    private void GetANewWorkbook()
    {
        // Get a new workbook.
        oWB = oXL.Workbooks.Add(Missing.Value);
    }

    private void GetTheActiveSheet()
    {
        oSheet = (Excel.Worksheet)oWB.ActiveSheet;
        oSheet.Name= "Wyniki";
    }

    private void ProcessTheDataTable(DataTable DT)
    {

        int rowCount = 1;
        foreach (DataRow dr in DT.Rows)
        {
            rowCount += 1;
            for (int i = 1; i < DT.Columns.Count + 1; i++)
            {
                // Add the header the first time through
                if (rowCount == 2)
                {
                    oSheet.Cells[1, i] = DT.Columns[i - 1].ColumnName;
                    
                }
                oSheet.Cells[rowCount, i] = dr[i - 1].ToString();
            }
        }
        // Resize the columns
        oRange = oSheet.get_Range(oSheet.Cells[1, 1], oSheet.Cells[rowCount, DT.Columns.Count]);
        oRange.EntireColumn.AutoFit();
        //oRange.Style = oSheet.Cells.Style;      
    }

    private void SaveTheSheet(string FN)
    {
        oSheet = null;
        oRange = null;
        oWB.SaveAs(FN, Excel.XlFileFormat.xlWorkbookNormal,
            Missing.Value, Missing.Value, Missing.Value, Missing.Value,
            Excel.XlSaveAsAccessMode.xlShared,
            Missing.Value, Missing.Value, Missing.Value,
            Missing.Value, Missing.Value);
        
        if(oWB.Saved==true)
        {
            MessageBox.Show("Plik został zapisany pomyślnie");
        }
        else
        {
            MessageBox.Show("PLIKU NIE ZAPISANO");
        }
        
        oWB.Close(Missing.Value, Missing.Value, Missing.Value);
        oWB = null;
        oXL.Quit();
    }

如果有人知道为什么会这样? 非常感谢提前

更新 1:

建议的答案无效。我改成如下:

private void SaveTheSheet(string FN)
    {
        oSheet = null;
        oRange = null;
        oWB.SaveAs(FN, Excel.XlFileFormat.xlXMLSpreadsheet,
            Missing.Value, Missing.Value, Missing.Value, Missing.Value,
            Excel.XlSaveAsAccessMode.xlShared,
            Missing.Value, Missing.Value, Missing.Value,
            Missing.Value, Missing.Value);
        
        if(oWB.Saved==true)
        {
            MessageBox.Show("Plik został zapisany pomyślnie");
        }
        else
        {
            MessageBox.Show("PLIKU NIE ZAPISANO");
        }
        
        oWB.Close(Missing.Value, Missing.Value, Missing.Value);
        oWB = null;
        oXL.Quit();
    }

现在当我保存时有一条消息:

“来自 HRESULT 的异常:0x800A03EC

更新 2:

昨天我有点挣扎,在将数据写入 .xlsx 格式时,我设法获得了预期的效果。保存到 .xls 时,我仍然会收到关闭 excel 应用程序的 Microsoft Windows 消息,但至少(在批准另一个警告后)我可以打开这个文件。 下面是我用来保存为 .xlsx 格式的代码:

oWB.SaveAs(FN, Excel.XlFileFormat.xlWorkbookDefault,
                Missing.Value, Missing.Value, false, false,
                Excel.XlSaveAsAccessMode.xlNoChange,
                Missing.Value, Missing.Value, Missing.Value,
                Missing.Value, Missing.Value);

这是.xls

                oWB.SaveAs(FN, Excel.XlFileFormat.xlXMLSpreadsheet,
                Missing.Value, Missing.Value, Missing.Value, Missing.Value,
                Excel.XlSaveAsAccessMode.xlNoChange,
                Missing.Value, Missing.Value, Missing.Value,
                Missing.Value, Missing.Value);

请 - 任何建议都很重要。

【问题讨论】:

  • 您的问题没有获得多少浏览量。用您正在使用的编程语言对其进行标记可能会有所帮助。

标签: datatable export-to-excel savefiledialog excel


【解决方案1】:

就我而言,Excel.XlFileFormat.xlWorkbookDefaultExcel.XlFileFormat.xlOpenXMLWorkbook 也可以工作

 oWB.SaveAs(fileName, Excel.XlFileFormat.xlOpenXMLWorkbook, misValue, misValue, misValue, misValue, Excel.XlSaveAsAccessMode.xlExclusive, misValue, misValue, misValue, misValue, misValue);

 oWB.SaveAs(fileName, Excel.XlFileFormat.xlWorkbookDefault, misValue, misValue, misValue, misValue, Excel.XlSaveAsAccessMode.xlExclusive, misValue, misValue, misValue, misValue, misValue);

【讨论】:

    【解决方案2】:

    保存为 .xslx 时,请尝试使用 Excel.xlXMLSpreadsheet 而不是 Excel.XlFileFormat.xlWorkbookNormal

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-05-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多