Oppure

Loading
09/02/22 16:48
Togo
Buonasera,

Io ho fatto una web app che mi fa importare un file excel in un database e in seguito visualizza il database in un'altra pagina, e funziona tutto.

Ora dovrei implementare una funzione che, prima di importare il file nel database controlli che i valori inseriti nelle celle siano corretti.

Ad esempio, se nella colonna "Data" al posto di una data (GG-MM-AAAA) c'è una stringa (Luigi ad esempio) o un intero dovrebbe darmi in output tutta la tabella con la cella avente il formato sbagliato segnalata in rosso.
Se al posto di un int (2012, 2013, 1998) nella colonna "Anno" ho una stringa deve visualizzarmi in output tutto il file excel con evidenziato in rosso sia la data sbagliata che l'int sbagliato.

Qualcuno saprebbe aiutarmi?

Grazie
10/02/22 5:47
Carlo
Se le date sono di tipo DateTime, puoi controllarlo con GetType
Se le date sono stringhe e vuoi sapere se rappresentano date, puoi usare TryParse.

void verifica()
{
    string dd = "01-09-2021";
    DateTime controllo;

    // conversione se possibile
    if (DateTime.TryParse(dd, out controllo))
    {
        // la stringa dd è una data ed è stata convertita e copiata nella variabile DateTime controllo'
    }
    else
    {
        // la stringa dd non rappresenta una data la variabile DateTime controllo ha ancora il vecchio valore'
    }

    // controllo tipo variabile
    if (controllo.GetType() == typeof(DateTime))
    {
        // la variabile controllo è di tipo DateTime
    }
    else
    {
        // la variabile controllo non è di tipo DateTime
    }
}


Poi per le colorazioni ti devi affidare alle istruzioni e al metodo che usi per creare l'Excel
Ultima modifica effettuata da Carlo 10/02/22 7:55
in programmazione tutto è permesso
10/02/22 10:59
Togo
Perfetto grazie, e come potrei fare per visualizzare in un'altra pagina le righe che contengono l'errore? Magari evidenziando la cella sbagliata?
10/02/22 19:25
Carlo
Non ho idea senza sapere come stai operando per importare il foglio excel, usi Interop o cosa?
La colonna rossa la vuoi sul foglio excel o sulla tabella del db? Usi DataGridView?

Mostra il codice, magari crea un progetto minimale per fare i test.
Ultima modifica effettuata da Carlo 11/02/22 4:11
in programmazione tutto è permesso
16/02/22 16:26
Togo
Ciao, scusate l'assenza.

Ultima modifica effettuata da Togo 17/02/22 9:32
16/02/22 23:04
Carlo
Devi scegliere se importare tutto l'Excel in dt e poi leggerlo riga riga per i controlli prima di inserirlo nel server, oppure fare i controlli mentre importi.

Per come hai fatto tu, dichiara:
DataTable dtOk = new DataTable();
DataTable dtErr = new DataTable();
Ricorda di inizializzare le colonne, a riga 36 oltre a:

dt.Columns.Add(cell.Value.ToString());
aggiungi:

dtOK.Columns.Add(cell.Value.ToString());
dtErr.Columns.Add(cell.Value.ToString());


Alle righe 87, 110 e 125 incrementi un contatore, se alla fine dei tre controlli data, il contatore sarà uguale a 3, allora le tre date sono tutte corrette e puoi importare l'intera riga in dtOk:
dtOk.ImportRow(dt.Rows[ i ]);
Se il contatore non è uguale a 3, la importi in dtErr:
dtErr.ImportRow(dt.Rows[ i ]);

Dichiara il contatore all'interno del for in modo che sia sempre azzerato prima dei controlli.

sqlBulkCopy.WriteToServer(dtOk); // nel server solo le righe senza errori
Per visualizzare dtErr, puoi usare: DataGridView o DataView.

Ps. non so quanto è grande l'excel, ma se per le colonne usi gli indici invece dei nomi, tutto sarà più veloce.
Puoi anche aggiungere la riga errata su dtErr e poi rimuoverla da dt, risparmi dtOk, ma poi devi gestire le righe che diminuiscono.
Ultima modifica effettuata da Carlo 18/02/22 5:55
in programmazione tutto è permesso
17/02/22 10:47
Togo
Ho aggiornato come mi hai detto ma mi da i seguenti problemi:

