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

VB
VB
Linguaggio di programmazione orientato agli oggetti sviluppato da Microsoft implementato in .NET Framework. Precedentemente noto come Visual Basic .NET.
17 domande
0 commenti Nessun commento
{count} voti

2 risposte

Ordina per: Più utili
  1. Monica Caprio (Convergys International Europe) 1.130 Punti di reputazione Fornitore 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.