2013-06-06 3 views
3

내 DataGrid 정보를 .csv 또는 Excel 파일로 내보내려면 어떻게해야합니까? .NET Framework 4.0에서 Microsoft Visual Studio 2010을 사용하고 있습니다.DataGrid를 CSV 또는 Excel로 내보내기

+0

을 사용하는 것을 :

여기이

ExportFile.ExportCSV(dt, "id,name", "Product ID,Name","order.csv"); 

를 호출하는 데 필요한 코드는 다음과 같습니다 CSV로 내보내기합니다.? – JSJ

답변

6

시도 (이것은 엑셀, PDF 및 Word 문서로 데이터를 내보낼 수있는 옵션이있다)에 대한 수출을 할 ReportViewer 컨트롤을 사용하는 것입니다 생각

private void btnexport_Click(object sender, RoutedEventArgs e) 
{ 
    ExportToExcel<Employee, Employees> s = new ExportToExcel<Employee, Employees>(); 
    s.dataToPrint = (Employees)dgEmployee.ItemsSource; 
    s.GenerateReport(); 
} 






/// <summary> 
/// Class for generator of Excel file 
/// </summary> 
/// <typeparam name="T"></typeparam> 
/// <typeparam name="U"></typeparam> 
public class ExportToExcel<T, U> 
    where T : class 
    where U : List<T> 
{ 
    public List<T> dataToPrint; 
    // Excel object references. 
    private Excel.Application _excelApp = null; 
    private Excel.Workbooks _books = null; 
    private Excel._Workbook _book = null; 
    private Excel.Sheets _sheets = null; 
    private Excel._Worksheet _sheet = null; 
    private Excel.Range _range = null; 
    private Excel.Font _font = null; 
    // Optional argument variable 
    private object _optionalValue = Missing.Value; 

    /// <summary> 
    /// Generate report and sub functions 
    /// </summary> 
    public void GenerateReport() 
    { 
     try 
     { 
      if (dataToPrint != null) 
      { 
       if (dataToPrint.Count != 0) 
       { 
        Mouse.SetCursor(Cursors.Wait); 
        CreateExcelRef(); 
        FillSheet(); 
        OpenReport(); 
        Mouse.SetCursor(Cursors.Arrow); 
       } 
      } 
     } 
     catch (Exception e) 
     { 
      MessageBox.Show("Error while generating Excel report"); 
     } 
     finally 
     { 
      ReleaseObject(_sheet); 
      ReleaseObject(_sheets); 
      ReleaseObject(_book); 
      ReleaseObject(_books); 
      ReleaseObject(_excelApp); 
     } 
    } 
    /// <summary> 
    /// Make Microsoft Excel application visible 
    /// </summary> 
    private void OpenReport() 
    { 
     _excelApp.Visible = true; 
    } 
    /// <summary> 
    /// Populate the Excel sheet 
    /// </summary> 
    private void FillSheet() 
    { 
     object[] header = CreateHeader(); 
     WriteData(header); 
    } 
    /// <summary> 
    /// Write data into the Excel sheet 
    /// </summary> 
    /// <param name="header"></param> 
    private void WriteData(object[] header) 
    { 
     object[,] objData = new object[dataToPrint.Count, header.Length]; 

     for (int j = 0; j < dataToPrint.Count; j++) 
     { 
      var item = dataToPrint[j]; 
      for (int i = 0; i < header.Length; i++) 
      { 
       var y = typeof(T).InvokeMember 
     (header[i].ToString(), BindingFlags.GetProperty, null, item, null); 
       objData[j, i] = (y == null) ? "" : y.ToString(); 
      } 
     } 
     AddExcelRows("A2", dataToPrint.Count, header.Length, objData); 
     AutoFitColumns("A1", dataToPrint.Count + 1, header.Length); 
    } 
    /// <summary> 
    /// Method to make columns auto fit according to data 
    /// </summary> 
    /// <param name="startRange"></param> 
    /// <param name="rowCount"></param> 
    /// <param name="colCount"></param> 
    private void AutoFitColumns(string startRange, int rowCount, int colCount) 
    { 
     _range = _sheet.get_Range(startRange, _optionalValue); 
     _range = _range.get_Resize(rowCount, colCount); 
     _range.Columns.AutoFit(); 
    } 
    /// <summary> 
    /// Create header from the properties 
    /// </summary> 
    /// <returns></returns> 
    private object[] CreateHeader() 
    { 
     PropertyInfo[] headerInfo = typeof(T).GetProperties(); 

     // Create an array for the headers and add it to the 
     // worksheet starting at cell A1. 
     List<object> objHeaders = new List<object>(); 
     for (int n = 0; n < headerInfo.Length; n++) 
     { 
      objHeaders.Add(headerInfo[n].Name); 
     } 

     var headerToAdd = objHeaders.ToArray(); 
     AddExcelRows("A1", 1, headerToAdd.Length, headerToAdd); 
     SetHeaderStyle(); 

     return headerToAdd; 
    } 
    /// <summary> 
    /// Set Header style as bold 
    /// </summary> 
    private void SetHeaderStyle() 
    { 
     _font = _range.Font; 
     _font.Bold = true; 
    } 
    /// <summary> 
    /// Method to add an excel rows 
    /// </summary> 
    /// <param name="startRange"></param> 
    /// <param name="rowCount"></param> 
    /// <param name="colCount"></param> 
    /// <param name="values"></param> 
    private void AddExcelRows 
    (string startRange, int rowCount, int colCount, object values) 
    { 
     _range = _sheet.get_Range(startRange, _optionalValue); 
     _range = _range.get_Resize(rowCount, colCount); 
     _range.set_Value(_optionalValue, values); 
    }  
    /// <summary> 
    /// Create Excel application parameters instances 
    /// </summary> 
    private void CreateExcelRef() 
    { 
     _excelApp = new Excel.Application(); 
     _books = (Excel.Workbooks)_excelApp.Workbooks; 
     _book = (Excel._Workbook)(_books.Add(_optionalValue)); 
     _sheets = (Excel.Sheets)_book.Worksheets; 
     _sheet = (Excel._Worksheet)(_sheets.get_Item(1)); 
    } 
    /// <summary> 
    /// Release unused COM objects 
    /// </summary> 
    /// <param name="obj"></param> 
    private void ReleaseObject(object obj) 
    { 
     try 
     { 
      System.Runtime.InteropServices.Marshal.ReleaseComObject(obj); 
      obj = null; 
     } 
     catch (Exception ex) 
     { 
      obj = null; 
      MessageBox.Show(ex.Message.ToString()); 
     } 
     finally 
     { 
      GC.Collect(); 
     } 
    } 
} 
+0