[HttpPost]
        public ActionResult Index(HttpPostedFileBase file)
        {
            DataTable dt = new DataTable();
            DataTable dtOk = new DataTable();
            DataTable dtErr = new DataTable();    

            if (file != null && file.ContentLength > 0 && System.IO.Path.GetExtension(file.FileName).ToLower() == ".xlsx")
            {
                string path = Path.Combine(Server.MapPath("~/UploadFile"), Path.GetFileName(file.FileName));

                file.SaveAs(path);

               using (XLWorkbook workbook = new XLWorkbook(path))
                {
                    IXLWorksheet worksheet = workbook.Worksheet(1);
                    bool FirstRow = true;

                    string readRange = "1:1";
                    foreach (IXLRow row in worksheet.RowsUsed())
                    {

                        if (FirstRow)
                        {

                            readRange = string.Format("{0}:{1}", 1, row.LastCellUsed().Address.ColumnNumber);
                            foreach (IXLCell cell in row.Cells(readRange))
                            {
                                dt.Columns.Add(cell.Value.ToString());
                                dtOk.Columns.Add(cell.Value.ToString());
                                dtErr.Columns.Add(cell.Value.ToString());
                            }
                            FirstRow = false;
                        }
                        else
                        {

                            dt.Rows.Add();
                            int cellIndex = 0;

                            foreach (IXLCell cell in row.Cells(readRange))
                            {
                                dt.Rows[dt.Rows.Count - 1][cellIndex] = cell.Value.ToString();
                                cellIndex++;
                            }
                        }
                    }
                    if (FirstRow)
                    {
                        ViewBag.Message = "Empty Excel File!";
                    }
                }
            }
            else
            {

                ViewBag.Message = "Please select file with .xlsx extension!";
            }


             string connection = "Data Source=(localDb)\LocalDb;Initial Catalog=ExcelDataBaseReader;Integrated Security=True";
             SqlConnection con = new SqlConnection(connection);

             SqlBulkCopy sqlBulkCopy = new SqlBulkCopy(con);
             sqlBulkCopy.DestinationTableName = "tbl_ProgettiSociali2";

            

            for (int i = 0; i < dt.Rows.Count; i++)
            {

                int j = 0;

                string ANNO = dt.Rows[i]["ANNO"].ToString();
                string NRPROTOCOLLO = dt.Rows[i]["NRPROTOCOLLO"].ToString();

                string DATA_INSERIMENTO = dt.Rows[i]["DATA INSERIMENTO"].ToString();
                
                    DateTime datetime_DATA_INSERIMENTO;
                    bool isValidData_DATA_INSERIMENTO = DateTime.TryParseExact(DATA_INSERIMENTO, "dd/MM/yyyy hh:mm:ss", CultureInfo.InvariantCulture,
                              DateTimeStyles.None, out datetime_DATA_INSERIMENTO);
                
                    if (isValidData_DATA_INSERIMENTO == true)
                    {
                        DateTime aDate = Convert.ToDateTime(dt.Rows[i]["DATA INSERIMENTO"]);
                                 j++;
                    }
                    /*else
                    {
                        ViewBag.Message = "Formato DATA_INSERIMENTO errato alla riga n" + (i) + " del file excel.";

                    }*/
                
                string TIPOLOGIA = dt.Rows[i]["TIPOLOGIA"].ToString();
                string STATO = dt.Rows[i]["STATO"].ToString();
                string AMBITO_DINTERVETO = dt.Rows[i]["AMBITO D'INTERVENTO"].ToString();
                string SOGGETTI_DESTINATARI = dt.Rows[i]["SOGGETTI DESTINATARI"].ToString();
                string TITOLO_INIZIATIVA = dt.Rows[i]["TITOLO INIZIATIVA"].ToString();
  
                string DATA_INIZIO = dt.Rows[i]["DATA INIZIO(GG/MM/AAAA)"].ToString();
               

                DateTime datetime_DATA_INIZIO;
                bool isValidData_DATA_INIZIO = DateTime.TryParseExact(DATA_INIZIO, "dd/MM/yyyy hh:mm:ss", CultureInfo.InvariantCulture,
                          DateTimeStyles.None, out datetime_DATA_INIZIO);
                if (isValidData_DATA_INIZIO == true)
                {
                    DateTime bDate = Convert.ToDateTime(dt.Rows[i]["DATA INIZIO(GG/MM/AAAA)"]);
                    j++;
                }
                /*else
                {
                    ViewBag.Message = "Formato DATA_INIZIO errato alla riga n"  + (i) + " del file excel.";
                }*/

                string DATA_FINE = dt.Rows[i]["DATA FINE(GG/MM/AAAA)"].ToString();

                DateTime datetime_DATA_FINE;
                bool isValidData_DATA_FINE = DateTime.TryParseExact(DATA_FINE, "dd/MM/yyyy hh:mm:ss", CultureInfo.InvariantCulture,
                          DateTimeStyles.None, out datetime_DATA_FINE);
                if (isValidData_DATA_FINE == true)
                {
                    DateTime cDate = Convert.ToDateTime(dt.Rows[i]["DATA FINE(GG/MM/AAAA)"]);
                    j++;
                }
                /*else
                {
                    ViewBag.Message = "Formato DATA_FINE errato alla riga n"  + (i) + " del file excel.";
                }*/

                if(j == 3)
                {
                    dtOk.Rows.Add(dt.Row[i]);
                }
                else if (j != 3)
                {
                    dtErr.Rows.Add(dt.Row[i]);
                }
            }

            con.Open();
            sqlBulkCopy.WriteToServer(dtOk);
            con.Close();


                        //sqlBulkCopy.WriteToServer(dt)
           
            return View(dtErr);


dtOk.Rows.Add(dt.Row[i]) e dtErr.Rows.Add(dt.Row[i]) viene segnato "Row" e dice: " DataTable does not contain a definition for Row and no accessible extension method Row accepting a first argument of type "Datatable coud be found"

E per quando riguarda quando dici: "Ricorda di inizializzare le colonne" che cosa intendi?

Scusa ma sono proprio alle prime armi :d
Ultima modifica effettuata da Togo 17/02/22 10:51
17/02/22 15:08
Carlo
Devi entrare in debug e vedere cosa succede nel for, controlla se le righe lette con le ripettive celle sono quelle che ti aspetti.
A occhio a parte delle ridondanze inutili, non vedo errori.
Ultima modifica effettuata da Carlo 17/02/22 15:09
in programmazione tutto è permesso