Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 13

Discussione: Lettura file Excel

  1. #1
    Utente di HTML.it
    Registrato dal
    Jul 2006
    Messaggi
    3,072

    Lettura file Excel

    Ciao a tutti, secondo voi è possibile leggere il contenuto di un file excel per poi generare un XML? Come dovrei procedere? intendo quali librerie soluzioni adottare?

    E' possibile utilizzare tutti i vari formati di documenti Excel? XLS, XLSX etc...?

    Grazie

  2. #2
    Utente di HTML.it
    Registrato dal
    Apr 2012
    Messaggi
    91
    Se hai un foglio colonna/valore viene puoi usare direttamente una connessione oledb e fare le query sul foglio excel.
    Una volta caricato l'oggetto puoi usare la classe System.Xml.Serialization.XmlSerializer per creare l'xml (e viceversa da xml a oggetto)

    Per la connessione e la query:

    codice:
    String sConnectionString = "Provider=Microsoft.Jet.OLEDB.4.0;" + "Data Source=" + txtFileImport.Text + ";" + "Extended Properties=Excel 8.0;";
    
    OleDbConnection objConn = new OleDbConnection (sConnectionString);
    objConn.Open ();
    OleDbCommand objCmdSelect = new OleDbCommand ("SELECT * FROM [Sheet1$]", objConn);
    OleDbDataAdapter adapter = new OleDbDataAdapter ();
    adapter.SelectCommand = objCmdSelect;
    
    DataSet ds = new DataSet ();
    adapter.Fill (ds);

  3. #3
    Utente di HTML.it
    Registrato dal
    Jul 2006
    Messaggi
    3,072
    Perfetto, ho solo un problema:

    nel documento, alcune tabelle (presenti nei vari fogli) hanno N righe di elementi (dinamici) devo quindi sapere quando sono giunto al termine di ogni riga

    come?

    il foglio ha una linea tratteggiata che indica la fine della specifica tabella (quindi l'utente può aggiungere righe ma resterà sempre questo marcatore)


    allego un esempio di marcatore presente alla fine di ogni tabella (area con linee oblique)
    Immagini allegate Immagini allegate

  4. #4
    Utente di HTML.it
    Registrato dal
    Apr 2012
    Messaggi
    91
    Se ho capito bene ti dovrebbe bastare leggere il datatable nel dataset

    codice:
    For index As Integer = 0 To ds.Tables(0).Rows.Count - 2
       MessageBox.Show(ds.Tables(0).Rows(index)(0).ToString())
    Next
    Il DataTable contiene esattamente le righe del foglio excel, per cui fermandoti una riga prima della fine del DataTable escludi il "teminatore" di tabella

  5. #5
    Utente di HTML.it
    Registrato dal
    Jul 2006
    Messaggi
    3,072
    mmm a livello teorico mi è chiaro quello che intendi

    però come viene identificato il datatable? dal tuo esempio sembra essere riconosciuto "automaticamente"

    intendo:

    in un file excel ho più fogli di lavoro
    ogni foglio di lavoro ha diverse tabelle dati
    ogni tabella dati (che ha il proprio numero di colonne, diverso per ogni tabella) ha un numero dinamico di righe ... l'unico identificatore di fine righe è quel simbolo che ho postato

    Come posso quindi identificare una specifica tabella presente nel foglio di lavoro (o meglio, **ogni** tabella presente nel foglio), leggere i suoi dati (le righe sono dinamiche) per poi poter salvare i dati ti ogni tabella nelle varie tabelle del DB?

    Grazie

  6. #6
    Utente di HTML.it
    Registrato dal
    Apr 2012
    Messaggi
    91
    Ma le tabelle e i relativi campi da associare al DB nei fogli excel come sono identificabili? La soluzione ottimale forse sarebbe avere un foglio excel per ogni tabella del DB.

  7. #7
    Utente di HTML.it
    Registrato dal
    Jul 2006
    Messaggi
    3,072
    Ovviamente... peccato che io non posso modificare la logica del foglio Excel.

    Ecco perchè sono nati i dubbi indicati in precedenza.

    Idee?

    Thanks

  8. #8
    Utente di HTML.it
    Registrato dal
    Apr 2012
    Messaggi
    91
    Ma il foglio com'è strutturato?

    C'è la "stringa" //////// che identifica la fine dei dati della tabella, le altre tabelle dove sono all'interno del foglio? La struttura è ad esempio come questa?:
    A B C D E F G
    1 ColTab1 ColTab1 ColTab2 ColTab2 ColTab3
    2
    3
    4 /////////////////////
    5
    6 //////////////////////////////////////



    Nella prima riga ci sono i nomi delle colonne e le tabelle sono una di seguito all'altra. Nell'esempio la prima tabella sta nei campi A-B e la seconda tabella sta nei campi D-E-F. Se cosi fosse non dovrebbero esserci grosse difficoltà a leggere tutti i campi, se invece la struttura è diversa (ad esempio con le tabelle una sotta l'altra) se riesci a postare un esempio magari viene fuori qualche idea.

    Ciao

  9. #9
    Utente di HTML.it
    Registrato dal
    Jul 2006
    Messaggi
    3,072
    Prima di tutto grazie per l'aiuto!!


    Ma il foglio com'è strutturato?

    C'è la "stringa" //////// che identifica la fine dei dati della tabella, le altre tabelle dove sono all'interno del foglio? La struttura è ad esempio come questa?:
    A B C D E F G
    1 ColTab1 ColTab1 ColTab2 ColTab2 ColTab3
    2
    3
    4 /////////////////////
    5
    6 //////////////////////////////////////


    Esattamente!!!

    Anzi, per la precisione, le tabelle iniziano "sotto" (una dopo l'altra)

  10. #10
    Utente di HTML.it
    Registrato dal
    Apr 2012
    Messaggi
    91
    Potresti fare una cosa del genere adattandola al formato del tuo excel.

    codice:
     Private rowCount As Integer = 0
        Private IsExcelReaded As Boolean = False
        Private columnCountToRead As Integer = 0
    
        Private Sub Button1_Click(sender As System.Object, e As System.EventArgs) Handles Button1.Click
            Try
                Dim MyConnection As System.Data.OleDb.OleDbConnection
                Dim DtSet As System.Data.DataSet
                Dim MyCommand As System.Data.OleDb.OleDbDataAdapter
                MyConnection = New System.Data.OleDb.OleDbConnection _
                ("provider=Microsoft.Jet.OLEDB.4.0;Data Source='c:\temp\testfile.xls';Extended Properties='Excel 8.0;IMEX=1;ImportMixedTypes=Text'")
                MyCommand = New System.Data.OleDb.OleDbDataAdapter _
                    ("select * from [Test$]", MyConnection)
                MyCommand.TableMappings.Add("Table", "TestTable")
    
                DtSet = New System.Data.DataSet
                MyCommand.Fill(DtSet)
                IsExcelReaded = False
                While IsExcelReaded = False
                    columnCountToRead = 0
                    'Controllo il numero di colonne valide da leggere ipotizzando che sia specificato il nome colonna della tabella
                    For columnHeaderIndex As Integer = 0 To DtSet.Tables(0).Columns.Count - 1
    
                        If (IsReadeableColumn(DtSet.Tables(0).Rows(rowCount)(columnHeaderIndex).ToString()) = True) Then
                            columnCountToRead = columnCountToRead + 1
                        End If
                    Next
                    'Alla prima lettura l'indice parte da 0
                    If (rowCount <> 0) Then
                        rowCount = rowCount + 1
                    End If
                    'Leggo Righe
                    ReadRows(DtSet)
                    If (rowCount = DtSet.Tables(0).Rows.Count) Then
                        IsExcelReaded = True
                    End If
                End While
                MyConnection.Close()
            Catch ex As Exception
                MsgBox(ex.ToString)
            End Try
        End Sub
    
        Private Sub ReadRows(ByVal DtSet As DataSet)
            For rowIndex As Integer = rowCount To DtSet.Tables(0).Rows.Count - 1
                If (DtSet.Tables(0).Rows(rowIndex)(0).ToString().Contains("///") = False) Then
                    Dim columnsValues As String = String.Empty
                    For columnHeaderIndex As Integer = 0 To columnCountToRead - 1
                        columnsValues = columnsValues & DtSet.Tables(0).Rows(rowIndex)(columnHeaderIndex).ToString() & ";"
                    Next
                    MessageBox.Show(columnsValues)
                Else
                    rowCount = rowCount + 1
                    Exit For
                End If
                rowCount = rowCount + 1
            Next
        End Sub
    
    
        Private Function IsReadeableColumn(ByVal columnValue As String) As Boolean
            If (String.IsNullOrEmpty(columnValue)) Then
                Return False
            End If
            Return True
        End Function
    Il codice sopra legge i valori di un excel formattato con le tabelle una sotto l'altra dando per scontato che ci sia il nome del campo per ogni tabella e non ci siano righe vuote tra una "tabella" e l'altra ma solo i ///// come seperatore di tabella.

    Id | Valore
    1 | a
    2 | b
    3| c
    ////////// ////////
    Tab2Id | Tab2Valore | Tab3Valore
    10 | h | bbb
    11 | j |
    12 | k |
    13 | l |
    //////// //////// ///////////

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.