Come trasferire dati in una cartella di lavoro di Excel usando Visual C# 2005 o Visual C# .NET

Per una versione di Microsoft Visual Basic 6.0 di questo articolo, vedere 247412.

Questo articolo dettagliato descrive diversi metodi per il trasferimento dei dati in Microsoft Excel 2002 da un programma Microsoft Visual C# 2005 o Microsoft Visual C# .NET. Questo articolo presenta anche i vantaggi e gli svantaggi di ogni metodo in modo da poter selezionare la soluzione più adatta alla propria situazione.

Panoramica

La tecnica usata più di frequente per trasferire dati in una cartella di lavoro di Excel è Automazione. Con Automazione è possibile chiamare metodi e proprietà specifici delle attività di Excel. Automazione offre la massima flessibilità per specificare la posizione dei dati nella cartella di lavoro, formattare la cartella di lavoro e impostare varie impostazioni in fase di esecuzione.

Con Automazione è possibile usare diverse tecniche per trasferire i dati:

  • Trasferire la cella di dati in base alla cella.
  • Trasferire i dati in una matrice in un intervallo di celle.
  • Trasferire i dati in un recordset ADO in un intervallo di celle tramite il metodo CopyFromRecordset.
  • Creare un oggetto QueryTable in un foglio di lavoro di Excel contenente il risultato di una query in un'origine dati ODBC o OLEDB.
  • Trasferire i dati negli Appunti e quindi incollare il contenuto degli Appunti in un foglio di lavoro di Excel.
    È anche possibile usare diversi metodi che non richiedono necessariamente l'automazione per trasferire i dati in Excel. Se si esegue un programma sul lato server, questo può essere un buon approccio per allontanare la maggior parte dell'elaborazione dati dai client.

Per trasferire i dati senza Automazione, è possibile usare gli approcci seguenti:

  • Trasferire i dati in un file di testo delimitato da tabulazioni o delimitato da virgole che Excel può analizzare in seguito nelle celle di un foglio di lavoro.
  • Trasferire i dati in un foglio di lavoro usando ADO.NET.
  • Trasferire i dati XML in Excel (versione 2002 e 2003) per fornire dati formattati e disposti in righe e colonne.

Questo articolo fornisce una discussione e un esempio di codice per ognuna di queste tecniche. La sezione "Create the Complete Sample Visual C# 2005 or Visual C# .NET Project", più avanti in questo articolo, illustra come creare un programma Visual C# .NET che esegue ogni tecnica.

Tecniche

Usare l'automazione per trasferire celle dati per cella

Con Automazione è possibile trasferire i dati in un foglio di lavoro una cella alla volta:

// Start a new workbook in Excel.
m_objExcel = new Excel.Application();
m_objBooks = (Excel.Workbooks)m_objExcel.Workbooks;
m_objBook = (Excel._Workbook)(m_objBooks.Add(m_objOpt));

// Add data to cells in the first worksheet in the new workbook.
m_objSheets = (Excel.Sheets)m_objBook.Worksheets;
m_objSheet = (Excel._Worksheet)(m_objSheets.get_Item(1));
m_objRange = m_objSheet.get_Range("A1", m_objOpt);
m_objRange.Value = "Last Name";
m_objRange = m_objSheet.get_Range("B1", m_objOpt);
m_objRange.Value = "First Name";
m_objRange = m_objSheet.get_Range("A2", m_objOpt);
m_objRange.Value = "Doe";
m_objRange = m_objSheet.get_Range("B2", m_objOpt);
m_objRange.Value = "John";

// Apply bold to cells A1:B1.
m_objRange = m_objSheet.get_Range("A1", "B1");
m_objFont = m_objRange.Font;
m_objFont.Bold=true;

// Save the Workbook and quit Excel.
m_objBook.SaveAs(m_strSampleFolder + "Book1.xls", m_objOpt, m_objOpt, 
m_objOpt, m_objOpt, m_objOpt, Excel.XlSaveAsAccessMode.xlNoChange, 
m_objOpt, m_objOpt, m_objOpt, m_objOpt);
m_objBook.Close(false, m_objOpt, m_objOpt);
m_objExcel.Quit();

Il trasferimento di celle di dati per cella è un approccio accettabile se si dispone di una piccola quantità di dati. È possibile inserire i dati in qualsiasi punto della cartella di lavoro e formattare le celle in modo condizionale in fase di esecuzione. Tuttavia, non è consigliabile usare questo approccio se si dispone di una grande quantità di dati da trasferire in una cartella di lavoro di Excel. Ogni oggetto Range acquisito in fase di esecuzione genera una richiesta di interfaccia che comporta trasferimenti di dati più lenti. Inoltre, Microsoft Windows 95, Microsoft Windows 98 e Microsoft Windows Millennium Edition (Me) hanno una limitazione di 64 kilobyte (KB) sulle richieste di interfaccia. Se sono presenti più di 64 KB di richieste di interfaccia, il server di automazione (Excel) potrebbe smettere di rispondere oppure potrebbero essere visualizzati messaggi di errore che indicano memoria insufficiente.

Anche in questo caso, il trasferimento di cella dati per cella è accettabile solo per piccole quantità di dati. Se è necessario trasferire set di dati di grandi dimensioni in Excel, provare a usare uno degli altri approcci descritti in questo articolo per trasferire i dati in blocco.

Per altre informazioni e per un esempio di automazione di Excel con Visual C# .NET, fare clic sul numero dell'articolo seguente per visualizzare l'articolo della Microsoft Knowledge Base:

