Questo sito utilizza cookies solo per scopi di autenticazione sul sito e nient'altro. Nessuna informazione personale viene tracciata. Leggi l'informativa sui cookies.
Username: Password: oppure
C# / VB.NET - Controllo valore celle di un excel importato asp.net c# MVC
Forum - C# / VB.NET - Controllo valore celle di un excel importato asp.net c# MVC

Pagine: [ 1 2 ] Precedente | Prossimo
Avatar
Togo (Normal User)
Newbie


Messaggi: 9
Iscritto: 09/02/2022

Segnala al moderatore
Postato alle 17:48
Mercoledì, 09/02/2022
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

PM Quote
Avatar
Carlo (Member)
Guru


Messaggi: 1344
Iscritto: 29/01/2018

Segnala al moderatore
Postato alle 6:47
Giovedì, 10/02/2022
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.

Codice sorgente - presumibilmente C#

  1. void verifica()
  2. {
  3.     string dd = "01-09-2021";
  4.     DateTime controllo;
  5.  
  6.     // conversione se possibile
  7.     if (DateTime.TryParse(dd, out controllo))
  8.     {
  9.         // la stringa dd è una data ed è stata convertita e copiata nella variabile DateTime controllo'
  10.     }
  11.     else
  12.     {
  13.         // la stringa dd non rappresenta una data la variabile DateTime controllo ha ancora il vecchio valore'
  14.     }
  15.  
  16.     // controllo tipo variabile
  17.     if (controllo.GetType() == typeof(DateTime))
  18.     {
  19.         // la variabile controllo è di tipo DateTime
  20.     }
  21.     else
  22.     {
  23.         // la variabile controllo non è di tipo DateTime
  24.     }
  25. }



Poi per le colorazioni ti devi affidare alle istruzioni e al metodo che usi per creare l'Excel

Ultima modifica effettuata da Carlo il 10/02/2022 alle 8:55


in programmazione tutto è permesso
PM Quote
Avatar
Togo (Normal User)
Newbie


Messaggi: 9
Iscritto: 09/02/2022

Segnala al moderatore
Postato alle 11:59
Giovedì, 10/02/2022
Perfetto grazie, e come potrei fare per visualizzare in un'altra pagina le righe che contengono l'errore? Magari evidenziando la cella sbagliata?

PM Quote
Avatar
Carlo (Member)
Guru


Messaggi: 1344
Iscritto: 29/01/2018

Segnala al moderatore
Postato alle 20:25
Giovedì, 10/02/2022
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 il 11/02/2022 alle 5:11


in programmazione tutto è permesso
PM Quote
Avatar
Togo (Normal User)
Newbie


Messaggi: 9
Iscritto: 09/02/2022

Segnala al moderatore
Postato alle 17:26
Mercoledì, 16/02/2022
Ciao, scusate l'assenza.


Ultima modifica effettuata da Togo il 17/02/2022 alle 10:32
PM Quote
Avatar
Carlo (Member)
Guru


Messaggi: 1344
Iscritto: 29/01/2018

Segnala al moderatore
Postato alle 0:04
Giovedì, 17/02/2022
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 il 18/02/2022 alle 6:55


in programmazione tutto è permesso
PM Quote
Avatar
Togo (Normal User)
Newbie


Messaggi: 9
Iscritto: 09/02/2022

Segnala al moderatore
Postato alle 11:47
Giovedì, 17/02/2022
Ho aggiornato come mi hai detto ma mi da i seguenti problemi:

