2017-02-21 30 views
0

我正在通過導入Excel文件來創建DataGrid。我希望用戶能夠手動更改應用程序中的列名稱。用戶輸入更改DataGrid中的列標題文本

編輯:解決方法底部

我的桌面應用程序,將有如下的邏輯:

  1. 加載Excel文件,並顯示錶中的DataGrid
  2. 手動更改列名固定的文本匹配。 (例如「PricesZZZ」列更名爲「Prices」,「LeadTimeXXX更改爲」LeadTime「)
  3. 將DataGrid導出到新的excel模板,只有與固定文本匹配的相關列(因此需要具有正確的 名稱)

Excel文件可以有多個列,只有幾個這些列有相關信息,並確定它們的唯一方法是要匹配的標題名稱或一些其他的方式有用戶「告訴」它列包含哪些信息程序。

我需要找到一種方法來改變列名基於用戶輸入,因爲我認爲這是最直接的。我是新來的C#很抱歉,如果我的想法是稍微向後一點。

以下是我到目前爲止的代碼片段。可能與此特定問題無關,但可能有助於可視化。我用EPPlus庫

導入Excel

private void btnOpenXL_Click(object sender, RoutedEventArgs e) 
{ 
    // Create OpenFileDialog 
    Microsoft.Win32.OpenFileDialog dlg = new Microsoft.Win32.OpenFileDialog(); 



    // Set filter for file extension and default file extension 
    dlg.DefaultExt = ".xls"; 
    dlg.Filter = "Excel Files|*.xlsx;*.xls;*.xlsm;*.csv"; 


    // Display OpenFileDialog by calling ShowDialog method 
    Nullable<bool> result = dlg.ShowDialog(); 


    // Get the selected file name 
    if (result == true) 
    { 
     // Open document 
     string filename = dlg.FileName; 

     //call another class to draw the table 
     dataGrid.ItemsSource = GetDataTableFromExcel(filename).DefaultView; 
     MessageBox.Show("import done"); 
    } 
} 

public static DataTable GetDataTableFromExcel(string path, bool hasHeader = true) 
{ 
    using (var pck = new OfficeOpenXml.ExcelPackage()) 
    { 
     using (var stream = File.OpenRead(path)) 
     { 
      pck.Load(stream); 
     } 
     var ws = pck.Workbook.Worksheets.First(); 
     DataTable tbl = new DataTable(); 
     foreach (var firstRowCell in ws.Cells[1, 1, 1, ws.Dimension.End.Column]) 
     { 
      tbl.Columns.Add(hasHeader ? firstRowCell.Text : string.Format("Column {0}", firstRowCell.Start.Column)); 
     } 
     var startRow = hasHeader ? 2 : 1; 
     for (int rowNum = startRow; rowNum <= ws.Dimension.End.Row; rowNum++) 
     { 
      var wsRow = ws.Cells[rowNum, 1, rowNum, ws.Dimension.End.Column]; 
      DataRow row = tbl.Rows.Add(); 
      foreach (var cell in wsRow) 
      { 
       row[cell.Start.Column - 1] = cell.Text; 
      } 
     } 
     return tbl; 
    } 
} 

導出Excel

private void btnExportToXL_Click(object sender, RoutedEventArgs e) 
{ 
    DataTable dataTable = new DataTable(); 
    dataTable = ((DataView)dataGrid.ItemsSource).ToTable(); 
    ExportDataTableToExcel(dataTable); 
    MessageBox.Show("export done"); 
} 

public void ExportDataTableToExcel(DataTable dataTable) 
{ 
    string path = "C:\\test"; 
    var newFile = new FileInfo(path + "\\" + 
           DateTime.Now.Ticks + ".xlsx"); 
    using (ExcelPackage pck = new ExcelPackage(newFile)) 
    { 
     ExcelWorksheet ws = pck.Workbook.Worksheets.Add("Sheet1"); 
     ws.Cells["A1"].LoadFromDataTable(dataTable, true); 
     pck.Save(); 
     System.Diagnostics.Process.Start(newFile.ToString()); 
    } 
} 

編輯:

變通辦法通過雙擊DataGrid中的任意單元格:

private void dataGrid_MouseDoubleClick(object sender, RoutedEventArgs e) 
{ 
    if (dataGrid.SelectedIndex == -1) //if column selected, cant use .CurrentColumn property 
    { 
     MessageBox.Show("Please double click on a row"); 
    } 
    else 
     { 
     DataGridColumn columnHeader = dataGrid.CurrentColumn; 
     if (columnHeader != null) 
     { 
      string input = Interaction.InputBox("Title", "Prompt", "Default", 0, 0); 
      columnHeader.Header = input; 
     } 
    } 
} 

回答

0

您可以更改datagridview的列名稱。但請注意,這種變化僅限於網格而不是數據源。因此,概括地說,對於簡單的代表性的目的,你可以使用下面的代碼:

dataGrid.Columns[i].HeaderText = "New Column Name"; //i is the index of the column 

您可以調用該代碼的形式,其中用戶提供了頭名的輸入的文本改變事件的一個按鈕單擊事件。此外,如果您事先具有列名稱,則可以在數據源綁定到網格後立即用新值替換列標題。更改此行後面的標題:

dataGrid.ItemsSource = GetDataTableFromExcel(filename).DefaultView; 
//Set new column names here 
+0

謝謝。我設法用輸入框和改變datagrid列名稱來鴨嘴獸解決方案。你知道我怎麼能對ItemsSource做同樣的事情嗎? – Trm

+0

對不起,我發佈太快了。我通過點擊並更改了'DataGridColumnHeader.Content = input'來改變整體效果[ref post](http://stackoverflow.com/questions/5895803/how-do-i-capture-click-events-on-a-datagrid-列標頭)。但是,當我遍歷列foreach(dataGrid.Columns中的DataGridColumn列)'它仍然顯示舊名稱。我可以使用你的方法來改變標題文本列。Header =「New Header」,但不知道如何在點擊特定列時從XAML啓動此事件。希望它是有道理的。 – Trm

+0

在這裏檢查:http://stackoverflow.com/questions/33363181/use-textbox-in-column-header-c-sharp-wpf –