302084 HOWTO: Automatizzare Microsoft Excel da Microsoft Visual C# .NET

Usare l'automazione per trasferire una matrice di dati in un intervallo in un foglio di lavoro

È possibile trasferire una matrice di dati in un intervallo di più celle contemporaneamente:

// Start a new workbook in Excel.
m_objExcel = new Excel.Application();
m_objBooks = (Excel.Workbooks)m_objExcel.Workbooks;
m_objBook = (Excel._Workbook)(m_objBooks.Add(m_objOpt));
m_objSheets = (Excel.Sheets)m_objBook.Worksheets;
m_objSheet = (Excel._Worksheet)(m_objSheets.get_Item(1));

// Create an array for the headers and add it to cells A1:C1.
object[] objHeaders = {"Order ID", "Amount", "Tax"};
m_objRange = m_objSheet.get_Range("A1", "C1");
m_objRange.Value = objHeaders;
m_objFont = m_objRange.Font;
m_objFont.Bold=true;

// Create an array with 3 columns and 100 rows and add it to
// the worksheet starting at cell A2.
object[,] objData = new Object[100,3];
Random rdm = new Random((int)DateTime.Now.Ticks);
double nOrderAmt, nTax;
for(int r=0;r<100;r++)
{
objData[r,0] = "ORD" + r.ToString("0000");
nOrderAmt = rdm.Next(1000);
objData[r,1] = nOrderAmt.ToString("c");
nTax = nOrderAmt*0.07;
objData[r,2] = nTax.ToString("c");
}
m_objRange = m_objSheet.get_Range("A2", m_objOpt);
m_objRange = m_objRange.get_Resize(100,3);
m_objRange.Value = objData;

// Save the Workbook and quit Excel.
m_objBook.SaveAs(m_strSampleFolder + "Book2.xls", m_objOpt, m_objOpt, 
m_objOpt, m_objOpt, m_objOpt, Excel.XlSaveAsAccessMode.xlNoChange, 
m_objOpt, m_objOpt, m_objOpt, m_objOpt);
m_objBook.Close(false, m_objOpt, m_objOpt);
m_objExcel.Quit();

Se si trasferiscono i dati usando una matrice anziché una cella per cella, è possibile ottenere un enorme miglioramento delle prestazioni con una grande quantità di dati. Si considerino le righe seguenti del codice di cui sopra che trasferiscono i dati a 300 celle nel foglio di lavoro:

objRange = objSheet.get_Range("A2", m_objOpt);
objRange = objRange.get_Resize(100,3);
objRange.Value = objData;

Questo codice rappresenta due richieste di interfaccia: una per l'oggetto Range restituito dal metodo Range e un'altra per l'oggetto Range restituito dal metodo Resize. Al contrario, il trasferimento della cella dati per cella richiede richieste per 300 interfacce agli oggetti Range. Quando possibile, è possibile trarre vantaggio dal trasferimento in blocco dei dati e dalla riduzione del numero di richieste di interfaccia effettuate.

Per altre informazioni sull'uso di matrici per ottenere e impostare valori negli intervalli con Automazione Excel, fare clic sul numero dell'articolo seguente per visualizzare l'articolo della Microsoft Knowledge Base:

302096 HOWTO: Automatizzare Excel con Visual C# .NET per compilare o ottenere dati in un intervallo usando matrici

Usare Automazione per trasferire un recordset ADO in un intervallo di fogli di lavoro

I modelli a oggetti per Excel 2000, Excel 2002 ed Excel 2003 forniscono il metodo CopyFromRecordset per trasferire un recordset ADO in un intervallo di un foglio di lavoro. Il codice seguente illustra come automatizzare Excel per trasferire il contenuto della tabella Orders nel database di esempio Northwind usando il metodo CopyFromRecordset:

// Create a Recordset from all the records in the Orders table.
ADODB.Connection objConn = new ADODB.Connection();
ADODB._Recordset objRS = null;
objConn.Open("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" +
m_strNorthwind + ";", "", "", 0);
objConn.CursorLocation = ADODB.CursorLocationEnum.adUseClient;
object objRecAff;
objRS = (ADODB._Recordset)objConn.Execute("Orders", out objRecAff, 
(int)ADODB.CommandTypeEnum.adCmdTable);

// Start a new workbook in Excel.
m_objExcel = new Excel.Application();
m_objBooks = (Excel.Workbooks)m_objExcel.Workbooks;
m_objBook = (Excel._Workbook)(m_objBooks.Add(m_objOpt));
m_objSheets = (Excel.Sheets)m_objBook.Worksheets;
m_objSheet = (Excel._Worksheet)(m_objSheets.get_Item(1));

// Get the Fields collection from the recordset and determine
// the number of fields (or columns).
System.Collections.IEnumerator objFields = objRS.Fields.GetEnumerator();
int nFields = objRS.Fields.Count;

// Create an array for the headers and add it to the
// worksheet starting at cell A1.
object[] objHeaders = new object[nFields];
ADODB.Field objField = null;
for(int n=0;n<nFields;n++)
{
objFields.MoveNext();
objField = (ADODB.Field)objFields.Current;
objHeaders[n] = objField.Name;
}
m_objRange = m_objSheet.get_Range("A1", m_objOpt);
m_objRange = m_objRange.get_Resize(1, nFields);
m_objRange.Value = objHeaders;
m_objFont = m_objRange.Font;
m_objFont.Bold=true;

