[RISOLTO]DataGridView ClosedXML ma con fitri

di il
2 risposte

[RISOLTO]DataGridView ClosedXML ma con fitri

Ciao a tutti. vorrei cambiare il modo di esportare i dati dalla mia DataGridView verso Excel, ora sto usano il metodo con Microsoft.Office.Interop.Excel ma volte si blocca ed è comunque troppo lento. Ho visto che usando ClosedXML è molto più veloce e non si blocca, sto però riscontrando dei problemi nel fare quello che vorrei fare.
La ia DataGridView è associata ad una DataTable, su di essa (DataGridView) eseguo poi dei filtri .
Per creare il file ho visto che facendo così è veloce :
using ClosedXML.Excel;
...........
............
...........
   private void BtnTEST2_Click(object sender, EventArgs e)
   {
    string folderPath = "C:\\Proval\\";
    if (!Directory.Exists(folderPath))
   {
     Directory.CreateDirectory(folderPath);
    }
    var wb = new XLWorkbook();         
    var ws = wb.Worksheets.Add(dtDataTableOriginaria,"Dati");       
    ws.Row(1).Height = 30;
    ws.Row(1).Style.Alignment.SetHorizontal(XLAlignmentHorizontalValues.Center);
    ws.Row(1).Style.Alignment.SetVertical(XLAlignmentVerticalValues.Center);        
    wb.SaveAs(folderPath + "Esportazione.xlsx");
   }
