2013-04-17 40 views
0

我想格式化一個Excel 2010文檔,該文件創建罰款和數據在那裏,但是當腳本任務去格式化文件它被損壞。我也注意到它只會讀取2個工作表中的第一個。這裏是代碼:ssis腳本任務損壞excel 2010文件

Dim lintLastRow As Integer 
    Dim lstrLastCol, lstrHeader As String 
    Dim mobjWorkbook As Workbook 
    Dim mappExcel As New Microsoft.Office.Interop.Excel.Application 
    Dim lobjWorksheet As Worksheet 
    Dim emptyBytes(0) As Byte 
    Dim oldCI As System.Globalization.CultureInfo = System.Threading.Thread.CurrentThread.CurrentCulture 
    System.Threading.Thread.CurrentThread.CurrentCulture = New System.Globalization.CultureInfo("en-US") 

    Try 
     mappExcel.Visible = False 
     mappExcel.DisplayAlerts = False 
     mappExcel.AskToUpdateLinks = False 
     mappExcel.AlertBeforeOverwriting = False 
     mobjWorkbook = mappExcel.Workbooks.Open(Dts.Variables("FilePath").Value + Dts.Variables("FileName").Value) 
     mobjWorkbook.RefreshAll() 
     Dts.Log("worksheet count: " & mobjWorkbook.Sheets.Count, 0, emptyBytes) 
     For Each lobjWorksheet In mobjWorkbook.Sheets 
      If lobjWorksheet.Name = "Compare" Then 
       lstrLastCol = "T" 
       lstrHeader = "- Compare Results" 
      Else 
       lstrLastCol = "H" 
       lstrHeader = "- Trans UnMatch" 
      End If 
      'Dts.Log("Set worksheet: " & lintCount, 0, emptyBytes) 
      'lobjWorksheet = mobjWorkbook.Sheets.Item(lintCount) 
      Dts.Log("worksheet select", 0, emptyBytes) 
      lobjWorksheet.Select() 
      lobjWorksheet.Range("A1").Select() 
      If lobjWorksheet.Cells(2, 1).value = Nothing Then 
       lintLastRow = 4 
      Else 
       lobjWorksheet.Application.Cells.End(XlDirection.xlDown).Select() 
       lintLastRow = lobjWorksheet.Application.ActiveCell.Row + 2 
      End If 
      Dts.Log("last row: " & lintLastRow, 0, emptyBytes) 
      lobjWorksheet.Rows(1).Insert(XlInsertShiftDirection.xlShiftDown, False) 
      lobjWorksheet.Rows(1).Insert(XlInsertShiftDirection.xlShiftDown, False) 
      lobjWorksheet.Cells(1, 1).value = "PAM - GL Portfolio Level " + lstrHeader + " for " + Today 
      lobjWorksheet.Range("A1", lstrLastCol + "1").Merge() 
      lobjWorksheet.Range("A1").RowHeight = 27 
      lobjWorksheet.Range("A1", lstrLastCol + "3").Font.Bold = True 
      lobjWorksheet.Range("C4", lstrLastCol & lintLastRow).NumberFormat = "0.00" ' = FormatNumber("#####.00"). 
      lobjWorksheet.Range("A3", lstrLastCol & lintLastRow).EntireColumn.AutoFit() 
      lobjWorksheet.Range("A1", lstrLastCol & lintLastRow).Font.Name = "Arial" 
      lobjWorksheet.Range("A1").Select() 
      Dts.Log("Complete Update", 0, emptyBytes) 
     Next 

     mobjWorkbook.Sheets("Compare").Select() 
     Dts.TaskResult = ScriptResults.Success 
    Catch ex As Exception 
     Dts.Events.FireError(0, "Format Excel Failed: ", _ 
     ex.Message & ControlChars.CrLf & ex.StackTrace, _ 
     String.Empty, 0) 
     Dts.TaskResult = ScriptResults.Failure 
    Finally 
     System.Threading.Thread.CurrentThread.CurrentCulture = oldCI 
     mobjWorkbook.Save() 
     mobjWorkbook.Close() 
     ReleaseCom(lobjWorksheet) 
     ReleaseCom(mobjWorkbook) 
     mappExcel.Quit() 
     ReleaseCom(mappExcel) 
     GC.Collect() 
     GC.WaitForPendingFinalizers() 
    End Try 

