У меня есть небольшое приложение, где пользователь в конце может сохранить результаты в файле 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);
Пожалуйста - любой совет важен.