我有一个 C# 程序,它使用 Excel Interop 创建、编写和保存一个 excel 文件。问题是,如果我在保存并关闭 excel 文件后没有立即退出应用程序,那么 c# 应用程序会出现未处理的异常并崩溃。有没有人找到一种方法来做到这一点,同时能够保持主机 c# 应用程序打开和运行。
这是处理涉及 Excel 互操作的所有内容的代码
class CreateExcelDoc
{
string newFormString = trialReportForm.newFormString;
string fileString=trialReportForm.fileString;
int sheetCount;
string trialString = trialReportForm.trialString;
string dateString = trialReportForm.dateString;
string saveString = trialReportForm.saveSting;
System.Windows.Forms.Timer excelTimer = new System.Windows.Forms.Timer();
private Excel.Application app = null;
private Excel.Workbook workbook = null;
private Excel.Worksheet worksheet = null;
private Excel.Range workSheet_range = null;
public CreateExcelDoc()
{
createDoc();
}
public void createDoc()
{
try
{
app = new Excel.Application();
//app.Visible = false;
if (startForm.exportOwnerString == "Yes")
{
app.Visible = true;
startForm.exportOwnerString = " ";
}
else
{
app.Visible = false;
}
if (startForm.excelActionFlag=="addNewTrialReport")
{
workbook = (Excel.Workbook) app.Workbooks.Add(1);
//workbook.SaveAs(newFileForm.desktopPath + "\\" + "OB "+trialReportForm.otrClubNameString+" - "+trialReportForm.otrDateString);
worksheet = (Excel.Worksheet)workbook.Worksheets[1];
//fileNameString = newFileForm.desktopPath + "\\OB " + trialReportForm.otrClubNameString + " " + trialReportForm.otrDateString;
workbook.Worksheets[1].Name = trialReportForm.trialReportDate+" Trial "+trialReportForm.trialReportTrialNumber;
}
else if (startForm.excelActionFlag == "ownerContacts")
{
workbook = (Excel.Workbook)app.Workbooks.Add(1);
worksheet = (Excel.Worksheet)workbook.Worksheets[1];
workbook.Worksheets[1].Name = "Owner Contacts";
}
else if (startForm.excelActionFlag == "newExcelResults")
{
string testFile = Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData) + "\\test";
workbook = (Excel.Workbook)app.Workbooks.Add(1);
worksheet = (Excel.Worksheet)workbook.Worksheets[1];
workbook.Worksheets[1].Name = "Event 1 Results";
//workbook.SaveAs(testFile, Missing.Value, Missing.Value, Missing.Value, false);
//workbook.SaveAs(Environment.GetFolderPath(Environment.SpecialFolder.Desktop)+"\\Results", Missing.Value, Missing.Value, Missing.Value, false);
//workbook.SaveAs(startForm.excelFileLocation, Missing.Value, Missing.Value, Missing.Value, false);
//fileNameString = registrationForm.regFileLocation + "\\OB " + registrationForm.regClubName + " " + registrationForm.regDateString;
}
else if (dogForm.dogRegistrationExcel == "Yes")
{
workbook = (Excel.Workbook)app.Workbooks.Add(1);
workbook.SaveAs(dogForm.filePath, Missing.Value, Missing.Value, Missing.Value, false);
}
else if (newFormString == "No")
{
//workbook = app.Workbooks.Open(fileString, Missing.Value, false, Missing.Value, Missing.Value, Missing.Value, Missing.Value, Missing.Value, Missing.Value, true, Missing.Value, Missing.Value, Missing.Value, Missing.Value, Missing.Value);
// workbook.Close(true,fileString,Missing.Value);
workbook = (Excel.Workbook)app.Workbooks.Open(fileString, Missing.Value, false, Missing.Value, Missing.Value, Missing.Value, Missing.Value, Missing.Value, Missing.Value, true, Missing.Value, Missing.Value, Missing.Value, Missing.Value, Missing.Value);
}
if (newFormString=="Yes"®istrationForm.formString=="OTR")
{
//string sheetName = "Trial Report - " + dateString + " " + trialString;
worksheet = (Excel.Worksheet)workbook.Worksheets[1];
workbook.Worksheets[1].Name =trialReportForm.otrDateString+" Trial " + trialReportForm.otrTrialString;
//workbook.Worksheets[1].Name = "Trial Report - " + dateString + " " + trialString;
//workbook.Worksheets[1].Name = "Hello";
//Excel.Name name1 = worksheet.Names.Add("Trial Report - " + dateString + " " + trialString, Missing.Value, Missing.Value, Missing.Value, Missing.Value, Missing.Value, Missing.Value, Missing.Value, Missing.Value, Missing.Value, Missing.Value);
//worksheet.Name = "Trial Report - " + dateString + " " + trialString;
}
else if (newFormString == "Yes" & registrationForm.formString == "Registration")
{
//string sheetName = "Trial Report - " + dateString + " " + trialString;
worksheet = (Excel.Worksheet)workbook.Worksheets[1];
workbook.Worksheets[1].Name = "Results: "+registrationForm.selectedEvent;
//workbook.Worksheets[1].Name = "Trial Report - " + dateString + " " + trialString;
//workbook.Worksheets[1].Name = "Hello";
//Excel.Name name1 = worksheet.Names.Add("Trial Report - " + dateString + " " + trialString, Missing.Value, Missing.Value, Missing.Value, Missing.Value, Missing.Value, Missing.Value, Missing.Value, Missing.Value, Missing.Value, Missing.Value);
//worksheet.Name = "Trial Report - " + dateString + " " + trialString;
}
else if (startForm.excelActionFlag == "addExistingTrialReport")
{
workbook = (Excel.Workbook)app.Workbooks.Open(startForm.excelFileLocation, Missing.Value, false, Missing.Value, Missing.Value, Missing.Value, Missing.Value, Missing.Value, Missing.Value, true, Missing.Value, Missing.Value, Missing.Value, Missing.Value, Missing.Value);
sheetCount = workbook.Worksheets.Count;
int sheetCountPlusONe=sheetCount+1;
worksheet = (Excel.Worksheet)workbook.Worksheets.Add(Missing.Value,workbook.Worksheets[sheetCount],Missing.Value,Missing.Value);
workbook.Worksheets[sheetCountPlusONe].Name = trialReportForm.trialReportDate + " Trial " + trialReportForm.trialReportTrialNumber;
//worksheet.Move(Missing.Value, workbook.Worksheets[sheetCount]);
}
else if (startForm.excelActionFlag == "existingExcelResults")
{
workbook = (Excel.Workbook)app.Workbooks.Open(startForm.excelFileLocation, Missing.Value, false, Missing.Value, Missing.Value, Missing.Value, Missing.Value, Missing.Value, Missing.Value, true, Missing.Value, Missing.Value, Missing.Value, Missing.Value, Missing.Value);
sheetCount = workbook.Worksheets.Count;
int sheetCountPlusONe = sheetCount + 1;
worksheet = (Excel.Worksheet)workbook.Worksheets.Add(Missing.Value, workbook.Worksheets[sheetCount], Missing.Value, Missing.Value);
workbook.Worksheets[sheetCountPlusONe].Name = "Event " + sheetCountPlusONe.ToString() + " Results";
//worksheet.Move(Missing.Value, workbook.Worksheets[sheetCount]);
}
else if (dogForm.dogRegistrationExcel == "Yes")
{
worksheet = (Excel.Worksheet)workbook.Worksheets[1];
workbook.Worksheets[1].Name = dogForm.dogUKCNumber;
}
}
catch (Exception e)
{
Console.Write("Error");
}
/* if (trialReportForm.saveMe=="Yes")
{
workbook.Save();
workbook.Close();
}
*/
}
public void createHeaders(int row, int col, string htext, string cell1,
string cell2, int mergeColumns, string b, bool font, int size, string
fcolor)
{
worksheet.Cells[row, col] = htext;
workSheet_range = worksheet.get_Range(cell1, cell2);
workSheet_range.Merge(mergeColumns);
switch (b)
{
case "BLUE":
workSheet_range.Interior.Color = System.Drawing.Color.Red.ToArgb();
break;
case "GAINSBORO":
workSheet_range.Interior.Color =
System.Drawing.Color.Gainsboro.ToArgb();
break;
//case "Turquoise":
// workSheet_range.Interior.Color =
//System.Drawing.Color.Turquoise.ToArgb();
//break;
case "PeachPuff":
workSheet_range.Interior.Color =
System.Drawing.Color.PeachPuff.ToArgb();
break;
default:
// workSheet_range.Interior.Color = System.Drawing.Color..ToArgb();
break;
}
//workSheet_range.Borders.Color = System.Drawing.Color.Black.ToArgb();
//workSheet_range.Borders = null;
workSheet_range.Font.Bold = font;
workSheet_range.ColumnWidth = size;
//workSheet_range.HorizontalAlignment = ContentAlignment.BottomCenter;
if (startForm.excelActionFlag == "existingExcelResults" | startForm.excelActionFlag=="newExcelResults")
{
workSheet_range.HorizontalAlignment = Microsoft.Office.Interop.Excel.XlHAlign.xlHAlignCenter;
}
//workSheet_range.Cells.HorizontalAlignment = ContentAlignment.MiddleCenter;
workSheet_range.Font.Color = System.Drawing.Color.FloralWhite.ToArgb();
}
public void addData(int row, int col, string data,
string cell1, string cell2, string format)
{
worksheet.Cells[row, col] = data;
workSheet_range = worksheet.get_Range(cell1, cell2);
//workSheet_range.Borders.Color = System.Drawing.Color.Black.ToArgb();
workSheet_range.NumberFormat = format;
workSheet_range.HorizontalAlignment = Microsoft.Office.Interop.Excel.XlHAlign.xlHAlignLeft;
excelTimer.Tick += new EventHandler(excelTimer_Tick);
excelTimer.Interval = 6000;
excelTimer.Start();
}
void excelTimer_Tick(object sender, EventArgs e)
{
if (startForm.excelActionFlag != "ownerContacts")
{
if (startForm.excelActionFlag == "existingExcelResults" | startForm.excelActionFlag == "newExcelResults")
{
/* Excel.Range sortRange;
sortRange = worksheet.get_Range("A14", "K32");
Excel.Range scoreColumn;
scoreColumn = worksheet.get_Range("C14", "C32");
sortRange.Sort(scoreColumn, Excel.XlSortOrder.xlDescending);*/
Excel.Range valueRange;
Excel.Range placeRange;
placeRange = worksheet.get_Range("A14", "A" + (14 + (registrationForm.numberofCompetitors - 1)).ToString());
valueRange = worksheet.get_Range("A14", "K"+(14+(registrationForm.numberofCompetitors-1)).ToString());
valueRange.Sort(valueRange.Columns[3, Type.Missing], Excel.XlSortOrder.xlDescending, Type.Missing, Type.Missing, Excel.XlSortOrder.xlAscending, Type.Missing, Excel.XlSortOrder.xlAscending, Excel.XlYesNoGuess.xlGuess, Type.Missing, Type.Missing, Excel.XlSortOrientation.xlSortColumns, Excel.XlSortMethod.xlPinYin, Excel.XlSortDataOption.xlSortNormal, Excel.XlSortDataOption.xlSortNormal, Excel.XlSortDataOption.xlSortNormal);
placeRange.Sort(placeRange.Columns[1, Type.Missing], Excel.XlSortOrder.xlAscending, Type.Missing, Type.Missing, Excel.XlSortOrder.xlAscending, Type.Missing, Excel.XlSortOrder.xlAscending, Excel.XlYesNoGuess.xlGuess, Type.Missing, Type.Missing, Excel.XlSortOrientation.xlSortColumns, Excel.XlSortMethod.xlPinYin, Excel.XlSortDataOption.xlSortNormal, Excel.XlSortDataOption.xlSortNormal, Excel.XlSortDataOption.xlSortNormal);
}
// workbook.Close(true, Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData) + "\\Results.xls", Missing.Value);
workbook.Close(true, startForm.excelFileLocation, Missing.Value);
app.Quit();
Application.Exit();
/* workSheet_range = null;
worksheet = null;
workbook = null;
app = null;*/
//Thread.Sleep(5000);
// File.Move(Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData) + "\\Results.xls", startForm.excelFileLocation);
}
}
}