這對我的機器和試驗環境很好。當它投入生產時,事情會很快下降。對我所缺少的任何想法都會很棒。

感謝

+1

它以什麼方式損壞 - 你有錯誤嗎?你是否在宏之前打開它來驗證它是宏而不是先前的步驟?在所有四種情況下(在dev和prod之前和之後),將擴展名重命名爲.ZIP並提取XML並比較已損壞和未損壞的文件可能很有啓發 –

+0

我在腳本之前打開了該文件,看起來很好。我確實遇到了腳本錯誤試圖到達第二張紙的問題(索引錯誤,並且只有兩張紙)。如果腳本保存工作簿,則該文件已損壞。如果沒有,那麼我可以打開文件。 – sobrien

回答

0

轉換器已安裝,並且必須重新啓動,因爲服務器在本週末重新啓動,似乎一切正常。所以我認爲我們現在很好。

0

所以原來的問題,我相信是由不被安裝在服務器上的Excel轉換造成的。一旦安裝了,我開始得到以下錯誤:

OnError,PGIDSMSQL045,PRINCIPALUSA\TWSPGIAC,Formate Excel,{610A1615-E16E-4B62-8A93-F692A478FCF9},{EF8F3734-6467-423C-A9D3-BF2463EEFD44},04/18/2013 11:52:09 AM,04/18/2013 11:52:09 AM,0,0x,The server threw an exception. (Exception from HRESULT: 0x80010105 (RPC_E_SERVERFAULT)) at Microsoft.Office.Interop.Excel.Workbooks.Open(String Filename, Object UpdateLinks, Object ReadOnly, Object Format, Object Password, Object WriteResPassword, Object IgnoreReadOnlyRecommended, Object Origin, Object Delimiter, Object Editable, Object Notify, Object Converter, Object AddToMru, Object Local, Object CorruptLoad) 
    at ST_0391e3bc80224a34819c14be208559c5.vbproj.ScriptMain.Main() 
OnError,PGIDSMSQL045,PRINCIPALUSA\TWSPGIAC,PAM-GLPortLvlRecon,{008D2838-612E-4DBB-AEE7-65145ED0BAAC},{EF8F3734-6467-423C-A9D3-BF2463EEFD44},04/18/2013 11:52:09 AM,04/18/2013 11:52:09 AM,0,0x,The server threw an exception. (Exception from HRESULT: 0x80010105 (RPC_E_SERVERFAULT)) 
    at Microsoft.Office.Interop.Excel.Workbooks.Open(String Filename, Object UpdateLinks, Object ReadOnly, Object Format, Object Password, Object WriteResPassword, Object IgnoreReadOnlyRecommended, Object Origin, Object Delimiter, Object Editable, Object Notify, Object Converter, Object AddToMru, Object Local, Object CorruptLoad) 
    at ST_0391e3bc80224a34819c14be208559c5.vbproj.ScriptMain.Main() 