필자는 Employee를 나의 클래스 Mail 및 Employees 목록으로 바 꾸었습니다. 이 맞습니까? 다음과 같은 12 개의 오류가 표시됩니다. 'Excel'형식 또는 네임 스페이스 이름을 찾을 수 없습니다. 사용 지침이나 어셈블리 참조가 누락 되었습니까? – Sakul

+0

프로젝트에 Excel DLL이 포함되어 있습니까? 또한 Excel = Microsoft.Interop.Office.Excel; 네임 스페이스에. – JSJ

+0

솔루션 탐색기 -> 참조 추가 -> Microsoft.Office.Interop.Excel에서 참조를 마우스 오른쪽 버튼으로 클릭 한 다음 intellisense가 Excel을 Microsoft.Office.Interop.Excel로 바꾸라고 제안했습니다. 0 오류가 발생했습니다 ... 지금 사용해보십시오. 편집 : 완벽하게 작동합니다! 정말 고마워!!! – Sakul

0

내가 가장 빠르고 옵션은 보고서를 작성하고 샘플 아래

+0

그게 쉽지는 모르겠지만 보고서가 어떻게 작동하는지 모르겠습니다. 나에게 약간 혼란스럽게 보인다. – Sakul

+0

보고서의 시각적 모양을 만들 수있는 마법사가 있으므로 매우 간단합니다. 그런 다음 reportViewer를 응용 프로그램에 추가하고 보고서를 할당하면됩니다. 다음은 http://msdn.microsoft.com/en-us/library/ms252067(v=vs.80).aspx – NDraskovic

+0

