2017-06-20 10 views
1

c#(SSIS ScriptTask)で生成されたExcelでDatatableを保存しようとしています。私が直面していますどのような問題Excelが開かれていないC#

 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; 

、生成されたエクセル:

以下は私のコードです。しかし、.xlsを生成しようとすると、完全に正常に動作します。しかし、私は.xlsxを生成しようとするとこれは動作しません。

誰でも手伝ってもらえますか?

答えて

2

に動作することを

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

[更新]の代わりにExcel.XlFileFormat.xlWorkbookNormal

Excel.XlFileFormat.xlOpenXMLWorkbookを使用してみてください!ありがとうございました!! –

1

警告 - それはSSISなしの純粋なC#試行です。 ここに私がしばらく前に使っていたアプローチがあります。だから、まったくいい練習がないのかもしれません。他の人は、可能であれば、それを見て、それを洗練してください。 これは、2列のDataTableを使用するために使用されました。 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ファイルを開いて、あなたのコードでそれを保存する必要があること、である可能性があります。投稿されたコードを作成したときに、少なくともそのエラーが発生してしまったので、コード内でファイルを開いて保存したのはこのためです。

関連する問題