2016-06-07 8 views
2

Когда я запускаю пакет SSIS Интерактивно я получаю сообщение об ошибке Ссылка на объект не установлена ​​в экземпляр объекта по заданию сценария во время выполнения.C# Excel Worksheet Ссылка на объект не установлена ​​в экземпляр объекта

Так я отлажен код с помощью точек разрыва и после того, как происходит шаг за шагом код не на этой линии objExcelWbk.Close(true, Type.Missing, Type.Missing);

Я проверил все мои ссылки они все там и импорт тоже хорошо.

Функция приводится ниже

public void FormatExcel_DVP(string strFinalFileName, string ExcelOutputFolder, SqlConnection Conn) 
{ 
    Microsoft.Office.Interop.Excel.ApplicationClass objExcelApp = new Microsoft.Office.Interop.Excel.ApplicationClass(); 
    Microsoft.Office.Interop.Excel.Workbook objExcelWbk = default(Excel.Workbook); 
    Microsoft.Office.Interop.Excel.Worksheet objWrksheet = default(Excel.Worksheet); 
    string sFilePath = string.Empty; 
    DataSet ds = new DataSet(); 
    string DVP_Name = string.Empty; 
    string sFilename = string.Empty; 

    int RowCount = 0; 
    try 
    { 
     SqlCommand cmd = new SqlCommand("select distinct LTRIM(RTRIM(DVP_Name))as DVP_Name from SBBCP_DVP_SVP Order By DVP_Name", Conn); 
     SqlDataAdapter _da = new SqlDataAdapter(cmd); 
     _da.Fill(ds); 


     if (ds.Tables[0].Rows.Count > 0) 
     { 
      foreach (DataRow dr in ds.Tables[0].Rows) 
      { 
       DVP_Name = dr[0].ToString().Trim().Replace("'", "''"); 
       sFilename = DVP_Name.Trim(); 

       sFilePath = strFinalFileName + ExcelOutputFolder.Trim() + sFilename; 

       if (System.IO.File.Exists(sFilePath)) 
       { 
        objExcelWbk = objExcelApp.Workbooks.Open(sFilePath.Trim(), Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing); 
        objExcelApp.DisplayAlerts = false; 
        objExcelApp.Visible = false; 

        objWrksheet = (Excel.Worksheet)objExcelWbk.Worksheets["Details"]; 
        ((Microsoft.Office.Interop.Excel._Worksheet)objWrksheet).Activate(); 

        Microsoft.Office.Interop.Excel.Range range; 

        range = (Excel.Range)objWrksheet.get_Range("A1:J1", Type.Missing); 

        range.Interior.ColorIndex = 15; 
        range.Interior.Pattern = Microsoft.Office.Interop.Excel.XlPattern.xlPatternSolid; 
        range.NumberFormat = "@"; 
        range.HorizontalAlignment = Microsoft.Office.Interop.Excel.XlHAlign.xlHAlignCenter; 
        range.VerticalAlignment = Microsoft.Office.Interop.Excel.XlVAlign.xlVAlignCenter; 
        range.WrapText = true; 
        range.Font.Bold = true; 
        range.Font.Name = "Arial"; 
        range.Font.Size = 10; 
        range.AutoFilter(1, Type.Missing, Microsoft.Office.Interop.Excel.XlAutoFilterOperator.xlAnd, Type.Missing, true); 


        RowCount = objWrksheet.UsedRange.Rows.Count; 
        range = objWrksheet.get_Range("A2:J2", "A" + RowCount + ":J" + RowCount); 
        range.WrapText = true; 


        FormatPivotTable(ref objExcelWbk, "Summary"); 
        objExcelWbk.SaveAs(sFilePath, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Excel.XlSaveAsAccessMode.xlNoChange, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing); 
       } 
      } 
     } 
     objExcelWbk.Close(true, Type.Missing, Type.Missing); 
     objExcelApp.Quit(); 
    } 
    catch (Exception e) 
    { 
     throw e; 
    } 
} 
+1

ObjExcelWbk открыт для каждой строки данных, и только если файл открыт, однако он закрыт уже давно вне этой области. Итак, да, я надеюсь, что там будут моменты, когда он терпит неудачу. – BugFinder

+0

@BugFinder вы правы, когда я отлаживаю его, не входит в оператор if. Значит, вы хотите положить его внутрь, если инструкция, но из стороны для каждого цикла да? –

+0

Поместите его в тот же блок кода, что и он создан/создан. В вашем случае if (файл существует). –

ответ

1

В своем коде вы имеете

for each row 
{ 
    if file exists 
    { 
    open spreadsheet. 
    do stuff 
    } 
} 
Close spreadsheet 

проблема заключается в том, что может быть senarios где ваша электронная таблица не был открыт, и его пытаются закрыть его, но он hadnt были установлены.

Вы должны закрыть электронную таблицу в той же области, в которой вы ее открыли, поэтому в моем псевдокоде, после того, как «сделайте материал», - тогда, если вы открыли его, так как он не забил или не умер, у вас есть что-то, что вы можете закрыть ,

+0

Другим вариантом, который может сделать ваш код более эффективным, было бы перемещение открытия электронной таблицы перед каждой строкой, если у вас на 99% вероятность того, что у вас всегда будет 1 или больше вещей, - похоже, вы открываете тот же таблицу для каждой итерации. – BugFinder

 Смежные вопросы

  • Нет связанных вопросов^_^