2017-06-20 3 views
1

Ich versuche, Datentabelle in Excel zu speichern, die in C# (SSIS ScriptTask) generiert wird.Excel nicht geöffnet generiert von C#

Unten ist mein Code:

 OleDbDataAdapter A = new OleDbDataAdapter(); 
     System.Data.DataTable dt = new System.Data.DataTable(); 
     A.Fill(dt, Dts.Variables["User::ObjResultSet"].Value); 


     Excel.Application oXL = new Excel.ApplicationClass(); 
     Excel.Workbooks oWBs = oXL.Workbooks; 
     Excel.Workbook oWB = null; 
     Excel.Worksheet oSheet; 

     oWB = oWBs.Count > 0 ? oWB = oWBs[0] : oWBs.Add(System.Reflection.Missing.Value); 



     oXL.DisplayAlerts = false; 

     oWB = oXL.Workbooks.Add(Missing.Value); 

     oSheet = (Excel.Worksheet)oWB.Worksheets[1]; 

     int rowCount = 1; 
     foreach (DataRow dr in dt.Rows) 
     { 
      rowCount += 1; 
      for (int i = 1; i < dt.Columns.Count + 1; i++) 
      { 
       // Add the header time first only 
       if (rowCount == 2) 
       { 
        oSheet.Cells[1, i] = dt.Columns[i - 1].ColumnName; 
       } 
       oSheet.Cells[rowCount, i] = dr[i - 1].ToString(); 
      } 
     } 

     oWB.SaveAs(Dts.Variables["User::ExcelPath"].Value, Excel.XlFileFormat.xlWorkbookNormal, 
      Missing.Value, Missing.Value, Missing.Value, Missing.Value, 
      Excel.XlSaveAsAccessMode.xlExclusive, 
      Missing.Value, Missing.Value, Missing.Value, 
      Missing.Value, Missing.Value); 
     oWB.Close(false, Dts.Variables["User::ExcelPath"].Value, Missing.Value); 
     oWBs.Close(); 
     oXL.Quit(); 


     Dts.TaskResult = (int)ScriptResults.Success; 

Welches Problem I bin vor, excel erzeugt wird. Aber wenn ich versuche, .xls zu generieren, funktioniert es völlig in Ordnung. Aber das funktioniert nicht, wenn ich versuche, .xlsx zu generieren.

Kann mir jemand helfen?

Antwort

2

Try Excel.XlFileFormat.xlOpenXMLWorkbook statt Excel.XlFileFormat.xlWorkbookNormal

[aktualisiert]

oWB.SaveAs(Dts.Variables["User::ExcelPath"].Value, Excel.XlFileFormat.xlOpenXMLWorkbook, Missing.Value, Missing.Value, Missing.Value, Missing.Value,Excel.XlSaveAsAccessMode.xlExclusive, Missing.Value, Missing.Value, Missing.Value,Missing.Value, Missing.Value); 
+0

verwenden, das funktioniert !! Vielen Dank!! –

1

Warnung - es ist ein reines C# Versuch ohne dieses SSIS. Hier ist eine Herangehensweise, die ich vor einiger Zeit benutzt habe, also ist es wahrscheinlich ohne irgendeine gute Übung darin. Andere sollten es wenn möglich verfeinern, wenn sie es sehen. Dies wurde verwendet, um eine DataTable mit 2 Spalten zu haben. 1 für den Zeitstempel und 1 für einen Wert. Also musst du es so anpassen, wie du es brauchst.

private void createXLSXFromDataTable(System.Data.DataTable table, string path) 
     { 
      MemoryStream ms = new MemoryStream(); 
      using (ExcelPackage package = new ExcelPackage()) 
      { 
       ExcelWorksheet worksheet = package.Workbook.Worksheets.Add("data"); 
       worksheet.Cells["A1"].LoadFromDataTable(table,true); 
       worksheet.Column(1).Style.Numberformat.Format = "dd/mm/yyyy\\ hh:mm"; 
       worksheet.Column(1).Style.HorizontalAlignment = ExcelHorizontalAlignment.Right; 
       byte[] excelData = package.GetAsByteArray(); 
       ms.Write(excelData, 0, excelData.Length); 
      } 
      ms.Flush(); 
      using (FileStream fs = File.Create(pfad)) 
      { 
       ms.WriteTo(fs); 
      } 
      //open again with ms office, 
      //so the file will get saved correctly and 
      //all columns have the correct format 
      Microsoft.Office.Interop.Excel.Application application = new Microsoft.Office.Interop.Excel.Application(); 
      application.Visible = false; 
      Workbooks wbooks = application.Workbooks; 
      wbooks.Open(pfad, Origin: XlPlatform.xlWindows); 
      Workbook wbook = application.ActiveWorkbook; 
      wbook.Save(); 
      //quitting the services, 
      //after that delete/stop COM-connections of each object 
      wbook.Close(); 
      System.Runtime.InteropServices.Marshal.FinalReleaseComObject(wbook); 
      wbooks.Close(); 
      System.Runtime.InteropServices.Marshal.FinalReleaseComObject(wbooks); 
      application.Quit(); 
      System.Runtime.InteropServices.Marshal.FinalReleaseComObject(application); 
      MessageBox.Show("Document successfully created."); 
     } 

Es könnte sein, dass Sie wieder die Excel-Datei öffnen und es in Ihrem Code zu speichern. Zumindest ist mir dieser Fehler in der Zeit passiert, als ich meinen geposteten Code erstellt habe. Aus diesem Grund habe ich die Datei im Code erneut geöffnet und gespeichert.

Verwandte Themen