【发布时间】:2023-03-12 04:51:02
【问题描述】:
直到最近,这个预定的 C# 控制台应用程序运行良好,但大约 2 周后,它在我开始使用 Excel 互操作的代码开头崩溃。
当我自己运行它时,它运行良好,但是当我尝试通过计划任务管理器执行它时(在 Windows Server 2008 r2 和 Windows Server 2016 上都存在同样的问题,两者都已正确安装 Excel 和有效的许可证密钥)它在我尝试启动它后立即崩溃。
(对不起,如果有我的赌注,否则我真的不习惯写“真正的”英语,如果有什么不清楚的,请不要害怕要求解释)。
计划任务管理器指出程序返回错误 0xE0434352。我已经搜索了一下,发现它实际上是一个通用错误号。所以我添加了一个 AppDomain 捕捉器来在日志文件中获取正确的错误号。我现在知道真正的错误是“HRESULT:0x800AC472”并抛出:
wb = xlApp.Workbooks.Add(XlWBATemplate.xlWBATWorksheet);
我已经测试过声明一个空工作簿,然后在其中添加一个工作表,或者使用“XlSheetType.xlWorksheet”而不是“XlWBATemplate.xlWBATWorksheet”,但仍然相同。只通过了一次,但出现同样的错误:
ws.Name = "名称";
我还阅读了有关 stackoverflow 错误的信息,但只创建了一个 Excel 进程,我尝试添加 Thread.Sleep(50//500//5000) 但它没有改变任何东西。 这是它崩溃的代码部分,我认为不需要代码的任何其他部分:
object misValue = System.Reflection.Missing.Value;
String part = "";
String pathD = "";
List<Part> partList = new List<Part>();
int ligne = 1;
Workbook wb = null;
Worksheet ws = null;
Microsoft.Office.Interop.Excel.Application xlApp = new Microsoft.Office.Interop.Excel.Application();
if (xlApp == null)
{
Console.WriteLine("EXCEL could not be started. Check that your office installation and project references are correct.");
return;
}
xlApp.Visible = false;
xlApp.DisplayAlerts = false;
foreach (StockRow stockRow in Requete.getStockRows())
{
if (stockRow.Part != part)
{
partList.Add(new Part(stockRow.PartCode, stockRow.Part));
if (wb != null)
{
ws.Range[ws.Cells[1, 1], ws.Cells[ligne, 9]].entirecolumn.autofit();
ws.Range[ws.Cells[1, 1], ws.Cells[ligne, 9]].entirerow.autofit();
ws.Range[ws.Cells[1, 1], ws.Cells[ligne, 9]].verticalalignment = XlVAlign.xlVAlignCenter;
if (!Directory.Exists(pathD))
{
Directory.CreateDirectory(pathD);
}
wb.SaveAs(pathD + "\\Stock_" + DateTime.Now.ToString("dd-MM-yyyy_HH") + "h.xlsx", XlFileFormat.xlOpenXMLWorkbook, misValue, misValue, false, false,
XlSaveAsAccessMode.xlNoChange, XlSaveConflictResolution.xlUserResolution, true, misValue, misValue, misValue);
wb.Close();
}
pathD = path + stockRow.PartCode;
wb = xlApp.Workbooks.Add(XlWBATemplate.xlWBATWorksheet);
ws = (Worksheet)wb.ActiveSheet;
ws.Name = "Name";
ws.PageSetup.Zoom = false;
ligne = 1;
ws.Cells[ligne, 1] = "Column Name";
ws.Cells[ligne, 2] = "Column Name";
ws.Cells[ligne, 3] = "Column Name";
ws.Cells[ligne, 4] = "Column Name";
ws.Cells[ligne, 5] = "Column Name";
ws.Cells[ligne, 6] = "Column Name";
ws.Cells[ligne, 7] = "Column Name";
ws.Cells[ligne, 8] = "Column Name";
ws.Cells[ligne, 9] = "Column Name";
//codes continue ...
}
// codes continue ...
}
// codes continue ...
我显然想知道为什么这现在不再起作用了,即使您没有完美的答案,即使是提示也将不胜感激。
非常感谢您阅读到这里。
【问题讨论】:
-
能否在目标主机任务调度程序之外的控制台中运行?
-
你说你是在服务器上运行它——这是否与 Excel 试图显示一个对话框有关,如this question?
-
在这样的共享服务器上尝试自动化 Excel 的通常反应是不要。真的一点都不安全。
-
@DavidG 是对的。微软很清楚automating Office on a server is not supported
-
基本上你没有释放你获得的 COM 对象。这样做太多次后,Excel 爆炸了
标签: c# scheduled-tasks excel-interop