сохранить данные в файле Excel - - PullRequest
0 голосов
/ 05 февраля 2011

У меня есть небольшое приложение, где пользователь в конце может сохранить результаты в файле Excel. Все выглядит хорошо, но через несколько секунд после этого появляется сообщение Microsoft Windows: «Программа Microsoft Office Excel перестает работать». Окей - любишь его.

Если пользователь сохраняет данные как файл * .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 я все еще получаю сообщение Microsoft Windows, чтобы закрыть приложение Excel, но по крайней мере (после утверждения другого предупреждения) я могу открыть этот файл. Ниже код, который я использую для сохранения в формате .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);

Пожалуйста - любой совет важен.

Ответы [ 2 ]

2 голосов
/ 28 марта 2012

В моем случае также работает Excel.XlFileFormat.xlWorkbookDefault и Excel.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);
0 голосов
/ 05 февраля 2011

При сохранении в формате .xslx попробуйте использовать Excel.xlXMLSpreadsheet вместо Excel.XlFileFormat.xlWorkbookNormal

...