Codice sorgente - presumibilmente C#

  1. [HttpPost]
  2.         public ActionResult Index(HttpPostedFileBase file)
  3.         {
  4.             DataTable dt = new DataTable();
  5.             DataTable dtOk = new DataTable();
  6.             DataTable dtErr = new DataTable();    
  7.  
  8.             if (file != null && file.ContentLength > 0 && System.IO.Path.GetExtension(file.FileName).ToLower() == ".xlsx")
  9.             {
  10.                 string path = Path.Combine(Server.MapPath("~/UploadFile"), Path.GetFileName(file.FileName));
  11.  
  12.                 file.SaveAs(path);
  13.  
  14.                using (XLWorkbook workbook = new XLWorkbook(path))
  15.                 {
  16.                     IXLWorksheet worksheet = workbook.Worksheet(1);
  17.                     bool FirstRow = true;
  18.  
  19.                     string readRange = "1:1";
  20.                     foreach (IXLRow row in worksheet.RowsUsed())
  21.                     {
  22.  
  23.                         if (FirstRow)
  24.                         {
  25.  
  26.                             readRange = string.Format("{0}:{1}", 1, row.LastCellUsed().Address.ColumnNumber);
  27.                             foreach (IXLCell cell in row.Cells(readRange))
  28.                             {
  29.                                 dt.Columns.Add(cell.Value.ToString());
  30.                                 dtOk.Columns.Add(cell.Value.ToString());
  31.                                 dtErr.Columns.Add(cell.Value.ToString());
  32.                             }
  33.                             FirstRow = false;
  34.                         }
  35.                         else
  36.                         {
  37.  
  38.                             dt.Rows.Add();
  39.                             int cellIndex = 0;
  40.  
  41.                             foreach (IXLCell cell in row.Cells(readRange))
  42.                             {
  43.                                 dt.Rows[dt.Rows.Count - 1][cellIndex] = cell.Value.ToString();
  44.                                 cellIndex++;
  45.                             }
  46.                         }
  47.                     }
  48.                     if (FirstRow)
  49.                     {
  50.                         ViewBag.Message = "Empty Excel File!";
  51.                     }
  52.                 }
  53.             }
  54.             else
  55.             {
  56.  
  57.                 ViewBag.Message = "Please select file with .xlsx extension!";
  58.             }
  59.  
  60.  
  61.              string connection = "Data Source=(localDb)\\LocalDb;Initial Catalog=ExcelDataBaseReader;Integrated Security=True";
  62.              SqlConnection con = new SqlConnection(connection);
  63.  
  64.              SqlBulkCopy sqlBulkCopy = new SqlBulkCopy(con);
  65.              sqlBulkCopy.DestinationTableName = "tbl_ProgettiSociali2";
  66.  
  67.            
  68.  
  69.             for (int i = 0; i < dt.Rows.Count; i++)
  70.             {
  71.  
  72.                 int j = 0;
  73.  
  74.                 string ANNO = dt.Rows[i]["ANNO"].ToString();
  75.                 string NRPROTOCOLLO = dt.Rows[i]["NRPROTOCOLLO"].ToString();
  76.  
  77.                 string DATA_INSERIMENTO = dt.Rows[i]["DATA INSERIMENTO"].ToString();
  78.                
  79.                     DateTime datetime_DATA_INSERIMENTO;
  80.                     bool isValidData_DATA_INSERIMENTO = DateTime.TryParseExact(DATA_INSERIMENTO, "dd/MM/yyyy hh:mm:ss", CultureInfo.InvariantCulture,
  81.                               DateTimeStyles.None, out datetime_DATA_INSERIMENTO);
  82.                
  83.                     if (isValidData_DATA_INSERIMENTO == true)
  84.                     {
  85.                         DateTime aDate = Convert.ToDateTime(dt.Rows[i]["DATA INSERIMENTO"]);
  86.                                  j++;
  87.                     }
  88.                     /*else
  89.                     {
  90.                         ViewBag.Message = "Formato DATA_INSERIMENTO errato alla riga n" + (i) + " del file excel.";
  91.  
  92.                     }*/
  93.                
  94.                 string TIPOLOGIA = dt.Rows[i]["TIPOLOGIA"].ToString();
  95.                 string STATO = dt.Rows[i]["STATO"].ToString();
  96.                 string AMBITO_DINTERVETO = dt.Rows[i]["AMBITO D'INTERVENTO"].ToString();
  97.                 string SOGGETTI_DESTINATARI = dt.Rows[i]["SOGGETTI DESTINATARI"].ToString();
  98.                 string TITOLO_INIZIATIVA = dt.Rows[i]["TITOLO INIZIATIVA"].ToString();
  99.  
  100.                 string DATA_INIZIO = dt.Rows[i]["DATA INIZIO(GG/MM/AAAA)"].ToString();
  101.                
  102.  
  103.                 DateTime datetime_DATA_INIZIO;
  104.                 bool isValidData_DATA_INIZIO = DateTime.TryParseExact(DATA_INIZIO, "dd/MM/yyyy hh:mm:ss", CultureInfo.InvariantCulture,
  105.                           DateTimeStyles.None, out datetime_DATA_INIZIO);
  106.                 if (isValidData_DATA_INIZIO == true)
  107.                 {
  108.                     DateTime bDate = Convert.ToDateTime(dt.Rows[i]["DATA INIZIO(GG/MM/AAAA)"]);
  109.                     j++;
  110.                 }
  111.                 /*else
  112.                 {
  113.                     ViewBag.Message = "Formato DATA_INIZIO errato alla riga n"  + (i) + " del file excel.";
  114.                 }*/
  115.  
  116.                 string DATA_FINE = dt.Rows[i]["DATA FINE(GG/MM/AAAA)"].ToString();
  117.  
  118.                 DateTime datetime_DATA_FINE;
  119.                 bool isValidData_DATA_FINE = DateTime.TryParseExact(DATA_FINE, "dd/MM/yyyy hh:mm:ss", CultureInfo.InvariantCulture,
  120.                           DateTimeStyles.None, out datetime_DATA_FINE);
  121.                 if (isValidData_DATA_FINE == true)
  122.                 {
  123.                     DateTime cDate = Convert.ToDateTime(dt.Rows[i]["DATA FINE(GG/MM/AAAA)"]);
  124.                     j++;
  125.                 }
  126.                 /*else
  127.                 {
  128.                     ViewBag.Message = "Formato DATA_FINE errato alla riga n"  + (i) + " del file excel.";
  129.                 }*/
  130.  
  131.                 if(j == 3)
  132.                 {
  133.                     dtOk.Rows.Add(dt.Row[i]);
  134.                 }
  135.                 else if (j != 3)
  136.                 {
  137.                     dtErr.Rows.Add(dt.Row[i]);
  138.                 }
  139.             }
  140.  
  141.             con.Open();
  142.             sqlBulkCopy.WriteToServer(dtOk);
  143.             con.Close();
  144.  
  145.  
  146.                         //sqlBulkCopy.WriteToServer(dt)
  147.            
  148.             return View(dtErr);



dtOk.Rows.Add(dt.Row) e dtErr.Rows.Add(dt.Row) 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 il 17/02/2022 alle 11:51
PM Quote
Avatar
Carlo (Member)
Guru


Messaggi: 1344
Iscritto: 29/01/2018

Segnala al moderatore
Postato alle 16:08
Giovedì, 17/02/2022
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 il 17/02/2022 alle 16:09


in programmazione tutto è permesso
PM Quote
Avatar
Togo (Normal User)
Newbie


Messaggi: 9
Iscritto: 09/02/2022

Segnala al moderatore
Postato alle 16:22
Giovedì, 17/02/2022
Testo quotato

Postato originariamente da 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.



Grazie :)

Potresti spiegarmi cosa intendi quando dici " ricorda di inizializzare le colonne"?

PM Quote
Pagine: [ 1 2 ] Precedente | Prossimo