2017-06-20 20 views
1

我試圖在c#中生成的excel中存儲Datatable(SSIS ScriptTask)。從c生成的Excel不打開生成#

下面是我的代碼:

 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; 

我面臨什麼問題時,Excel生成。但是當我嘗試生成.xls時,它工作得很好。但是,當我嘗試生成.xlsx時,這不起作用。

任何人都可以幫助我嗎?

回答

2

嘗試使用Excel.XlFileFormat.xlOpenXMLWorkbook代替Excel.XlFileFormat.xlWorkbookNormal

[更新]

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

這個作品!謝謝!! –

1

警告 - 這是純粹的C#嘗試沒有SSIS。 這是我以前用過的一種方法,所以它可能根本沒有任何好的做法。如果可能的話,其他人應該改進它。 這是用於有2欄的DataTable。 TimeStamp爲1,值爲1。所以你必須適應它,因爲你需要它。

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."); 
     } 

可能是,你必須打開一個Excel文件並將其保存在你的代碼。至少這個錯誤發生在我創建我的發佈代碼的時候,所以這就是爲什麼我在代碼中再次打開文件並保存它。