Přenos dat do excelového sešitu pomocí jazyka Visual C# 2005 nebo Visual C# .NET

Microsoft Visual Basic 6.0 verzi tohoto článku naleznete v 247412.

Tento podrobný článek popisuje několik metod pro přenos dat do aplikace Microsoft Excel 2002 z aplikace Microsoft Visual C# 2005 nebo Microsoft Visual C# .NET. Tento článek také představuje výhody a nevýhody jednotlivých metod, abyste mohli vybrat řešení, které nejlépe vyhovuje vaší situaci.

Přehled

Technikou, která se nejčastěji používá k přenosu dat do excelového sešitu, je automatizace. S automatizací můžete volat metody a vlastnosti, které jsou specifické pro úlohy Excelu. Automatizace poskytuje největší flexibilitu pro určení umístění dat v sešitu, formátování sešitu a provádění různých nastavení za běhu.

Se službou Automation můžete k přenosu dat použít několik technik:

  • Přenos datové buňky po buňce
  • Přenos dat v matici do oblasti buněk
  • Přenos dat v sadě záznamů ADO do oblasti buněk pomocí CopyFromRecordset metoda.
  • Vytvořte objekt QueryTable na listu aplikace Excel, který obsahuje výsledek dotazu ve zdroji dat ODBC nebo OLEDB.
  • Přeneste data do schránky a vložte obsah schránky do excelového listu.
    Můžete také použít několik metod, které nemusí nutně vyžadovat automatizaci pro přenos dat do Excelu. Pokud spouštíte program na straně serveru, může to být dobrý přístup k tomu, abyste většinu zpracování dat od svých klientů odebrali.

Pokud chcete přenést data bez služby Automation, můžete použít následující přístupy:

  • Přeneste data do textového souboru odděleného tabulátory nebo textového souboru s oddělovači, který excel může později analyzovat do buněk na listu.
  • Přeneste data do listu pomocí ADO.NET.
  • Přeneste data XML do Excelu (verze 2002 a 2003) a poskytněte tak data, která jsou formátovaná a uspořádaná do řádků a sloupců.

Tento článek obsahuje diskuzi a ukázku kódu pro každou z těchto technik. Část Vytvoření kompletního ukázkového projektu Visual C# 2005 nebo Visual C# .NET dále v tomto článku ukazuje, jak vytvořit program Visual C# .NET, který spustí jednotlivé techniky.

Techniky

Použití automatizace k přenosu datové buňky po buňce

Pomocí služby Automation můžete přenášet data do listu po jedné buňce:

// 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();

Přenos datových buněk po buňku je přijatelný přístup, pokud máte malé množství dat. Máte flexibilitu umístit data kamkoli do sešitu a buňky můžete naformátovat podmíněně za běhu. Tento přístup ale není vhodné použít, pokud máte velké množství dat k přenosu do excelového sešitu. Výsledkem každého objektu Range, který získáte za běhu, je požadavek na rozhraní, který znamená pomalejší přenos dat. Microsoft Windows 95, Microsoft Windows 98 a Microsoft Windows Millennium Edition (Me) navíc mají omezení 64 kilobajtů (KB) pro požadavky rozhraní. Pokud máte více než 64 kB požadavků na rozhraní, může server Automation (Excel) přestat reagovat nebo se mohou zobrazit chybové zprávy, které indikují nedostatek paměti.

Opět platí, že přenos datové buňky po buňce je přijatelný jenom pro malé množství dat. Pokud potřebujete přenést velké datové sady do Excelu, zvažte použití jednoho z dalších přístupů popsaných v tomto článku k hromadnému přenosu dat.

Další informace a příklad automatizace aplikace Excel pomocí jazyka Visual C# .NET získáte v následujícím článku znalostní báze Microsoft Knowledge Base:

302084 POSTUPY: Automatizace Microsoft Excelu z Microsoft Visual C# .NET

Použití automatizace k přenosu pole dat do oblasti na listu

Pole dat můžete přenést do oblasti více buněk najednou:

// 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();

Pokud data přenášíte pomocí pole místo buňky po buňce, můžete dosáhnout obrovského zvýšení výkonu s velkým množstvím dat. Zvažte následující řádky z výše uvedeného kódu, který přenáší data do 300 buněk v listu:

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

Tento kód představuje dva požadavky rozhraní: jeden pro Range objekt, který Range metoda vrátí, a druhý pro Range objektu, Resize metoda vrátí. Naproti tomu přenos datové buňky po buňce vyžaduje požadavky na 300 rozhraní na objekty Range. Kdykoli je to možné, můžete těžit z hromadného přenosu dat a snížení počtu požadavků na rozhraní, které provedete.

Další informace o použití polí k získání a nastavení hodnot v oblastech pomocí automatizace aplikace Excel získáte v následujícím článku znalostní báze Microsoft Knowledge Base:

302096 POSTUPY: Automatizace Excelu pomocí Visual C# .NET k vyplnění nebo získání dat v oblasti pomocí polí

Použití automatizace k přenosu sady záznamů ADO do oblasti listu

Objektové modely aplikace Excel 2000, Excel 2002 a Excel 2003 poskytují metodu CopyFromRecordset pro přenos sady záznamů ADO do oblasti na listu. Následující kód ukazuje, jak automatizovat aplikaci Excel k přenosu obsahu tabulky Orders v ukázkové databázi Northwind pomocí metody 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();

Poznámka

CopyFromRecordset funguje pouze s objekty sady záznamů ADO. Datovou sadu, kterou vytvoříte, nelze použít pomocí ADO.NET s metodou CopyFromRecordset. Několik příkladů v následujících částech ukazuje, jak přenést data do Excelu pomocí ADO.NET.

Použití automatizace k vytvoření objektu QueryTable na listu

Objekt QueryTable představuje tabulku vytvořenou z dat vrácených z externího zdroje dat. Když automatizujete Excel, můžete vytvořit tabulku dotazu zadáním připojovacího řetězce do ole databáze nebo zdroje dat ODBC a řetězce SQL. Excel vygeneruje sadu záznamů a vloží sadu záznamů do listu v umístění, které zadáte. Objekty QueryTable nabízejí oproti metodě CopyFromRecordset následující výhody:

  • Excel zpracovává vytvoření sady záznamů a její umístění na listu.
  • Dotaz můžete uložit s objektem QueryTable a později ho aktualizovat, abyste získali aktualizovanou sadu záznamů.
  • Když do listu přidáte novou tabulku dotazu, můžete určit, že data, která už v buňkách listu existují, se posunou a zpracují nová data (další informace najdete v vlastnosti RefreshStyle).

Následující kód ukazuje, jak automatizovat Excel 2000, Excel 2002 nebo Excel 2003 vytvořit novou tabulku dotazu v listu aplikace Excel pomocí dat z ukázkové databáze 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();

Použití schránky Windows

Pomocí schránky windows můžete přenášet data do listu. Chcete-li vložit data do více buněk na listu, můžete zkopírovat řetězec, ve kterém jsou sloupce odděleny znaky TAB a řádky jsou odděleny znaky konce řádku. Následující kód ukazuje, jak visual C# .NET může používat schránku Windows k přenosu dat do Excelu:

// 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();

Vytvoření textového souboru s oddělovači, který excel dokáže analyzovat do řádků a sloupců

Excel může otevřít soubory s tabulátory nebo čárkami a správně analyzovat data do buněk. Tuto funkci můžete použít, pokud chcete přenést velké množství dat do listu a přitom používat automatizaci s minimálním využitím( pokud existuje). To může být dobrý přístup pro program klient-server, protože textový soubor lze vygenerovat na straně serveru. Textový soubor pak můžete otevřít v klientovi pomocí automatizace, kde je to vhodné.

Následující kód ukazuje, jak vygenerovat textový soubor oddělený tabulátory z dat, která se čtou pomocí 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(); 

Výše uvedený kód nepoužívá žádnou automatizaci. Pokud ale chcete, můžete pomocí automatizace otevřít textový soubor a uložit soubor ve formátu excelového sešitu, podobně jako v tomto formátu:

// 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();

Přenos dat do listu pomocí ADO.NET

Pomocí zprostředkovatele Microsoft Jet OLE DB můžete přidat záznamy do tabulky v existujícím sešitu aplikace Excel. Tabulka v Excelu je pouze oblast buněk. oblast může mít definovaný název. První řádek oblasti obvykle obsahuje záhlaví (nebo názvy polí) a všechny pozdější řádky v oblasti obsahují záznamy.

Následující kód přidá do tabulky v Book7.xls dva nové záznamy. Tabulka v tomto případě je List1:

// 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();

Když přidáte záznamy s ADO.NET, jak je znázorněno v tomto příkladu, zachová se formátování v sešitu. Každý záznam přidaný do řádku si vypůjčí formát z řádku před ním.

Další informace o použití ADO.NET získáte v následujících článcích znalostní báze Microsoft Knowledge Base:

306636 POSTUPY: Připojení k databázi a spuštění příkazu pomocí ADO.NET a Visual C# .NET

314145 POSTUPY: Naplnění objektu datové sady z databáze pomocí jazyka Visual C# .NET

307587 POSTUPY: Aktualizace databáze z objektu DataSet pomocí jazyka Visual C# .NET

Další informace o použití zprostředkovatele Jet OLEDB s excelovými zdroji dat získáte v následujících článcích znalostní báze Microsoft Knowledge Base:

278973 UKÁZKA: ExcelADO ukazuje, jak pomocí ADO číst a zapisovat data v sešitech aplikace Excel

