VB.NET e office Interop

Stefano Carta 0 Punti di reputazione
2024-05-29T14:48:17.9366667+00:00

Ciao a tutti...chiedo aiuto perchè non riesco ad uscirne vivo
Sto cercando di migrare dei plug-in che ho fatto per Autocad da Framework 4.8 a NET 8, perchè la nuova versione gira su NET8
In questi plug-in utilizzo Office.Interop.Excel per aprire e modificare file Excel.

Utilizzando NET 8, non riesco più ad utilizzare INTEROP, ricevo l'errore

System.InvalidCastException: 'Unable to cast COM object of type 'System.__ComObject' to interface type 'Microsoft.Office.Interop.Excel.Worksheet'. This operation failed because the QueryInterface call on the COM component for the interface with IID '{000208D8-0000-0000-C000-000000000046}' failed due to the following error: Interfaccia non supportata. (0x80004002 (E_NOINTERFACE)).'

Questo errore a volte me lo faceva anche prima, ma bastava riparare Office e andava...ora invece non va più

Ho installato Office365 VisualStudio Community 2022

Qualche idea?

Ho provato anche ad utilizzare OPENXML per aprire i documenti, ma ricevo l'errore
User's image

Ho provato anche Spreadsheetlight, e mi funziona, ho solo un problema che non legge il contenuto delle celle che hanno formule..

Come ne esco?

Grazie

Tecnologie per sviluppatori | VB
0 commenti Nessun commento
{count} voti

2 risposte