OnError,PGIDSMSQL045,PRINCIPALUSA\TWSPGIAC,Formate Excel,{610A1615-E16E-4B62-8A93-F692A478FCF9},{EF8F3734-6467-423C-A9D3-BF2463EEFD44},04/18/2013 11:52:09 AM,04/18/2013 11:52:09 AM,8,0x,The script returned a failure result. 
OnError,PGIDSMSQL045,PRINCIPALUSA\TWSPGIAC,PAM-GLPortLvlRecon,{008D2838-612E-4DBB-AEE7-65145ED0BAAC},{EF8F3734-6467-423C-A9D3-BF2463EEFD44},04/18/2013 11:52:09 AM,04/18/2013 11:52:09 AM,8,0x,The script returned a failure result. 
OnError,PGIDSMSQL045,PRINCIPALUSA\TWSPGIAC,Formate Excel,{610A1615-E16E-4B62-8A93-F692A478FCF9},{EF8F3734-6467-423C-A9D3-BF2463EEFD44},04/18/2013 11:52:09 AM,04/18/2013 11:52:09 AM,1,0x,System.Reflection.TargetInvocationException: Exception has been thrown by the target of an invocation. ---> System.NullReferenceException: Object reference not set to an instance of an object. 
    at ST_0391e3bc80224a34819c14be208559c5.vbproj.ScriptMain.Main() 
    --- End of inner exception stack trace --- 
    at System.RuntimeMethodHandle._InvokeMethodFast(Object target, Object[] arguments, SignatureStruct& sig, MethodAttributes methodAttributes, RuntimeTypeHandle typeOwner) 
    at System.RuntimeMethodHandle.InvokeMethodFast(Object target, Object[] arguments, Signature sig, MethodAttributes methodAttributes, RuntimeTypeHandle typeOwner) 
    at System.Reflection.RuntimeMethodInfo.Invoke(Object obj, BindingFlags invokeAttr, Binder binder, Object[] parameters, CultureInfo culture, Boolean skipVisibilityChecks) 
    at System.Reflection.RuntimeMethodInfo.Invoke(Object obj, BindingFlags invokeAttr, Binder binder, Object[] parameters, CultureInfo culture) 
    at System.RuntimeType.InvokeMember(String name, BindingFlags bindingFlags, Binder binder, Object target, Object[] providedArgs, ParameterModifier[] modifiers, CultureInfo culture, String[] namedParams) 
    at System.Type.InvokeMember(String name, BindingFlags invokeAttr, Binder binder, Object target, Object[] args, CultureInfo culture) 
    at Microsoft.SqlServer.Dts.Tasks.ScriptTask.VSTATaskScriptingEngine.ExecuteScript() 
OnError,PGIDSMSQL045,PRINCIPALUSA\TWSPGIAC,PAM-GLPortLvlRecon,{008D2838-612E-4DBB-AEE7-65145ED0BAAC},{EF8F3734-6467-423C-A9D3-BF2463EEFD44},04/18/2013 11:52:09 AM,04/18/2013 11:52:09 AM,1,0x,System.Reflection.TargetInvocationException: Exception has been thrown by the target of an invocation. ---> System.NullReferenceException: Object reference not set to an instance of an object. 
    at ST_0391e3bc80224a34819c14be208559c5.vbproj.ScriptMain.Main() 
    --- End of inner exception stack trace --- 
    at System.RuntimeMethodHandle._InvokeMethodFast(Object target, Object[] arguments, SignatureStruct& sig, MethodAttributes methodAttributes, RuntimeTypeHandle typeOwner) 
    at System.RuntimeMethodHandle.InvokeMethodFast(Object target, Object[] arguments, Signature sig, MethodAttributes methodAttributes, RuntimeTypeHandle typeOwner) 
    at System.Reflection.RuntimeMethodInfo.Invoke(Object obj, BindingFlags invokeAttr, Binder binder, Object[] parameters, CultureInfo culture, Boolean skipVisibilityChecks) 
    at System.Reflection.RuntimeMethodInfo.Invoke(Object obj, BindingFlags invokeAttr, Binder binder, Object[] parameters, CultureInfo culture) 
    at System.RuntimeType.InvokeMember(String name, BindingFlags bindingFlags, Binder binder, Object target, Object[] providedArgs, ParameterModifier[] modifiers, CultureInfo culture, String[] namedParams) 
    at System.Type.InvokeMember(String name, BindingFlags invokeAttr, Binder binder, Object target, Object[] args, CultureInfo culture) 
    at Microsoft.SqlServer.Dts.Tasks.ScriptTask.VSTATaskScriptingEngine.ExecuteScript() 

這一直那麼我曾經想更多的樂趣......但一個好的challange。 我有檢查變量,他們有正確的信息。用戶可以完全訪問輸出目錄,因爲它在前面的步驟中創建了該文件。所以我不確定我錯過了什麼。注意:整個過程在格式化.xls文件時起作用,所以我不確定.xlsx發生了什麼。 謝謝

+0

'對象引用未設置爲對象的實例.' ..可能意味着您有同樣的問題 - 它試圖找到第三個表並找不到它。所以通過腐敗你的意思是你試圖打開文件,它說什麼'我是腐敗'?什麼是確切的錯誤信息? –

+0

這是一個Excel錯誤(對不起,我沒有確切的錯誤)該文件已損壞,無法打開。我沒有看到剛剛安裝的轉換器。 – sobrien