Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 18
  1. #1
    Utente di HTML.it L'avatar di pietro09
    Registrato dal
    Jan 2002
    Messaggi
    10,116

    [vb.net][NPOI] tabella con righe alternate

    Salute.
    Nel codice di sotto, utilizzo la libreria NPOI per creare un file Excel.
    In sintesi, creo un IWorkbook leggendo i dati da un datatable, formattando le celle.

    Il codice recupera il formato originale delle celle e ne modifica alcuni formati per creare righe alternate chiaro-scure.

    Il codice funziona. Il problema è che è lento, tanto da farmi pensare a codice non corretto.
    Spero nel vostro aiuto.


    codice:
    Dim dt As System.Data.DataTable = msole.GetDataTable(gl.StringaConnessioneTest, "select * from campi ")
    Dim workbook As IWorkbook = l.DataTableToWorkbook(dt)
    Dim sheet As ISheet = workbook.GetSheetAt(0) 'sheet per indice
    
    For i As Integer = 0 To dt.Rows.Count - 1
        Dim row As IRow = sheet.GetRow(i)
        For j As Integer = 0 To dt.Columns.Count - 1
            Dim cell As ICell = row.GetCell(j)
            If i = 0 Then
                'intestazione: aggiungo il bordo
                Dim hStyle As XSSFCellStyle = CType(cell.CellStyle, XSSFCellStyle)
                hStyle.SetBorderColor(Extensions.BorderSide.RIGHT, New XSSFColor(Color.LightGray)) : hStyle.BorderRight = BorderStyle.Thin
                hStyle.SetBorderColor(Extensions.BorderSide.TOP, New XSSFColor(Color.LightGray)) : hStyle.BorderTop = BorderStyle.Thin
                hStyle.SetBorderColor(Extensions.BorderSide.BOTTOM, New XSSFColor(Color.LightGray)) : hStyle.BorderBottom = BorderStyle.Thin
    
            Else
                'righe dati: righe alternate con bordo
                Dim dStyle0 As XSSFCellStyle = CType(CType(cell.CellStyle, XSSFCellStyle).Clone, XSSFCellStyle)
                Dim dStyle1 As XSSFCellStyle = CType(CType(cell.CellStyle, XSSFCellStyle).Clone, XSSFCellStyle)
    
                With dStyle0
                    .SetFillForegroundColor(New XSSFColor(Color.White))
    
                    .FillPattern = FillPattern.SolidForeground
    
                    .SetBorderColor(Extensions.BorderSide.LEFT, New XSSFColor(Color.LightGray))
                    .SetBorderColor(Extensions.BorderSide.RIGHT, New XSSFColor(Color.LightGray))
                    .SetBorderColor(Extensions.BorderSide.TOP, New XSSFColor(Color.LightGray))
                    .SetBorderColor(Extensions.BorderSide.BOTTOM, New XSSFColor(Color.LightGray))
    
                    .BorderLeft = BorderStyle.Thin
                    .BorderRight = BorderStyle.Thin
                    .BorderTop = BorderStyle.Thin
                    .BorderBottom = BorderStyle.Thin
                End With
    
                With dStyle1
                    .SetFillForegroundColor(New XSSFColor(Color.AliceBlue))
    
                    .FillPattern = FillPattern.SolidForeground
    
                    .SetBorderColor(Extensions.BorderSide.LEFT, New XSSFColor(Color.LightGray))
                    .SetBorderColor(Extensions.BorderSide.RIGHT, New XSSFColor(Color.LightGray))
                    .SetBorderColor(Extensions.BorderSide.TOP, New XSSFColor(Color.LightGray))
                    .SetBorderColor(Extensions.BorderSide.BOTTOM, New XSSFColor(Color.LightGray))
    
                    .BorderLeft = BorderStyle.Thin
                    .BorderRight = BorderStyle.Thin
                    .BorderTop = BorderStyle.Thin
                    .BorderBottom = BorderStyle.Thin
                End With
    
                If i Mod 2 = 0 Then
                    cell.CellStyle = dStyle0
                Else
                    cell.CellStyle = dStyle1
                End If
    
            End If
    
        Next
    Next
    Pietro

  2. #2
    prima di dire che è lento di quante righe/colonne stiamo parlando?

  3. #3
    in più: potresti definire dStyle0 e dStyle1 *fuori* da tutti i cicli, poi nel ciclo applichi l'uno o l'altro (come fai adesso)

  4. #4
    Utente di HTML.it L'avatar di pietro09
    Registrato dal
    Jan 2002
    Messaggi
    10,116
    Quote Originariamente inviata da optime Visualizza il messaggio
    in più: potresti definire dStyle0 e dStyle1 *fuori* da tutti i cicli, poi nel ciclo applichi l'uno o l'altro (come fai adesso)
    Tabella di 12 righe più intestazione, 19 colonne.

    Tempo di elaborazione: 25 s

    Pietro

  5. #5
    Utente di HTML.it L'avatar di gibra
    Registrato dal
    Apr 2008
    residenza
    Italy
    Messaggi
    4,244
    Beh, se cambi per ogni singola cella, come ottimizzazione siamo a 0.
    Feci una cosa analoga diversi anni fa, ma procedevo per riga, non per cella.
    Io però lavoraro sul foglio Excel creato utilizzando le funzioni di Excel.

    Farei così:
    0. definire gli stili all'inizio
    1. Seleziono l'intera area di dati interessata
    2. coloro tutto con il primo colore (ed imposto anche tutto quello che è comune a tutte le celle)
    3. scorro le rige e:
    4. seleziono l'intera riga da colorare 'alternata',
    5. e la coloro con il secondo colore

    In sostanza, il concetto è lavorare sulla riga intera, anziché sulla singola cella.


  6. #6
    Utente di HTML.it L'avatar di pietro09
    Registrato dal
    Jan 2002
    Messaggi
    10,116
    almeno sono certo di una cosa: l'ottimizzazione è ZERO.

    Grazie del suggerimento. Ci provo
    Pietro

  7. #7
    Utente di HTML.it L'avatar di gibra
    Registrato dal
    Apr 2008
    residenza
    Italy
    Messaggi
    4,244
    Quote Originariamente inviata da pietro09 Visualizza il messaggio
    Tabella di 12 righe più intestazione, 19 colonne.

    Tempo di elaborazione: 25 s

    No, dai...! Ma scherzi?

    Il foglio Excel che generavo io (tutto da codice) era di una decina di pagine (A4 orizzontale), ed oltre all'intestazione di pagina, conteneva anche righe con intestazioni di Dettaglio e di Gruppo, con relativi sub-totali parziali (Dettaglio) e sub-totali parziali (di Gruppo), e Totale Generale finale, quindi mettici anche il tempo per tutti i calcoli necessari, formattazione dei numeri, cambio font, sub-totali colorati con righe diverse, ecc. ecc. ed era una scheggia: 2/3 secondi.

    Però usavo solo i metodi e le proprietà di Excel.

    Ne feci diversi, di vario tipo, ecco 1 pagina di uno dei tanti:



    Confesso che realizzare la parte della formattazione richiese diverso tempo per metterlo a punto bene, ma alla fine la soddisfazione c'era.


  8. #8
    Utente di HTML.it L'avatar di pietro09
    Registrato dal
    Jan 2002
    Messaggi
    10,116
    non è che mi puoi passare un po' di codice di esempi per studiarmeli meglio?

    Pietro

  9. #9
    Utente di HTML.it L'avatar di gibra
    Registrato dal
    Apr 2008
    residenza
    Italy
    Messaggi
    4,244
    Quote Originariamente inviata da pietro09 Visualizza il messaggio
    non è che mi puoi passare un po' di codice di esempi per studiarmeli meglio?

    No, perché la proprietà intellettuale del progetto è stata venduta al cliente. Io non ho più niente, e poi il codice era in VB6.0!

    In ogni caso, se guardi l'immagine, il codice non ti sarebbe servito a nulla in quanto completamente diverso dalle tue esigenze.
    Tra l'altro ora ricordo che il mio foglio era pure protetto e le uniche celle digitabili erano quelle dei dati di previsione che l'agente doveva inserire (celle bianche)

    Guarda comunque che fare quello che vuoi tu è semplicissimo, molto più semplice del mio.

  10. #10
    non sempre si può usare direttamente excel - per esempio se l'applicazione gira su un server dove non c'è office.

    pietro, hai seguito il mio suggerimento? ha spostato le dichiarazioni fuori?

    questo è un primo passo.

    secondo, potresti provare a generare il foglio con lo stile dispari, poi rileggere velocemente le righe e applicare *alle righe* pari lo stile pari.

    ma fa' un passo alla volta

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.