Thx에 대한 답변이지만 도움이 될만한 Jodha 솔루션에 대한 링크입니다. – Sakul

1

datatable을 csv로 변환하는 다음 코드를 사용할 수 있습니다. 코드는 매우 유연하여 열 이름을 변경할 수 있고 열 수를 선택할 수 있습니다. 당신이

public class ExporFile 
{ 
    /// <summary> 
    /// Export to CSV 
    /// </summary> 
    /// <param name="exportTable">Export table</param> 
    /// <param name="showColumns">Columns needs to show in CSV</param> 
    /// <param name="changedColumnName">Changed Column Names in CSV</param> 
    /// <param name="fileName">File Name</param> 
    public static void ExportCSV(DataTable exportTable, string showColumns, string changedColumnName, string fileName) 
    { 
     DataTable filterTable = FilterColumn(exportTable, showColumns, changedColumnName); 
     string dataCSV = DataTable2CSV(filterTable, "\t", "\""); 
     dataCSV = System.Web.HttpContext.Current.Server.HtmlDecode(dataCSV); 
     System.Web.HttpContext.Current.Response.Charset = ""; 
     System.Web.HttpContext.Current.Response.ContentEncoding = System.Text.Encoding.Unicode; 
     System.Web.HttpContext.Current.Response.AddHeader("content-disposition", "attachment; filename=" + fileName); 
     System.Web.HttpContext.Current.Response.Write(dataCSV); 
     System.Web.HttpContext.Current.Response.Flush(); 
     try 
     { 
      System.Web.HttpContext.Current.Response.End(); 
     } 
     catch { }; 
    } 

    /// <summary> 
    /// Filter Columns 
    /// </summary> 
    /// <param name="exportTable"></param> 
    /// <param name="showColumns"></param> 
    /// <param name="changedColumnName"></param> 
    /// <returns></returns> 
    private static DataTable FilterColumn(DataTable exportTable, string showColumns, string changedColumnName) 
    { 
     DataView filterDataView = exportTable.DefaultView; 
     //filterDataView.Sort = "AutoID"; 
     DataTable filterTable = filterDataView.ToTable(false, showColumns.Split(',')); 
     return ChangedExportDataColumnName(filterTable, changedColumnName); 
    } 

    /// <summary> 
    /// Changed Column Datatable 
    /// </summary> 
    /// <param name="filterTable"></param> 
    /// <param name="changedColumnName"></param> 
    /// <returns></returns> 
    private static DataTable ChangedExportDataColumnName(DataTable filterTable, string changedColumnName) 
    { 
     string[] changedNames = changedColumnName.Split(','); 

     for (int i = 0; i < changedNames.Length; i++) 
     { 
      if (!String.IsNullOrEmpty(changedNames[i])) 
      { 
       filterTable.Columns[i].ColumnName = changedNames[i]; 
      } 
     } 
     return filterTable; 
    } 

    /// <summary> 
    /// Returns a CSV string corresponding to a datatable. However the separator can be defined and hence it can be any string separated value and not only csv. 
    /// </summary> 
    /// <param name="table">The Datatable</param> 
    /// <param name="separator">The value separator</param> 
    /// <param name="circumfix">The circumfix to be used to enclose values</param> 
    /// <returns></returns> 
    private static String DataTable2CSV(DataTable table, string separator, string circumfix) 
    { 

     StringBuilder builder = new StringBuilder(Convert.ToString((char)65279)); 
     foreach (DataColumn col in table.Columns) 
     { 
      builder.Append(col.ColumnName).Append(separator); 
     } 
     builder.Remove((builder.Length - separator.Length), separator.Length); 
     builder.Append(Environment.NewLine); 

     foreach (DataRow row in table.Rows) 
     { 
      foreach (DataColumn col in table.Columns) 
      { 
       builder.Append(circumfix).Append(row[col.ColumnName].ToString().Replace("\"", "\"\"")).Append(circumfix).Append(separator); 
      } 
      builder.Remove((builder.Length - separator.Length), separator.Length); 
      builder.Append(Environment.NewLine); 
     } 
     return builder.ToString(); 
    } 
} 
+0

코드가 wpf가 아닌 webform 용으로 만들어졌습니다! –