Visualizzazione dei risultati da 1 a 3 su 3
  1. #1
    Utente di HTML.it L'avatar di Kahm
    Registrato dal
    Dec 2004
    residenza
    Rome
    Messaggi
    3,580

    [vb.net] Aggiungere dati a file excel

    salve a tutti
    ho un file excel che ha 2 fogli, devo valorizzare solo il primo foglio , mettendo tutti i dati da un datatable

    ho creato una routine, ma è lentissima, una cosa assurda, ci ho messo 2 giorni ma solo ora mi accorgo di aver per so tempo.
    penso che il problema sia sul pezzo di codice:
    Excel.Range excelCell = (Excel.Range)excelWorksheet.get_Range(Cella, Cella);
    excelCell.Value = dt.Columns[C].ColumnName;
    penso che dovrei prendere il valore della cella, ma fino ad ora non ho trovato come si fa
    esiste un modo piu semplice e rapido?
    grazie



    codice:
      private void EsportaInTemplateExcelVL(string NomeFile,dt as datatable)
            {      
              
                string fileNameTemp = NomeFile;//System.IO.Path.GetTempPath() + Guid.NewGuid().ToString() + ".xlsx";
                string FileXls = Application.StartupPath + @"\Support\PrintFormat\VL_LAB_updated.xls";
    
    
                if (!File.Exists(FileXls))
                {
                    MessageBox("File template VL_LAB_updated.xls not found");
                    return;
                }
    
    
                System.IO.File.Copy(FileXls, fileNameTemp);
    
    
                Excel.Application excelApp = new Excel.Application();
    
    
                Excel.Workbook wb = excelApp.Application.Workbooks.Open(fileNameTemp, Type.Missing, Type.Missing,
                                                          Type.Missing, Type.Missing,
                                                          Type.Missing, Type.Missing,
                                                          Type.Missing, Type.Missing,
                                                          Type.Missing, Type.Missing,
                                                          Type.Missing, Type.Missing,
                                                          Type.Missing, Type.Missing);
    
    
                Excel.Sheets excelSheets = excelApp.Worksheets;// var ws = excelApp.Worksheets;
                Excel.Worksheet excelWorksheet = (Excel.Worksheet)excelSheets.get_Item("DATA");
    
    
                //   Excel.Worksheet worksheet = ws.get_Item("Sheet1");//(Microsoft.Office.Interop.Excel.Worksheet)
                // Excel.Range range = worksheet.UsedRange;
                // object[,] values = (object[,])range.Value2;
    
    
                string[] col = { "A", "B", "C", "D", "E", "F", "G", "H", "I","J", "K", "L", "M", "N", "O", "P", "Q", "R", "S", "T", "U", "V", "W", "X","Y", "Z" };
    
    
    
    
                //scrittura intestazioni colonna
                for (int C = 0; C < dt.Columns.Count ; C++)
                {
                    string Cella = col[C].ToString() + (0 + 1).ToString();//i parte da zero
    
    
                    Excel.Range excelCell = (Excel.Range)excelWorksheet.get_Range(Cella, Cella);
                    excelCell.Value = dt.Columns[C].ColumnName;
                }
    
    
                for (int i = 0; i < dt.Rows.Count ; i++)//parte da 1 per mantenere titolo
                {
                    //DataRow Dr = dt.Rows[i];
                    for (int C = 0; C < dt.Columns.Count ; C++)//dt.Rows.Count-1
                    {
                        string Cella = col[C].ToString() + (i + 2).ToString();//i parte da zero
    
    
                        Excel.Range excelCell = (Excel.Range)excelWorksheet.get_Range(Cella, Cella);
                        excelCell.Value = "'" + dt.Rows[i][C].ToString();// "Hi There2";
    
    
                    }
                }
    
    
                    wb.Close(true);
                    //excelApp.Save();//fileNameTemp
                    excelApp.Quit();
                    MessageBox("Done");
                
            }
    NN vi diro mai chi sono in realta,
    tutti i miei 3D sono orfani, non insistete per farmi rispondere ai 3D aperti da me

  2. #2
    Moderatore di Programmazione L'avatar di alka
    Registrato dal
    Oct 2001
    residenza
    Reggio Emilia
    Messaggi
    24,463
    Quote Originariamente inviata da Kahm Visualizza il messaggio
    salve a tutti
    ho creato una routine, ma è lentissima, una cosa assurda, ci ho messo 2 giorni ma solo ora mi accorgo di aver per so tempo.
    penso che il problema sia sul pezzo di codice: [...]
    Excel.Range excelCell = (Excel.Range)excelWorksheet.get_Range(Cella, Cella);
    excelCell.Value = dt.Columns[C].ColumnName;
    penso che dovrei prendere il valore della cella, ma fino ad ora non ho trovato come si fa
    esiste un modo piu semplice e rapido?
    I problemi sono molteplici.

    Uno di questi è senz'altro legato al fatto che usi la COM Automation per eseguire l'operazione: in pratica, non stai lavorando sul file Excel, ma stai manipolando direttamente una istanza dell'applicazione Excel in quanto tale, in modo interattivo, facendole fare ciò che alla fine ti serve avere nel file. Ovviamente, questo approccio risulterà ben più lento che lavorare direttamente sul file in modo nativo, oltre al fatto che in assenza di Excel installato il codice non può funzionare. Oltre a questo, si aggiunge il fatto che il tutto avviene sfruttando l'interoperabilità tra .NET e COM, quindi con ulteriore aggravio della lentezza a causa del "marshalling" richiesto dalla comunicazione fra i due mondi.

    Nel codice poi lavori costantemente su range di celle, piuttosto che su celle effettive: "acquisire il range" vuol dire interpretare le coordinate e recuperare un riferimento a un oggetto creato appositamente per rappresentarlo, cella per cella. Perché non prende un range che occupa tutta la riga? oppure perché un range che non occupa tutti i riquadri? In questo modo, sarà sufficiente scorrere righe e colonne del range per valorizzarle opportunamente, magari andando per indice; in alternativa, considera l'accesso diretto alle celle tramite Cells (vedi la documentazione per esempi).

    Per concludere, valuterei anche l'uso di librerie alternative per l'accesso ai file, tra le più blasonate come EPPlus oppure gratuite e open source come OpenXml/ClosedXml, rimuovendo la dipendenza dall'applicazione e il suo uso via P/Invoke.

    Ciao!
    MARCO BREVEGLIERI
    Software and Web Developer, Teacher and Consultant

    Home | Blog | Delphi Podcast | Twitch | Altro...

  3. #3
    io qualche secolo fa ho lavorato con questa libreria https://www.gemboxsoftware.com/spreadsheet e debbo dire che mi son trovato bene

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.