// Transfer the recordset to the worksheet starting at cell A2.
m_objRange = m_objSheet.get_Range("A2", m_objOpt);
m_objRange.CopyFromRecordset(objRS, m_objOpt, m_objOpt);

// Save the Workbook and quit Excel.
m_objBook.SaveAs(m_strSampleFolder + "Book3.xls", m_objOpt, m_objOpt, 
m_objOpt, m_objOpt, m_objOpt, Excel.XlSaveAsAccessMode.xlNoChange, 
m_objOpt, m_objOpt, m_objOpt, m_objOpt);
m_objBook.Close(false, m_objOpt, m_objOpt);
m_objExcel.Quit();

// Close the recordset and connection.
objRS.Close();
objConn.Close();

Nota

CopyFromRecordset funziona solo con oggetti Recordset ADO. Non è possibile utilizzare il DataSet creato usando ADO.NET con il metodo CopyFromRecordset. Diversi esempi nelle sezioni seguenti illustrano come trasferire i dati in Excel con ADO.NET.

Usare Automazione per creare un oggetto QueryTable in un foglio di lavoro

Un oggetto QueryTable rappresenta una tabella compilata da dati restituiti da un'origine dati esterna. Quando si automatizza Excel, è possibile creare una tabella QueryTable fornendo una stringa di connessione a un'origine dati OLE DB o ODBC e una stringa SQL. Excel genera il recordset e inserisce il recordset nel foglio di lavoro nella posizione specificata. Gli oggetti QueryTable offrono i vantaggi seguenti rispetto al metodo CopyFromRecordset:

  • Excel gestisce la creazione del recordset e il relativo posizionamento nel foglio di lavoro.
  • È possibile salvare la query con l'oggetto QueryTable e aggiornarla in un secondo momento per ottenere un recordset aggiornato.
  • Quando si aggiunge una nuova tabella QueryTable al foglio di lavoro, è possibile specificare che i dati già presenti nelle celle del foglio di lavoro devono essere spostati per gestire i nuovi dati. Per altre informazioni, vedere la proprietà RefreshStyle.

Il codice seguente illustra come automatizzare Excel 2000, Excel 2002 o Excel 2003 per creare una nuova tabella QueryTable in un foglio di lavoro di Excel usando i dati del database di esempio Northwind:

// Start a new workbook in Excel.
m_objExcel = new Excel.Application();
m_objBooks = (Excel.Workbooks)m_objExcel.Workbooks;
m_objBook = (Excel._Workbook)(m_objBooks.Add(m_objOpt));

// Create a QueryTable that starts at cell A1.
m_objSheets = (Excel.Sheets)m_objBook.Worksheets;
m_objSheet = (Excel._Worksheet)(m_objSheets.get_Item(1));
m_objRange = m_objSheet.get_Range("A1", m_objOpt);
m_objQryTables = m_objSheet.QueryTables;
m_objQryTable = (Excel._QueryTable)m_objQryTables.Add(
"OLEDB;Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" +
m_strNorthwind + ";", m_objRange, "Select * From Orders");
m_objQryTable.RefreshStyle = Excel.XlCellInsertionMode.xlInsertEntireRows;
m_objQryTable.Refresh(false);

// Save the workbook and quit Excel.
m_objBook.SaveAs(m_strSampleFolder + "Book4.xls", m_objOpt, m_objOpt, 
m_objOpt, m_objOpt, m_objOpt, Excel.XlSaveAsAccessMode.xlNoChange, m_objOpt, m_objOpt,
m_objOpt, m_objOpt);
m_objBook.Close(false, m_objOpt, m_objOpt);
m_objExcel.Quit();

Usare gli Appunti di Windows

È possibile usare gli Appunti di Windows per trasferire i dati in un foglio di lavoro. Per incollare i dati in più celle di un foglio di lavoro, è possibile copiare una stringa in cui le colonne sono delimitate da caratteri TAB e le righe sono delimitate da ritorni a capo. Il codice seguente illustra come Visual C# .NET può usare gli Appunti di Windows per trasferire i dati in Excel:

// Copy a string to the Windows clipboard.
string sData = "FirstName\tLastName\tBirthdate\r\n"  +
"Bill\tBrown\t2/5/85\r\n"  +
"Joe\tThomas\t1/1/91";
System.Windows.Forms.Clipboard.SetDataObject(sData);

// Start a new workbook in Excel.
m_objExcel = new Excel.Application();
m_objBooks = (Excel.Workbooks)m_objExcel.Workbooks;
m_objBook = (Excel._Workbook)(m_objBooks.Add(m_objOpt));

// Paste the data starting at cell A1.
m_objSheets = (Excel.Sheets)m_objBook.Worksheets;
m_objSheet = (Excel._Worksheet)(m_objSheets.get_Item(1));
m_objRange = m_objSheet.get_Range("A1", m_objOpt);
m_objSheet.Paste(m_objRange, false);

// Save the workbook and quit Excel.
m_objBook.SaveAs(m_strSampleFolder + "Book5.xls", m_objOpt, m_objOpt, 
m_objOpt, m_objOpt, m_objOpt, Excel.XlSaveAsAccessMode.xlNoChange, m_objOpt, m_objOpt,
m_objOpt, m_objOpt);
m_objBook.Close(false, m_objOpt, m_objOpt);
m_objExcel.Quit();

Creare un file di testo delimitato che Excel può analizzare in righe e colonne