Diciamo che se volessi esportare l'intera DataTable, va benissimo. Io però vorrei esportare solo quello che vedo in quel momento nella mi DataGridView ( dat oche ci faccio dei filtri).
Ho trovato un suggerimento su un sito ed ho provato ad applicarlo :
 private void BtnTEST2_Click(object sender, EventArgs e)
        {
            DataTable dtExport = new DataTable();        //Dichiaro un nuova DataTable
            foreach (DataGridViewColumn column in dataGridView1.Columns)
            {
                dtExport.Columns.Add(column.HeaderText,column.ValueType);
            }
            foreach (DataGridViewRow row in dataGridView1.Rows)
            {
                dtExport.Rows.Add();
                foreach (DataGridViewCell cell in row.Cells)
            {
                dtExport.Rows[dtExport.Rows.Count - 1][cell.ColumnIndex] = cell.Value.ToString();
            }
            
            string folderPath = "C:\\Prova\\";
            if (!Directory.Exists(folderPath))
            {
                Directory.CreateDirectory(folderPath);
            }
            var wb = new XLWorkbook();           
            var ws = wb.Worksheets.Add(dtExport,"Dati");           
            ws.Row(1).Height = 30;
            ws.Row(1).Style.Alignment.SetHorizontal(XLAlignmentHorizontalValues.Center);
            ws.Row(1).Style.Alignment.SetVertical(XLAlignmentVerticalValues.Center);       
            wb.SaveAs(folderPath + "Esportazione.xlsx");
            
        }
Ma dato che io ho anche delle Date (e delle ORE) all'interno della mia DataGridView, mi restituisce un errore :
Eccezione non gestita. System.ArgumentException: 'Stringa non riconosciuta come valore DateTime valido.Impossibile archiviare <> nella colonna Data. Il tipo previsto è DateTime. Eccezione Interna .FormatException: Stringa non riconosciuta come valore DateTime valido.

Avete qualche suggerimento, anche perché poi avrei un secondo problema da affrontare ma in qualche modo spero di arrivarci.
Grazie, ciao.

2 Risposte

  • Re: [RISOLTO]DataGridView ClosedXML ma con fitri

    Ciao,
    un problema (quello non accennato nel post l'ho risolto "aggirandolo"), questo dell'esportare solo la parte di DataTable che vedo (nella DataGridView) l'ho invece solo parzialmente risolto.
    Praticamente durante la "costruzione" della nuova DataTable (dtExport) ho omesso la parte in cui recupera il tipo di formattazione che ha la DataGridView, cioè non gli ho più detto di "guardare" se sono Bool, DateTime, String etc etc .
    L'ho fatto togliendo una parte di codice :
    private void BtnTEST2_Click(object sender, EventArgs e)
         {
                DataTable dtExport = new DataTable();
                string OggettoFile = "";
                string DataFile = "";
              
                foreach (DataGridViewColumn column in dataGridView1.Columns)
                {
                    dtExport.Columns.Add(column.HeaderText); //,column.ValueType);  <<<<Ho tolto questa parte 
                }
            ......
            ....
            ..
            ..
                   
          }
    Ora però , se nella DataGridView avevo le date impostate così :
    • 13/03/2022
    • 16/03/2022
    • 23/03/2022
    Ora nel file Excel me le ritrovo così :
    • 13/03/2022 00:00:00
    • 16/03/2022 00:00:00
    • 23/03/2022 00:00:00
    Gli orari sulla DataGridView li ho così :
    • 12:34
    • 04:39
    • 23:54
    Ora nel file Excel me le ritrovo così :
    • 24/03/2022 12:34
    • 24/03/2022 04:39
    • 24/03/2022 23:54

    Ho cercato riformattarle in MM/dd/yyyy e hh:mm provando con due modi .
    Il primo formattando la colonna che contiene le Date e gli Orari .
    ws.Column(1).Style.DateFormat.Format = "dd/MM/yyyyy";
                ws.Column(2).Style.DateFormat.Format = "hh:mm";
                ws.Column(3).Style.DateFormat.Format = "hh:mm";           
                ws.Column(12).Style.DateFormat.Format = "dd/MM/yyyyy";
    Ma non ha funzionato.
    Poi ho provato anche con un ciclo For :
       for (int i = 1; i <= dtExport.Rows.Count + 1; i++)
                {
                    for (int j = 1; j <= dtExport.Columns.Count; j++)
                    {
                        ws.Cell(i, j).Style.Alignment.SetHorizontal(XLAlignmentHorizontalValues.Center);
                        ws.Cell(i, j).Style.Border.OutsideBorder = XLBorderStyleValues.Thin;
    
                    }
                    ws.Cell(i, 13).Style.Alignment.SetHorizontal(XLAlignmentHorizontalValues.Left);
                    ws.Cell(i,1).Style.DateFormat.Format = "MM/dd/yyyy";
                    ws.Cell(i, 2).Style.DateFormat.Format = "hh:mm";
                    ws.Cell(i, 3).Style.DateFormat.Format = "hh:mm";
                    ws.Cell(i, 12).Style.DateFormat.Format = "MM/dd/yyyy";
                }
    Però con entrambi i modi nulla, anche se gli altri tipi di modifiche me lo fa fare (inserire immagine con logo, cancellare colonne, inserire righe, cambiare font e dimensioni del testo, modificare l'allineamento, etc ,etc.

    Altra cosa strana è che anche se agisco direttamente sul file excel creato e cerco di formattare la colonna come Data, o come Ora, in realtà non succede niente...
    Ho paura che devo proprio trovare il modo di mantenere la formattazione originale :
     foreach (DataGridViewColumn column in dataGridView1.Columns)
                {
                    dtExport.Columns.Add(column.HeaderText,column.ValueType);
                }
    e trovare il modo che non mi dia errore se trova vuoto il campo Data o Ora o quello Bool,

    Saluti.
  • Re: [RISOLTO]DataGridView ClosedXML ma con fitri

    Ciao ,mi rispondo da solo
    Sperando di fare una cosa gradita vi dico come ho fatto (altrimenti cancellate pure tutto il Post).
    Ho cercato di approfondire un po' ed ho risolto creando una DataView dopo aver applicato i filtri che mi interessavano, poi convertito la DataView in una nuova DataTabel che a sua volta ho salvato in Excel con i comandi di closedXML.

    Magari per alcuni di voi era una cosa scontata e semplice, per me no.

    Ora devo riscrivere il codice eliminando tutto quello che riguardava Microsoft.Office.Interop.Excel ed utilizzare ClosedXML.

    Ciao, buona serata.
Devi accedere o registrarti per scrivere nel forum
2 risposte