问:Interop.Excel打开两个File实例

时间:2016-05-31 16:06:03

标签: c# windows excel excel-interop

我有一个C#程序,它从.txt文件创建一个Excel文件报告。

它完美无缺,但有时(经常)当我打开电子表格时,Excel会打开2个电子表格:

1表示我保存的文件。 1带有一些垃圾数据称为" Plan1"哪个没有保存。

我不确定excel在哪里找到Plan1的垃圾数据。

以下是保存电子表格的代码:

protected string ExportOC(Application app, OcFile oc, bool configurator) 
{
    string ocFinalName;
    if (configurator)
        ocFinalName = string.Format("{0}{1}", ocFinalName = oc.Name, Models.Constants.CHECK_CONFIGURATOR);
    else if (oc.Error)
        ocFinalName = string.Format("{0}{1}", ocFinalName = oc.Name, Models.Constants.CHECK_STRUCT_ERROR);
    else
        ocFinalName = string.Format("{0}{1}", ocFinalName = oc.Name, Models.Constants.CHECK_OK);
    try 
    {
        string savePath = string.Format("{0}{1}", Importer.GetPathWithType(ConfigurationManager.AppSettings[Modelos.Constants.SAVE_ROOT_PATH].ToString(), oc.Type), ocFinalName);
        app.DisplayAlerts = false;
        app.ActiveWorkbook.WebOptions.Encoding = Microsoft.Office.Core.MsoEncoding.msoEncodingUTF8;
        app.ActiveWorkbook.SaveAs(savePath, XlFileFormat.xlOpenXMLWorkbook, Missing.Value,Missing.Value, false, false, XlSaveAsAccessMode.xlNoChange,XlSaveConflictResolution.xlUserResolution,true,Missing.Value, Missing.Value, Missing.Value);
        return string.Format("{0}{1}", ocFinalName, Models.Constants.EXTENSION_EXCEL_X);
    } 
    catch (Exception) 
    {
        return InvalidOC(oc, Models.Constants.CHECK_NO_SAVED);
    } finally 
    {
        ClearCOM(app);
    }
}

以下是我如何清理COM对象:

protected void ClearCOM(Application app) 
{
    try 
    {
        app.DisplayAlerts = false;
        app.ActiveWorkbook.Close(0);
        app.Quit();
        Marshal.ReleaseComObject(app);
    }
    catch 
    {
        return;
    }
}

我不确定是否应该在此处打开代码来打开电子表格,因为即使我在程序外打开文件也会出现此问题(只要我关注的话,这个问题经常发生在内部)。

感谢您的帮助

修改

工作表的名称必须包含特殊字符,如:5198416384684_003 这是我创建COM对象的方法。

public string ProcessOC(OcFile oc) {
    Application app = new Application();
    Workbook workbook = app.Workbooks.Add(1);
    Worksheet plan = (Worksheet)workbook.Sheets[1];
    plan.Name = oc.Name; 
    bool rightSize = false;
    bool haveMoreDocuments = false;
    int indexLine = 1, indexColumn = 1;
    int lin = 1, col = 0;
    string columnLetter = String.Empty;
    string ajusteTextoNum = String.Empty;

    try {
        List<string> validLines = GetValidContent(oc.Lines);

        foreach (string line in validLines) {
            //get the txt lines and put all of them im the worksheet
        }

        // format the worksheet 

        return ExportOC(app, oc, false);

    } catch (WrongPrinterException) {
        return InvalidOC(oc, Modelos.Constants.CHECK_NO_PRINTER); //doesn't save
    } catch (MissingFileException) {
        return InvalidOC(oc, Modelos.Constants.CHECK_MISS_SOURCE_FILE); //doesn't save
    } catch (Exception) {
        return InvalidOC(oc, Modelos.Constants.CHECK_NO_SAVED); //doesn't save
    } finally {
        ClearCOM(app);
    }
}

和问题本身。

enter image description here

很抱歉忽略一些价值观,这是公司的政治因素。 这一次,我在程序之外打开了这些数据,并不是真的很垃圾,它是另一种格式不同的报告,操作员可能以前关闭过。

也许Excel正在尝试恢复以前的会话。

我将尝试清理其他COM对象并使用Marshal.ReleaseComObject。

编辑2

我尝试清除COM对象,但仍然会立即打开2个电子表格。

这里是清除COM的代码

protected void ClearCOM(Application app, Workbook workbook, Worksheet worksheet) {
    try {
        app.DisplayAlerts = false;
        app.ActiveWorkbook.Close(0);
        Marshal.ReleaseComObject(workbook);
        Marshal.ReleaseComObject(worksheet);
        app.Quit();
        Marshal.ReleaseComObject(app);
    } catch {
        return;
    }
}

编辑3

我已经清理了XLSTART文件夹,但仍然没有

1 个答案:

答案 0 :(得分:1)

对于仍然有此问题的任何人。我通过使用 Workbooks.Add 方法创建一个 Workbook 而没有给它任何参数来解决它。 所以在 OPs 问题中,改变这个:

Application app = new Application();
Workbook workbook = app.Workbooks.Add(1);

为此:

Application app = new Application();
Workbook workbook = app.Workbooks.Add(); // No parameters

Add 方法有一个可选的 Template 参数,它可以是 XlWBATemplate 类型。 OP 使用 1 作为此参数的值,在这种情况下它不是有效值。

这是文档中关于忽略参数的说明:

<块引用>

如果省略此参数,Microsoft Excel 将创建一个包含许多空白工作表的新工作簿(工作表数由 SheetsInNewWorkbook 属性设置)。