257819 POSTUPY: Použití ADO s daty Excelu z jazyka Visual Basic nebo VBA

Přenos dat XML (Excel 2002 a Excel 2003)

Aplikace Excel 2002 a 2003 může otevřít libovolný soubor XML, který je ve správném formátu. Soubory XML můžete otevřít přímo pomocí příkazu Otevřít v nabídce Soubor nebo programově pomocí metody Open nebo OpenXML kolekce Workbooks. Pokud vytváříte soubory XML pro použití v Excelu, můžete také vytvořit šablony stylů pro formátování dat.

Vytvoření kompletního ukázkového projektu Visual C# .NET

  1. Vytvořte novou složku s názvem C:\ExcelData. Ukázková aplikace uloží excelové sešity do této složky.

  2. Vytvořte nový sešit pro ukázku, do které chcete zapisovat:

    1. Vytvořte nový sešit v Excelu.
    2. Na listu List1 nového sešitu zadejte do buňky A1 jméno a příjmení do buňky B1.
    3. Vyberte A1:B1.
    4. V nabídce Vložit přejděte na název a potom klepněte na tlačítko Definovat. Zadejte název Tabulka a klepněte na tlačítko OK.
    5. Uložte sešit jako C:\Exceldata\Book7.xls.
    6. Ukončete Excel.
  3. Spusťte Microsoft Visual Studio 2005 nebo Microsoft Visual Studio .NET. V nabídce Soubor přejděte na příkaz Nový a potom klepněte na příkaz Projekt. V části Projekty Visual C# nebo Visual C# vyberte Aplikaci pro Windows. Ve výchozím nastavení je vytvořen Formulář1.

  4. Přidejte odkaz na knihovnu objektů aplikace Excel a primární definiční sestavení ADODB. Postupujte takto:

    1. V nabídce Projekt klikněte na Přidat odkaz.
    2. Na kartě NET vyhledejte ADODB a klepněte na tlačítko Vybrat.

    Poznámka: V sadě Visual Studio 2005 není nutné kliknout na tlačítko Vybrat.
    3. Na kartě COM vyhledejte Microsoft Excel 10.0 Object Library nebo Microsoft Excel 11.0 Object Library a klepněte na tlačítko Vybrat.

    Poznámka: V sadě Visual Studio 2005 není nutné kliknout na tlačítko Vybrat.

    Poznámka: Pokud používáte aplikaci Microsoft Excel 2002 a ještě jste tak neučinili, společnost Microsoft doporučuje stáhnout a nainstalovat primární definiční sestavení (PIA) sady Microsoft Office XP.

  5. V dialogovém okně Přidat odkazy potvrďte výběr kliknutím na tlačítko OK.

  6. Přidejte ovládací prvek Pole se seznamem a ovládací prvek Tlačítko do formuláře Form1.

  7. Přidejte obslužné rutiny událostí pro událost načtení formuláře a události Click ovládacího prvku Tlačítko:

    1. V návrhovém zobrazení pro Form1.cs poklikáte na Form1.

    Obslužná rutina události Load formuláře se vytvoří a zobrazí se v Souboru Form1.cs.
    2. V zobrazení nabídky, klepněte na tlačítko Návrhář přepnout do návrhového zobrazení.
    3. Poklikáte na Tlačítko1.

    Obslužná rutina události Click tlačítka se vytvoří a zobrazí se v Souboru Form1.cs.

  8. V Souboru Form1.cs nahraďte následující kód:

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

    S:

            // 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
    
    

    Poznámka: Je nutné změnit kód v sadě Visual Studio 2005. Visual C# ve výchozím nastavení přidá jeden formulář do projektu při vytváření projektu model Windows Forms. Formulář má název Form1. Dva soubory, které představují formulář, mají název Form1.cs a Form1.designer.cs. Kód napíšete v Souboru Form1.cs. Soubor Form1.designer.cs je místo, kde návrhář model Windows Forms zapíše kód, který implementuje všechny akce, které jste provedli přetažením ovládacích prvků z panelu nástrojů.

    Další informace o model Windows Forms Designer v jazyce Visual C# 2005 naleznete na následujícím webu Microsoft Developer Network (MSDN):

    Vytvoření projektu (Visual C#) Poznámka: Pokud jste nenainstalovali Office do výchozí složky (C:\Program Files\Microsoft Office), upravte konstantu m_strNorthwind v ukázce kódu tak, aby odpovídala vaší instalační cestě pro Northwind.mdb.

  9. Do direktiv Using v Form1.cs přidejte následující:

    using System.Reflection;
    using System.Runtime.InteropServices;
    using Excel = Microsoft.Office.Interop.Excel;
    
  10. Stisknutím klávesy F5 sestavte a spusťte ukázku.

Odkazy

Další informace naleznete na následujícím webu společnosti Microsoft:

Vývoj pro Microsoft Office pomocí sady Visual Studio