Uwaga
Dostęp do tej strony wymaga autoryzacji. Może spróbować zalogować się lub zmienić katalogi.
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować zmienić katalogi.
Aby zapoznać się z wersją tego artykułu w języku Microsoft Visual Basic 6.0, zobacz 247412.
W tym artykule krok po kroku opisano kilka metod przesyłania danych do programu Microsoft Excel 2002 z programu Microsoft Visual C# 2005 lub Microsoft Visual C# .NET. W tym artykule przedstawiono również zalety i wady każdej metody, dzięki czemu można wybrać rozwiązanie, które najlepiej sprawdza się w twojej sytuacji.
Omówienie
Najczęściej używaną techniką przesyłania danych do skoroszytu programu Excel jest automatyzacja. Za pomocą usługi Automation można wywoływać metody i właściwości specyficzne dla zadań programu Excel. Automatyzacja zapewnia największą elastyczność określania lokalizacji danych w skoroszycie, formatowania skoroszytu i tworzenia różnych ustawień w czasie wykonywania.
Za pomocą usługi Automation można użyć kilku technik transferu danych:
- Transferowanie komórki danych według komórki.
- Transferowanie danych w tablicy do zakresu komórek.
- Przesyłaj dane w zestawie rekordów ADO do zakresu komórek przy użyciu metody CopyFromRecordset.
- Utwórz obiekt QueryTable w arkuszu programu Excel, który zawiera wynik zapytania w źródle danych ODBC lub OLEDB.
- Prześlij dane do schowka, a następnie wklej zawartość schowka do arkusza programu Excel.
Można również użyć kilku metod, które niekoniecznie wymagają usługi Automation do transferu danych do programu Excel. Jeśli korzystasz z programu po stronie serwera, może to być dobre podejście do odsuniania większości przetwarzania danych od klientów.
Aby przesłać dane bez usługi Automation, można użyć następujących metod:
- Przenieś dane do pliku tekstowego rozdzielanego tabulatorem lub rozdzielanego przecinkami, który program Excel może później przeanalizować w komórkach w arkuszu.
- Przenieś dane do arkusza przy użyciu ADO.NET.
- Przenieś dane XML do programu Excel (wersja 2002 i 2003), aby udostępnić dane sformatowane i rozmieszczone w wierszach i kolumnach.
Ten artykuł zawiera omówienie i przykład kodu dla każdej z tych technik. W sekcji "Tworzenie kompletnego przykładowego programu Visual C# 2005 lub Visual C# .NET Project" w dalszej części tego artykułu pokazano, jak utworzyć program .NET w języku Visual C#, który wykonuje każdą technikę.
Technik
Transferowanie komórek danych według komórek przy użyciu automatyzacji
Za pomocą usługi Automation można przesyłać dane do arkusza po jednej komórce naraz:
// 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();
Transferowanie komórek danych przez komórki jest akceptowalnym podejściem, jeśli masz niewielką ilość danych. Możesz elastycznie umieszczać dane w dowolnym miejscu w skoroszycie i możesz formatować komórki warunkowo w czasie wykonywania. Jednak nie jest dobrym pomysłem użycie tego podejścia, jeśli masz dużą ilość danych do transferu do skoroszytu programu Excel. Każdy obiekt zakresu, który uzyskujesz w czasie wykonywania, powoduje żądanie interfejsu, które oznacza wolniejsze transfery danych. Ponadto system Microsoft Windows 95, Microsoft Windows 98 i Microsoft Windows Millennium Edition (Me) mają ograniczenie do 64 kilobajtów (KB) dla żądań interfejsu. Jeśli masz więcej niż 64 KB żądań interfejsu, serwer usługi Automation (Excel) może przestać odpowiadać lub mogą pojawić się komunikaty o błędach wskazujące małą ilość pamięci.
Ponownie transferowanie komórki danych według komórki jest dopuszczalne tylko w przypadku niewielkich ilości danych. Jeśli musisz przenieść duże zestawy danych do programu Excel, rozważ użycie jednej z innych metod, które zostały omówione w tym artykule, aby zbiorczo przesyłać dane.
Aby uzyskać dodatkowe informacje i przykład automatyzowania programu Excel za pomocą programu Visual C# .NET, kliknij poniższy numer artykułu, aby wyświetlić artykuł w bazie wiedzy Microsoft Knowledge Base:
302084 HOWTO: automatyzowanie programu Microsoft Excel z programu Microsoft Visual C# .NET
Przenoszenie tablicy danych do zakresu w arkuszu za pomocą usługi Automation
Tablicę danych można jednocześnie przenieść do zakresu wielu komórek:
// 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();
Jeśli przesyłasz dane przy użyciu tablicy zamiast komórki po komórce, możesz uzyskać ogromny wzrost wydajności dzięki dużej ilości danych. Rozważ następujące wiersze z wyżej wymienionego kodu, które przesyłają dane do 300 komórek w arkuszu:
objRange = objSheet.get_Range("A2", m_objOpt);
objRange = objRange.get_Resize(100,3);
objRange.Value = objData;
Ten kod reprezentuje dwa żądania interfejsu: jedno dla obiektu Zakres zwracane przez metodę Range, a drugie dla obiektu Range zwracanego przez metodę Resize. Natomiast przesyłanie komórki danych przez komórkę wymaga żądań 300 interfejsów do obiektów zakresu. Jeśli to możliwe, możesz skorzystać z przesyłania danych zbiorczo i zmniejszenia liczby żądań interfejsu.
Aby uzyskać dodatkowe informacje na temat używania tablic do pobierania i ustawiania wartości w zakresach za pomocą usługi Excel Automation, kliknij poniższy numer artykułu, aby wyświetlić artykuł w bazie wiedzy Microsoft Knowledge Base:
302096 HOWTO: automatyzowanie programu Excel za pomocą platformy .NET w języku Visual C# w celu wypełnienia lub uzyskania danych w zakresie przy użyciu tablic
Przenoszenie zestawu rekordów ADO do zakresu arkuszy przy użyciu usługi Automation
Modele obiektów dla programów Excel 2000, Excel 2002 i Excel 2003 udostępniają metodę CopyFromRecordset do przenoszenia zestawu rekordów ADO do zakresu w arkuszu. Poniższy kod ilustruje sposób automatyzowania programu Excel w celu przeniesienia zawartości tabeli Orders w przykładowej bazie danych Northwind przy użyciu 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();
Uwaga
CopyFromRecordset działa tylko z obiektami zestawu rekordów ADO. Nie można użyć zestawu danych utworzonego przy użyciu ADO.NET z metodą CopyFromRecordset. Kilka przykładów w poniższych sekcjach pokazuje, jak przesyłać dane do programu Excel za pomocą ADO.NET.
Tworzenie obiektu QueryTable w arkuszu za pomocą usługi Automation
Obiekt QueryTable reprezentuje tabelę utworzoną na podstawie danych zwracanych z zewnętrznego źródła danych. Podczas automatyzowania programu Excel można utworzyć tabelę QueryTable, podając parametry połączenia z bazą danych OLE DB lub źródłem danych ODBC i ciągiem SQL. Program Excel generuje zestaw rekordów i wstawia zestaw rekordów do arkusza w określonej lokalizacji. Obiekty QueryTable oferują następujące korzyści w porównaniu z metodą CopyFromRecordset:
- Program Excel obsługuje tworzenie zestawu rekordów i jego umieszczanie w arkuszu.
- Zapytanie można zapisać przy użyciu obiektu QueryTable i odświeżyć je później, aby uzyskać zaktualizowany zestaw rekordów.
- Po dodaniu nowej tabeli QueryTable do arkusza można określić, że dane, które już istnieją w komórkach arkusza, zostaną przesunięte w celu obsługi nowych danych (aby uzyskać więcej informacji, zobacz właściwość RefreshStyle).
Poniższy kod pokazuje, jak zautomatyzować program Excel 2000, Excel 2002 lub Excel 2003 w celu utworzenia nowej tabeli QueryTable w arkuszu programu Excel przy użyciu danych z przykładowej bazy danych 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();
Korzystanie ze schowka systemu Windows
Schowek systemu Windows umożliwia przesyłanie danych do arkusza. Aby wkleić dane do wielu komórek w arkuszu, możesz skopiować ciąg, w którym kolumny są rozdzielane znakami TAB, a wiersze są rozdzielane przez zwroty karetki. Poniższy kod ilustruje sposób, w jaki platforma .NET języka Visual C# może używać schowka systemu Windows do przesyłania danych do programu 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();
Tworzenie rozdzielanego pliku tekstowego, który program Excel może przeanalizować w wierszach i kolumnach
Program Excel może otwierać pliki rozdzielane przecinkami lub tabulatorami i poprawnie analizować dane w komórkach. Tej funkcji można użyć, gdy chcesz przenieść dużą ilość danych do arkusza, używając niewielkiej, jeśli w ogóle, automatyzacji. Może to być dobre podejście do programu klient-serwer, ponieważ plik tekstowy może być generowany po stronie serwera. Następnie możesz otworzyć plik tekstowy na kliencie przy użyciu usługi Automation, jeśli jest to odpowiednie.
Poniższy kod ilustruje sposób generowania pliku tekstowego rozdzielanego tabulatorem na podstawie danych odczytanych za 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();
Wyżej wymieniony kod nie używa automatyzacji. Jeśli jednak chcesz, możesz użyć usługi Automation, aby otworzyć plik tekstowy i zapisać plik w formacie skoroszytu programu Excel, podobnie jak w następujący sposób:
// 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();
Przesyłanie danych do arkusza przy użyciu ADO.NET
Możesz użyć dostawcy microsoft Jet OLE DB, aby dodać rekordy do tabeli w istniejącym skoroszycie programu Excel. Tabela w programie Excel to tylko zakres komórek; zakres może mieć zdefiniowaną nazwę. Zazwyczaj pierwszy wiersz zakresu zawiera nagłówki (lub nazwy pól), a wszystkie późniejsze wiersze w zakresie zawierają rekordy.
Poniższy kod dodaje dwa nowe rekordy do tabeli w Book7.xls. Tabela w tym przypadku to Arkusz1:
// 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();
Po dodaniu rekordów z ADO.NET, jak pokazano w tym przykładzie, formatowanie w skoroszycie jest zachowywane. Każdy rekord dodany do wiersza pożycza format z wiersza przed nim.
Aby uzyskać dodatkowe informacje na temat korzystania z ADO.NET, kliknij poniższe numery artykułów, aby wyświetlić artykuły w bazie wiedzy Microsoft Knowledge Base:
306636 INSTRUKCJE: Nawiązywanie połączenia z bazą danych i uruchamianie polecenia przy użyciu ADO.NET i visual C# .NET
314145 INSTRUKCJE: wypełnianie obiektu zestawu danych z bazy danych przy użyciu platformy .NET języka Visual C#
307587 INSTRUKCJE: aktualizowanie bazy danych z obiektu zestawu danych przy użyciu platformy .NET języka Visual C#
Aby uzyskać dodatkowe informacje na temat korzystania z dostawcy jet OLEDB ze źródłami danych programu Excel, kliknij poniższe numery artykułów, aby wyświetlić artykuły w bazie wiedzy Microsoft Knowledge Base:
278973 PRZYKŁAD: Program ExcelADO pokazuje, jak używać ADO do odczytu i zapisu danych w skoroszytach programu Excel
257819 HOWTO: używanie usługi ADO z danymi programu Excel z języka Visual Basic lub VBA
Transferowanie danych XML (Excel 2002 i Excel 2003)
Program Excel 2002 i 2003 mogą otwierać dowolny dobrze sformułowany plik XML. Pliki XML można otwierać bezpośrednio za pomocą polecenia Otwórz w menu Plik lub programowo przy użyciu metod Open lub OpenXML kolekcji Skoroszyty. Jeśli utworzysz pliki XML do użycia w programie Excel, możesz również utworzyć arkusze stylów w celu sformatowania danych.
Tworzenie pełnego przykładowego projektu platformy .NET w języku Visual C#
Utwórz nowy folder o nazwie C:\ExcelData. Przykładowy program będzie przechowywać skoroszyty programu Excel w tym folderze.
Utwórz nowy skoroszyt dla przykładu do zapisu:
- Uruchom nowy skoroszyt w programie Excel.
- W arkuszu 1 nowego skoroszytu wpisz FirstName w komórce A1 i LastName w komórce B1.
- Wybierz pozycję A1:B1.
- W menu Wstawianie wskaż pozycję Nazwa, a następnie kliknij pozycję Definiuj. Wpisz nazwę MyTable, a następnie kliknij przycisk OK.
- Zapisz skoroszyt jako C:\Exceldata\Book7.xls.
- Zamknij program Excel.
Uruchom program Microsoft Visual Studio 2005 lub Microsoft Visual Studio .NET. W menu Plik wskaż polecenie Nowy, a następnie kliknij Projekt. W obszarze Projekty visual C# lub Visual C#wybierz pozycję Aplikacja systemu Windows. Domyślnie tworzony jest formularz Form1.
Dodaj odwołanie do biblioteki obiektów programu Excel i podstawowego zestawu międzyoperacyjnego bazy danych ADODB. Aby to zrobić, wykonaj następujące kroki.
- W menu Projekt kliknij pozycję Dodaj odwołanie.
- Na karcie NET znajdź ADODB, a następnie kliknij pozycję Wybierz.
Uwaga W programie Visual Studio 2005 nie trzeba klikać przycisku Wybierz.
3. Na karcie COM znajdź bibliotekę obiektów programu Microsoft Excel 10.0 lub bibliotekę obiektów programu Microsoft Excel 11.0, a następnie kliknij przycisk Wybierz.Uwaga W programie Visual Studio 2005 nie trzeba klikać przycisku Wybierz.
Uwaga Jeśli używasz programu Microsoft Excel 2002 i jeszcze tego nie zrobiono, firma Microsoft zaleca pobranie, a następnie zainstalowanie podstawowych zestawów międzyoperacyjnych (PIA) pakietu Microsoft Office XP.
W oknie dialogowym Dodawanie odwołań kliknij przycisk OK, aby zaakceptować wybrane opcje.
Dodaj kontrolkę Combo Box i kontrolkę Przycisk do formantu Form1.
Dodaj procedury obsługi zdarzeń dla zdarzenia Ładowania formularza i zdarzeń Kliknij kontrolki Przycisk:
- W widoku projektu dla pliku Form1.cs kliknij dwukrotnie pozycję Formularz1.
Program obsługi zdarzenia Ładowania formularza jest tworzony i pojawia się w pliku Form1.cs.
2. W menu Widok kliknij pozycję Projektant, aby przełączyć się do widoku projektu.
3. Kliknij dwukrotnie przycisk 1.Procedura obsługi zdarzenia Kliknięcie przycisku jest tworzona i wyświetlana w pliku Form1.cs.
W pliku Form1.cs zastąp następujący kod:
private void Form1_Load(object sender, System.EventArgs e) { } private void button1_Click(object sender, System.EventArgs e) { }
Z:
// 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
Uwaga Musisz zmienić kod w programie Visual Studio 2005. Domyślnie program Visual C# dodaje jeden formularz do projektu podczas tworzenia projektu Windows Forms. Formularz nosi nazwę Form1. Dwa pliki reprezentujące formularz mają nazwy Form1.cs i Form1.designer.cs. Kod jest pisany w pliku Form1.cs. Plik Form1.designer.cs to miejsce, w którym projektant Windows Forms zapisuje kod implementujący wszystkie akcje wykonywane przez przeciąganie i usuwanie kontrolek z przybornika.
Aby uzyskać więcej informacji na temat projektanta Windows Forms w programie Visual C# 2005, odwiedź następującą witrynę sieci Web microsoft developer network (MSDN):
Tworzenie projektu (Visual C#) Uwaga Jeśli pakiet Office nie został zainstalowany w folderze domyślnym (C:\Program Files\Microsoft Office), zmodyfikuj stałą m_strNorthwind w przykładzie kodu, aby była zgodna ze ścieżką instalacji pliku Northwind.mdb.
Dodaj następujące elementy do dyrektyw Using w pliku Form1.cs:
using System.Reflection; using System.Runtime.InteropServices; using Excel = Microsoft.Office.Interop.Excel;
Naciśnij klawisz F5, aby skompilować i uruchomić przykład.
Informacje
Aby uzyskać więcej informacji, odwiedź następującą witrynę firmy Microsoft w sieci Web:
Programowanie pakietu Microsoft Office przy użyciu programu Visual Studio