Utilizzando Interoperabilità con C#, Excel Salva modificando l'originale.Come negare questo?

StackOverflow https://stackoverflow.com/questions/29141

  •  09-06-2019
  •  | 
  •  

Domanda

Il problema:Caricamento di un modello di foglio di calcolo Excel.Utilizzando il comando Salva con un nome file diverso e quindi chiudendo l'oggetto di interoperabilità.Questo finisce per salvare il file modello originale.Non è il risultato che piace.

public void saveAndExit(string filename)
{        
    excelApplication.Save(filename);
    excelApplication.Quit();
}

Il file originale aperto è C: Testing Template.xls Il nome del file che viene passato in è C: Testing 7777 (data) .xls

C'è qualcuno che ha una risposta?

(La risposta che ho scelto è stata la più corretta e approfondita anche se wbk.Close() richiede parametri passati ad esso.Grazie.)

È stato utile?

Soluzione

L'interoperabilità di Excel è piuttosto dolorosa.Ho riesumato un vecchio progetto che avevo, ho lavorato un po' e penso che questo sia quello che stai cercando.Gli altri commentatori hanno ragione, ma, almeno nella mia esperienza, c'è molto di più nel chiamare SaveAs() di quanto ti aspetteresti se avessi utilizzato gli stessi oggetti (senza il wrapper di interoperabilità) in VBA.

Microsoft.Office.Interop.Excel.Workbook wbk = excelApplication.Workbooks[0];  //or some other way of obtaining this workbook reference, as Jason Z mentioned
wbk.SaveAs(filename, Type.Missing, Type.Missing, Type.Missing,
            Type.Missing, Type.Missing, XlSaveAsAccessMode.xlNoChange, 
            Type.Missing, Type.Missing, Type.Missing, Type.Missing,
            Type.Missing);
wbk.Close();
excelApplication.Quit();

Devo amare tutti quei Type.Missings.Ma penso che siano necessari.

Altri suggerimenti

Invece di utilizzare un'applicazione Excel, è possibile utilizzare l'oggetto Workbook e chiamare il metodo SaveAs().Puoi passare lì il nome del file aggiornato.

Hai provato SaveAs dal foglio di lavoro?

  1. Idem per SaveAs
  2. Ogni volta che devo eseguire l'interoperabilità, creo una libreria di classi VB.NET separata e scrivo la logica in VB.Non vale la pena farlo in C#
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top