Ordina per: Più utili
  1. Monica Caprio (Convergys International Europe) 1,140 Punti di reputazione Personale Esterno Microsoft
    2024-05-30T10:35:06.87+00:00

    Gentile Stefano,

    La migrazione di un progetto da .NET Framework a .NET 8 può presentare alcune sfide, specialmente quando si tratta di utilizzare componenti COM come Office Interop. Ecco alcune possibili soluzioni e alternative che potresti considerare:

    1. Utilizzo di Office Interop in .NET 8

    L'utilizzo di Office Interop in .NET 8 richiede alcuni passaggi aggiuntivi rispetto a .NET Framework, poiché la gestione di COM è leggermente diversa.

    Passaggi per configurare Office Interop in .NET 8:

    1. Installazione dei pacchetti NuGet: Assicurati di aver installato i pacchetti NuGet necessari:
      
         dotnet add package Microsoft.Office.Interop.Excel
      
      
    2. Configurazione del progetto: Aggiungi il seguente codice al tuo file .csproj per assicurarti che il progetto sia configurato correttamente per utilizzare COM:
      
         <PropertyGroup>
      
             <EnableComHosting>true</EnableComHosting>
      
         </PropertyGroup>
      
      
    3. Codice per l'utilizzo di Interop: Verifica che il codice sia correttamente implementato. Ecco un esempio semplice per aprire un file Excel:
      
         using Excel = Microsoft.Office.Interop.Excel;
      
         public void OpenExcelFile(string filePath)
      
         {
      
             Excel.Application excelApp = new Excel.Application();
      
             Excel.Workbook workbook = excelApp.Workbooks.Open(filePath);
      
             Excel.Worksheet worksheet = workbook.Sheets[1] as Excel.Worksheet;
      
             // Esegui operazioni sul foglio di lavoro
      
             workbook.Close(false);
      
             excelApp.Quit();
      
             System.Runtime.InteropServices.Marshal.ReleaseComObject(worksheet);
      
             System.Runtime.InteropServices.Marshal.ReleaseComObject(workbook);
      
             System.Runtime.InteropServices.Marshal.ReleaseComObject(excelApp);
      
         }
      
      
    4. Alternative a Office Interop

    Se non riesci a risolvere i problemi con Office Interop, puoi considerare alternative come OpenXML o altre librerie di terze parti. Sebbene tu abbia menzionato alcuni problemi con OpenXML e SpreadsheetLight, è possibile che ci siano soluzioni a questi problemi.

    Utilizzo di OpenXML:

    OpenXML è una libreria molto potente per lavorare con i documenti di Office senza la necessità di installare Office sul server.

    Ecco un esempio per leggere i contenuti delle celle (incluso il calcolo delle formule):

    
    using DocumentFormat.OpenXml.Packaging;
    
    using DocumentFormat.OpenXml.Spreadsheet;
    
    public void ReadExcelFile(string filePath)
    
    {
    
        using (SpreadsheetDocument document = SpreadsheetDocument.Open(filePath, false))
    
        {
    
            WorkbookPart workbookPart = document.WorkbookPart;
    
            Sheet sheet = workbookPart.Workbook.Descendants<Sheet>().FirstOrDefault();
    
            WorksheetPart worksheetPart = (WorksheetPart)workbookPart.GetPartById(sheet.Id);
    
            SheetData sheetData = worksheetPart.Worksheet.Elements<SheetData>().First();
    
            
    
            foreach (Row row in sheetData.Elements<Row>())
    
            {
    
                foreach (Cell cell in row.Elements<Cell>())
    
                {
    
                    string cellValue = GetCellValue(cell, workbookPart);
    
                    Console.WriteLine(cellValue);
    
                }
    
            }
    
        }
    
    }
    
    private string GetCellValue(Cell cell, WorkbookPart workbookPart)
    
    {
    
        string value = cell.InnerText;
    
        if (cell.DataType != null)
    
        {
    
            switch (cell.DataType.Value)
    
            {
    
                case CellValues.SharedString:
    
                    var stringTable = workbookPart.GetPartsOfType<SharedStringTablePart>().FirstOrDefault();
    
                    value = stringTable.SharedStringTable.ElementAt(int.Parse(value)).InnerText;
    
                    break;
    
                case CellValues.Boolean:
    
                    value = value == "0" ? "FALSE" : "TRUE";
    
                    break;
    
            }
    
        }
    
        return value;
    
    }
    
    
    1. Utilizzo di altre librerie di terze parti

    Se SpreadsheetLight non funziona come previsto, puoi provare altre librerie come:

    • EPPlus: Una libreria molto popolare e facile da usare per leggere e scrivere file Excel.
    • ClosedXML: Un'altra ottima libreria per lavorare con file Excel.

    Ecco un esempio di utilizzo di EPPlus:

    
    using OfficeOpenXml;
    
    public void ReadExcelFileWithEPPlus(string filePath)
    
    {
    
        using (var package = new ExcelPackage(new FileInfo(filePath)))
    
        {
    
            ExcelWorksheet worksheet = package.Workbook.Worksheets[0];
    
            for (int row = 1; row <= worksheet.Dimension.End.Row; row++)
    
            {
    
                for (int col = 1; col <= worksheet.Dimension.End.Column; col++)
    
                {
    
                    var cellValue = worksheet.Cells[row, col].Text;
    
                    Console.WriteLine(cellValue);
    
                }
    
            }
    
        }
    
    }
    
    

    Conclusione

    Prova a seguire uno dei metodi sopra descritti e vedi se riesci a risolvere i tuoi problemi. Se continui ad avere difficoltà, potrebbe essere utile verificare l'ambiente di sviluppo e le configurazioni di sistema per assicurarti che tutto sia impostato correttamente per l'utilizzo di COM in .NET 8.

    Spero di esserti stata utile.

    Buona giornata!

    Monica.

    0 commenti Nessun commento

  2. Stefano Carta 0 Punti di reputazione
    2024-05-30T15:39:09.83+00:00

    Ciao Monica,

    grazie per la tua celere risposta. le ho provate tutte anche i tuoi suggerimenti, ma non riesco a farlo funzionare

    prima andava benissimo...ma il cambio a net8 mi ha bloccato

    Stefano

    0 commenti Nessun commento

Risposta

Le risposte possono essere contrassegnate come risposte accettate dall'autore della domanda. Ciò consente agli utenti di sapere che la risposta ha risolto il problema dell'autore.