Excel può aprire file delimitati da tabulazioni o virgole e analizzare correttamente i dati in celle. È possibile usare questa funzionalità quando si vuole trasferire una grande quantità di dati in un foglio di lavoro usando un'automazione minima, se presente. Questo potrebbe essere un buon approccio per un programma client-server perché il file di testo può essere generato sul lato server. È quindi possibile aprire il file di testo nel client usando Automazione, dove appropriato.

Il codice seguente illustra come generare un file di testo delimitato da tabulazioni dai dati letti con ADO.NET:

// Connect to the data source.
System.Data.OleDb.OleDbConnection objConn = new System.Data.OleDb.OleDbConnection( 
"Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" + m_strNorthwind + ";");
objConn.Open();

// Execute a command to retrieve all records from the Employees table.
System.Data.OleDb.OleDbCommand objCmd = new System.Data.OleDb.OleDbCommand( 
"Select * From Employees", objConn);
System.Data.OleDb.OleDbDataReader objReader;
objReader = objCmd.ExecuteReader();

// Create the FileStream and StreamWriter object to write 
// the recordset contents to file.
System.IO.FileStream fs = new System.IO.FileStream(
m_strSampleFolder + "Book6.txt", System.IO.FileMode.Create);
System.IO.StreamWriter sw = new System.IO.StreamWriter(
fs, System.Text.Encoding.Unicode);

// Write the field names (headers) as the first line in the text file.
sw.WriteLine(objReader.GetName(0) +  "\t" + objReader.GetName(1) +
"\t" + objReader.GetName(2) + "\t" + objReader.GetName(3) +
"\t" + objReader.GetName(4) + "\t" + objReader.GetName(5));

// Write the first six columns in the recordset to a text file as
// tab-delimited.
while(objReader.Read()) 
{
for(int i=0;i<=5;i++)
{
if(!objReader.IsDBNull(i))
{
string s;
s = objReader.GetDataTypeName(i);
if(objReader.GetDataTypeName(i)=="DBTYPE_I4")
{
sw.Write(objReader.GetInt32(i).ToString());
}
else if(objReader.GetDataTypeName(i)=="DBTYPE_DATE")
{
sw.Write(objReader.GetDateTime(i).ToString("d"));
}
else if (objReader.GetDataTypeName(i)=="DBTYPE_WVARCHAR")
{
sw.Write(objReader.GetString(i));
}
}
if(i<5) sw.Write("\t");
}
sw.WriteLine(); 
}
sw.Flush();// Write the buffered data to the filestream.

// Close the FileStream.
fs.Close();

// Close the reader and the connection.
objReader.Close();
objConn.Close(); 

Il codice di cui sopra non usa automazione. Tuttavia, se si desidera, è possibile usare Automazione per aprire il file di testo e salvare il file nel formato della cartella di lavoro di Excel, in modo simile al seguente:

// Open the text file in Excel.
m_objExcel = new Excel.Application();
m_objBooks = (Excel.Workbooks)m_objExcel.Workbooks;
m_objBooks.OpenText(m_strSampleFolder + "Book6.txt", Excel.XlPlatform.xlWindows, 1, 
Excel.XlTextParsingType.xlDelimited, Excel.XlTextQualifier.xlTextQualifierDoubleQuote,
false, true, false, false, false, false, m_objOpt, m_objOpt, 
m_objOpt, m_objOpt, m_objOpt);

m_objBook = m_objExcel.ActiveWorkbook;

// Save the text file in the typical workbook format and quit Excel.
m_objBook.SaveAs(m_strSampleFolder + "Book6.xls", Excel.XlFileFormat.xlWorkbookNormal, 
m_objOpt, m_objOpt, m_objOpt, m_objOpt, Excel.XlSaveAsAccessMode.xlNoChange, m_objOpt, m_objOpt,
m_objOpt, m_objOpt);
m_objBook.Close(false, m_objOpt, m_objOpt);
m_objExcel.Quit();

Trasferire dati in un foglio di lavoro usando ADO.NET

È possibile usare il provider OLE DB di Microsoft Jet per aggiungere record a una tabella in una cartella di lavoro di Excel esistente. Una tabella in Excel è semplicemente un intervallo di celle; l'intervallo può avere un nome definito. In genere, la prima riga dell'intervallo contiene le intestazioni (o i nomi di campo) e tutte le righe successive nell'intervallo contengono i record.

Il codice seguente aggiunge due nuovi record a una tabella in Book7.xls. La tabella in questo caso è Sheet1:

// Establish a connection to the data source.
System.Data.OleDb.OleDbConnection objConn = new System.Data.OleDb.OleDbConnection(
"Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" + m_strSampleFolder +
"Book7.xls;Extended Properties=Excel 8.0;");
objConn.Open();

// Add two records to the table named 'MyTable'.
System.Data.OleDb.OleDbCommand objCmd = new System.Data.OleDb.OleDbCommand();
objCmd.Connection = objConn;
objCmd.CommandText = "Insert into MyTable (FirstName, LastName)" +
" values ('Bill', 'Brown')";
objCmd.ExecuteNonQuery();
objCmd.CommandText = "Insert into MyTable (FirstName, LastName)" +
" values ('Joe', 'Thomas')";
objCmd.ExecuteNonQuery();

// Close the connection.
objConn.Close();

Quando si aggiungono record con ADO.NET come illustrato in questo esempio, la formattazione nella cartella di lavoro viene mantenuta. Ogni record aggiunto a una riga prende in prestito il formato dalla riga precedente.

Per altre informazioni sull'uso di ADO.NET, fare clic sui numeri degli articoli seguenti per visualizzare gli articoli della Microsoft Knowledge Base:

306636 PROCEDURA: Connettersi a un database ed eseguire un comando usando ADO.NET e Visual C# .NET

314145 PROCEDURA: Popolare un oggetto DataSet da un database usando Visual C# .NET

307587 PROCEDURA: Aggiornare un database da un oggetto DataSet usando Visual C# .NET

Per altre informazioni sull'uso del provider OLEDB Jet con origini dati di Excel, fare clic sui numeri degli articoli seguenti per visualizzare gli articoli della Microsoft Knowledge Base:

278973 SAMPLE: ExcelADO illustra come usare ADO per leggere e scrivere dati in cartelle di lavoro di Excel

257819 HOWTO: Usare ADO con i dati di Excel di Visual Basic o VBA

Trasferire dati XML (Excel 2002 ed Excel 2003)

Excel 2002 e 2003 possono aprire qualsiasi file XML ben formato. È possibile aprire i file XML direttamente tramite il comando Apri dal menu File o a livello di codice usando i metodi Open o OpenXML dell'insieme Workbooks. Se si creano file XML da usare in Excel, è anche possibile creare fogli di stile per formattare i dati.

Creare il progetto .NET di esempio completo di Visual C#

  1. Creare una nuova cartella denominata C:\ExcelData. Il programma di esempio archivierà le cartelle di lavoro di Excel in questa cartella.

  2. Creare una nuova cartella di lavoro in cui scrivere l'esempio:

    1. Avviare una nuova cartella di lavoro in Excel.
    2. In Sheet1 della nuova cartella di lavoro digitare FirstName nella cella A1 e LastName nella cella B1.
    3. Selezionare A1:B1.
    4. Scegliere Nome dal menu Inserisci e quindi fare clic su Definisci. Digitare il nome MyTable e quindi fare clic su OK.
    5. Salvare la cartella di lavoro come C:\Exceldata\Book7.xls.
    6. Uscire da Excel.
  3. Avviare Microsoft Visual Studio 2005 o Microsoft Visual Studio .NET. Scegliere Nuovo dal menu File, quindi fare clic su Progetto. In Progetti Visual C# o Visual C# selezionare Applicazione Windows. Per impostazione predefinita, viene creato Form1.

  4. Aggiungere un riferimento alla libreria di oggetti di Excel e all'assembly di interoperabilità primario ADODB. A tal fine, attenersi alla seguente procedura:

    1. Scegliere Aggiungi riferimento dal menu Progetto.
    2. Nella scheda NET individuare ADODB e quindi fare clic su Seleziona.

    Nota In Visual Studio 2005 non è necessario fare clic su Seleziona.
    3. Nella scheda COM individuare Libreria oggetti di Microsoft Excel 10.0 o Libreria oggetti di Microsoft Excel 11.0, quindi fare clic su Seleziona.

    Nota In Visual Studio 2005 non è necessario fare clic su Seleziona.

    Nota Se si usa Microsoft Excel 2002 e non è già stato fatto, Microsoft consiglia di scaricare e installare gli assembly di interoperabilità primari di Microsoft Office XP.

  5. Nella finestra di dialogo Aggiungi riferimenti fare clic su OK per accettare le selezioni.

  6. Aggiungere un controllo Casella combinata e un controllo Pulsante a Form1.

  7. Aggiungere gestori eventi per l'evento Form Load e gli eventi Click del controllo Button:

    1. Nella visualizzazione Progettazione per Form1.cs fare doppio clic su Form1.

    Il gestore per l'evento Load del form viene creato e visualizzato in Form1.cs.
    2. Nel menu Visualizza fare clic su Progettazione per passare alla visualizzazione progettazione.
    3. Fare doppio clic su Button1.

    Il gestore per l'evento Click del pulsante viene creato e visualizzato in Form1.cs.

  8. In Form1.cs sostituire il codice seguente:

    private void Form1_Load(object sender, System.EventArgs e)
    {
    
    }
    
    private void button1_Click(object sender, System.EventArgs e)
    {
    
    }
    
    

    Con:

            // Excel object references.
            private Excel.Application m_objExcel =  null;
            private Excel.Workbooks m_objBooks = null;
            private Excel._Workbook m_objBook = null;
            private Excel.Sheets m_objSheets = null;
            private Excel._Worksheet m_objSheet = null;
            private Excel.Range m_objRange =  null;
            private Excel.Font m_objFont = null;
            private Excel.QueryTables m_objQryTables = null;
            private Excel._QueryTable m_objQryTable = null;
    
    // Frequenty-used variable for optional arguments.
            private object m_objOpt = System.Reflection.Missing.Value;
    
    // Paths used by the sample code for accessing and storing data.
            private object m_strSampleFolder = "C:\\ExcelData\\";
            private string m_strNorthwind = "C:\\Program Files\\Microsoft Office\\Office10\\Samples\\Northwind.mdb";
    
    private void Form1_Load(object sender, System.EventArgs e)
            {
                comboBox1.DropDownStyle = ComboBoxStyle.DropDownList;
    
    comboBox1.Items.AddRange(new object[]{
                                                         "Use Automation to Transfer Data Cell by Cell ", 
                                                         "Use Automation to Transfer an Array of Data to a Range on a Worksheet ", 
                                                         "Use Automation to Transfer an ADO Recordset to a Worksheet Range ", 
                                                         "Use Automation to Create a QueryTable on a Worksheet", 
                                                         "Use the Clipboard", 
                                                         "Create a Delimited Text File that Excel Can Parse into Rows and Columns", 
                                                         "Transfer Data to a Worksheet Using ADO.NET "});
                comboBox1.SelectedIndex = 0;
                button1.Text = "Go!";
            }
    
    private void button1_Click(object sender, System.EventArgs e)
            {
                switch (comboBox1.SelectedIndex)
                {
                    case 0 : Automation_CellByCell(); break;
                    case 1 : Automation_UseArray(); break;
                    case 2 : Automation_ADORecordset(); break;
                    case 3 : Automation_QueryTable(); break;
                    case 4 : Use_Clipboard(); break;
                    case 5 : Create_TextFile(); break;
                    case 6 : Use_ADONET(); break;
                }
    
    //Clean-up
                m_objFont = null;
                m_objRange = null;
                m_objSheet = null;
                m_objSheets = null;
                m_objBooks = null;
                m_objBook = null;
                m_objExcel = null;
                GC.Collect();
    
    }
    
    private void Automation_CellByCell()
            {
                // Start a new workbook in Excel.
                m_objExcel = new Excel.Application();
                m_objBooks = (Excel.Workbooks)m_objExcel.Workbooks;
                m_objBook = (Excel._Workbook)(m_objBooks.Add(m_objOpt));
    
    // Add data to cells of the first worksheet in the new workbook.
                m_objSheets = (Excel.Sheets)m_objBook.Worksheets;
                m_objSheet = (Excel._Worksheet)(m_objSheets.get_Item(1));
                m_objRange = m_objSheet.get_Range("A1", m_objOpt);
                m_objRange.set_Value(m_objOpt,"Last Name");
                m_objRange = m_objSheet.get_Range("B1", m_objOpt);
                m_objRange.set_Value(m_objOpt,"First Name");
                m_objRange = m_objSheet.get_Range("A2", m_objOpt);
                m_objRange.set_Value(m_objOpt,"Doe");
                m_objRange = m_objSheet.get_Range("B2", m_objOpt);
                m_objRange.set_Value(m_objOpt,"John");
    
    // Apply bold to cells A1:B1.
                m_objRange = m_objSheet.get_Range("A1", "B1");
                m_objFont = m_objRange.Font;
                m_objFont.Bold=true;
    
    // Save the workbook and quit Excel.
                m_objBook.SaveAs(m_strSampleFolder + "Book1.xls", m_objOpt, m_objOpt, 
                    m_objOpt, m_objOpt, m_objOpt, Excel.XlSaveAsAccessMode.xlNoChange, 
                    m_objOpt, m_objOpt, m_objOpt, m_objOpt, m_objOpt);
                m_objBook.Close(false, m_objOpt, m_objOpt);
                m_objExcel.Quit();
    
    }
    
    private void Automation_UseArray()
            {
                // Start a new workbook in Excel.
                m_objExcel = new Excel.Application();
                m_objBooks = (Excel.Workbooks)m_objExcel.Workbooks;
                m_objBook = (Excel._Workbook)(m_objBooks.Add(m_objOpt));
                m_objSheets = (Excel.Sheets)m_objBook.Worksheets;
                m_objSheet = (Excel._Worksheet)(m_objSheets.get_Item(1));
    
    // Create an array for the headers and add it to cells A1:C1.
                object[] objHeaders = {"Order ID", "Amount", "Tax"};
                m_objRange = m_objSheet.get_Range("A1", "C1");
                m_objRange.set_Value(m_objOpt,objHeaders);
                m_objFont = m_objRange.Font;
                m_objFont.Bold=true;
    
    // Create an array with 3 columns and 100 rows and add it to
                // the worksheet starting at cell A2.
                object[,] objData = new Object[100,3];
                Random rdm = new Random((int)DateTime.Now.Ticks);
                double nOrderAmt, nTax;
                for(int r=0;r<100;r++)
                {
                    objData[r,0] = "ORD" + r.ToString("0000");
                    nOrderAmt = rdm.Next(1000);
                    objData[r,1] = nOrderAmt.ToString("c");
                    nTax = nOrderAmt*0.07;
                    objData[r,2] = nTax.ToString("c");
                }
                m_objRange = m_objSheet.get_Range("A2", m_objOpt);
                m_objRange = m_objRange.get_Resize(100,3);
                m_objRange.set_Value(m_objOpt,"objData");
    
    // Save the workbook and quit Excel.
                m_objBook.SaveAs(m_strSampleFolder + "Book2.xls", m_objOpt, m_objOpt, 
                    m_objOpt, m_objOpt, m_objOpt, Excel.XlSaveAsAccessMode.xlNoChange, 
                    m_objOpt, m_objOpt, m_objOpt, m_objOpt, m_objOpt);
                m_objBook.Close(false, m_objOpt, m_objOpt);
                m_objExcel.Quit();
    
    }
    
    private void Automation_ADORecordset()
            {
                // Create a Recordset from all the records in the Orders table.
                ADODB.Connection objConn = new ADODB.Connection();
                ADODB._Recordset objRS = null;
                objConn.Open("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" +
                    m_strNorthwind + ";", "", "", 0);
                objConn.CursorLocation = ADODB.CursorLocationEnum.adUseClient;
                object objRecAff;
                objRS = (ADODB._Recordset)objConn.Execute("Orders", out objRecAff, 
                    (int)ADODB.CommandTypeEnum.adCmdTable);
    
    // Start a new workbook in Excel.
                m_objExcel = new Excel.Application();
                m_objBooks = (Excel.Workbooks)m_objExcel.Workbooks;
                m_objBook = (Excel._Workbook)(m_objBooks.Add(m_objOpt));
                m_objSheets = (Excel.Sheets)m_objBook.Worksheets;
                m_objSheet = (Excel._Worksheet)(m_objSheets.get_Item(1));
    
    // Get the Fields collection from the recordset and determine
                // the number of fields (or columns).
                System.Collections.IEnumerator objFields = objRS.Fields.GetEnumerator();
                int nFields = objRS.Fields.Count;
    
    // Create an array for the headers and add it to the
                // worksheet starting at cell A1.
                object[] objHeaders = new object[nFields];
                ADODB.Field objField = null;
                for(int n=0;n<nFields;n++)
                {
                    objFields.MoveNext();
                    objField = (ADODB.Field)objFields.Current;
                    objHeaders[n] = objField.Name;
                }
                m_objRange = m_objSheet.get_Range("A1", m_objOpt);
                m_objRange = m_objRange.get_Resize(1, nFields);
                m_objRange.set_Value(m_objOpt,objHeaders);
                m_objFont = m_objRange.Font;
                m_objFont.Bold=true;
    
    // Transfer the recordset to the worksheet starting at cell A2.
                m_objRange = m_objSheet.get_Range("A2", m_objOpt);
                m_objRange.CopyFromRecordset(objRS, m_objOpt, m_objOpt);
    
    // Save the workbook and quit Excel.
                m_objBook.SaveAs(m_strSampleFolder + "Book3.xls", m_objOpt, m_objOpt, 
                    m_objOpt, m_objOpt, m_objOpt, Excel.XlSaveAsAccessMode.xlNoChange, 
                    m_objOpt, m_objOpt, m_objOpt, m_objOpt, m_objOpt);
                m_objBook.Close(false, m_objOpt, m_objOpt);
                m_objExcel.Quit();
    
    //Close the recordset and connection
                objRS.Close();
                objConn.Close();
    
    }
    
    private void Automation_QueryTable()
            {
                // Start a new workbook in Excel.
                m_objExcel = new Excel.Application();
                m_objBooks = (Excel.Workbooks)m_objExcel.Workbooks;
                m_objBook = (Excel._Workbook)(m_objBooks.Add(m_objOpt));
    
    // Create a QueryTable that starts at cell A1.
                m_objSheets = (Excel.Sheets)m_objBook.Worksheets;
                m_objSheet = (Excel._Worksheet)(m_objSheets.get_Item(1));
                m_objRange = m_objSheet.get_Range("A1", m_objOpt);
                m_objQryTables = m_objSheet.QueryTables;
                m_objQryTable = (Excel._QueryTable)m_objQryTables.Add(
                    "OLEDB;Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" +
                    m_strNorthwind + ";", m_objRange, "Select * From Orders");
                m_objQryTable.RefreshStyle = Excel.XlCellInsertionMode.xlInsertEntireRows;
                m_objQryTable.Refresh(false);
    
    // Save the workbook and quit Excel.
                m_objBook.SaveAs(m_strSampleFolder + "Book4.xls", m_objOpt, m_objOpt, 
                    m_objOpt, m_objOpt, m_objOpt, Excel.XlSaveAsAccessMode.xlNoChange, m_objOpt, m_objOpt,
                    m_objOpt, m_objOpt, m_objOpt);
                m_objBook.Close(false, m_objOpt, m_objOpt);
                m_objExcel.Quit();
    
    }
    
    private void Use_Clipboard()
            {
                // Copy a string to the clipboard.
                string sData = "FirstName\tLastName\tBirthdate\r\n"  +
                    "Bill\tBrown\t2/5/85\r\n"  +
                    "Joe\tThomas\t1/1/91";
                System.Windows.Forms.Clipboard.SetDataObject(sData);
    
    // Start a new workbook in Excel.
                m_objExcel = new Excel.Application();
                m_objBooks = (Excel.Workbooks)m_objExcel.Workbooks;
                m_objBook = (Excel._Workbook)(m_objBooks.Add(m_objOpt));
    
    // Paste the data starting at cell A1.
                m_objSheets = (Excel.Sheets)m_objBook.Worksheets;
                m_objSheet = (Excel._Worksheet)(m_objSheets.get_Item(1));
                m_objRange = m_objSheet.get_Range("A1", m_objOpt);
                m_objSheet.Paste(m_objRange, false);
    
    // Save the workbook and quit Excel.
                m_objBook.SaveAs(m_strSampleFolder + "Book5.xls", m_objOpt, m_objOpt, 
                    m_objOpt, m_objOpt, m_objOpt, Excel.XlSaveAsAccessMode.xlNoChange, m_objOpt, m_objOpt,
                    m_objOpt, m_objOpt, m_objOpt);
                m_objBook.Close(false, m_objOpt, m_objOpt);
                m_objExcel.Quit();
    
    }
    
    private void Create_TextFile()
            {
                // Connect to the data source.
                System.Data.OleDb.OleDbConnection objConn = new System.Data.OleDb.OleDbConnection( 
                    "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" + m_strNorthwind + ";");
                objConn.Open();
    
    // Execute a command to retrieve all records from the Employees  table.
                System.Data.OleDb.OleDbCommand objCmd = new System.Data.OleDb.OleDbCommand( 
                    "Select * From Employees", objConn);
                System.Data.OleDb.OleDbDataReader objReader;
                objReader = objCmd.ExecuteReader();
    
    // Create the FileStream and StreamWriter object to write 
                // the recordset contents to file.
                System.IO.FileStream fs = new System.IO.FileStream(
                    m_strSampleFolder + "Book6.txt", System.IO.FileMode.Create);
                System.IO.StreamWriter sw = new System.IO.StreamWriter(
                    fs, System.Text.Encoding.Unicode);
    
    // Write the field names (headers) as the first line in the text file.
                sw.WriteLine(objReader.GetName(0) +  "\t" + objReader.GetName(1) +
                    "\t" + objReader.GetName(2) + "\t" + objReader.GetName(3) +
                    "\t" + objReader.GetName(4) + "\t" + objReader.GetName(5));
    
    // Write the first six columns in the recordset to a text file as
                // tab-delimited.
                while(objReader.Read()) 
                {
                    for(int i=0;i<=5;i++)
                    {
                        if(!objReader.IsDBNull(i))
                        {
                            string s;
                            s = objReader.GetDataTypeName(i);
                            if(objReader.GetDataTypeName(i)=="DBTYPE_I4")
                            {
                                sw.Write(objReader.GetInt32(i).ToString());
                            }
                            else if(objReader.GetDataTypeName(i)=="DBTYPE_DATE")
                            {
                                sw.Write(objReader.GetDateTime(i).ToString("d"));
                            }
                            else if (objReader.GetDataTypeName(i)=="DBTYPE_WVARCHAR")
                            {
                                sw.Write(objReader.GetString(i));
                            }
                        }
                        if(i<5) sw.Write("\t");
                    }
                    sw.WriteLine(); 
                }
                sw.Flush();// Write the buffered data to the FileStream.
    
    // Close the FileStream.
                fs.Close();
    
    // Close the reader and the connection.
                objReader.Close();
                objConn.Close(); 
    
    // ==================================================================
                // Optionally, automate Excel to open the text file and save it in the
                // Excel workbook format.
    
    // Open the text file in Excel.
                m_objExcel = new Excel.Application();
                m_objBooks = (Excel.Workbooks)m_objExcel.Workbooks;
                m_objBooks.OpenText(m_strSampleFolder + "Book6.txt", Excel.XlPlatform.xlWindows, 1, 
                    Excel.XlTextParsingType.xlDelimited, Excel.XlTextQualifier.xlTextQualifierDoubleQuote,
                    false, true, false, false, false, false, m_objOpt, m_objOpt, 
                    m_objOpt, m_objOpt, m_objOpt, m_objOpt, m_objOpt);
    
    m_objBook = m_objExcel.ActiveWorkbook;
    
    // Save the text file in the typical workbook format and quit Excel.
                m_objBook.SaveAs(m_strSampleFolder + "Book6.xls", Excel.XlFileFormat.xlWorkbookNormal, 
                    m_objOpt, m_objOpt, m_objOpt, m_objOpt, Excel.XlSaveAsAccessMode.xlNoChange, m_objOpt, m_objOpt,
                    m_objOpt, m_objOpt, m_objOpt);
                m_objBook.Close(false, m_objOpt, m_objOpt);
                m_objExcel.Quit();
    
    }
    
    private void Use_ADONET()
            {
                // Establish a connection to the data source.
                System.Data.OleDb.OleDbConnection objConn = new System.Data.OleDb.OleDbConnection(
                    "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" + m_strSampleFolder +
                    "Book7.xls;Extended Properties=Excel 8.0;");
                objConn.Open();
    
    // Add two records to the table named 'MyTable'.
                System.Data.OleDb.OleDbCommand objCmd = new System.Data.OleDb.OleDbCommand();
                objCmd.Connection = objConn;
                objCmd.CommandText = "Insert into MyTable (FirstName, LastName)" +
                    " values ('Bill', 'Brown')";
    
    objCmd.ExecuteNonQuery();
                objCmd.CommandText = "Insert into MyTable (FirstName, LastName)" +
                    " values ('Joe', 'Thomas')";
                objCmd.ExecuteNonQuery();
    
    // Close the connection.
                objConn.Close(); 
    
    } 
    
    }  // End Class
    }// End namespace
    
    

    Nota È necessario modificare il codice in Visual Studio 2005. Per impostazione predefinita, Visual C# aggiunge una maschera al progetto quando si crea un progetto Windows Forms. Il modulo è denominato Form1. I due file che rappresentano il modulo sono denominati Form1.cs e Form1.designer.cs. Il codice viene scritto in Form1.cs. Nel file Form1.designer.cs il Windows Forms Designer scrive il codice che implementa tutte le azioni eseguite trascinando ed eliminando i controlli dalla casella degli strumenti.

    Per altre informazioni su Progettazione Windows Forms in Visual C# 2005, visitare il seguente sito Web Microsoft Developer Network (MSDN):

    Creazione di un progetto (Visual C#) Nota Se Office non è stato installato nella cartella predefinita (C:\Programmi\Microsoft Office), modificare la costante m_strNorthwind nell'esempio di codice in modo che corrisponda al percorso di installazione per Northwind.mdb.

  9. Aggiungere quanto segue alle direttive Using in Form1.cs:

    using System.Reflection;
    using System.Runtime.InteropServices;
    using Excel = Microsoft.Office.Interop.Excel;
    
  10. Premere F5 per compilare ed eseguire l'esempio.

Riferimenti

Per maggiori informazioni, visitare il seguente sito Web Microsoft:

Sviluppo di Microsoft Office con Visual Studio