Visual C# 2005 또는 Visual C# .NET을 사용하여 Excel 통합 문서로 데이터를 전송하는 방법

이 문서의 Microsoft Visual Basic 6.0 버전은 247412 참조하세요.

이 단계별 문서에서는 Microsoft Visual C# 2005 또는 Microsoft Visual C# .NET 프로그램에서 Microsoft Excel 2002로 데이터를 전송하는 몇 가지 방법을 설명합니다. 또한 이 문서에서는 상황에 가장 적합한 솔루션을 선택할 수 있도록 각 방법의 장점과 단점을 제시합니다.

개요

Excel 통합 문서로 데이터를 전송하는 데 가장 자주 사용되는 기술은 Automation입니다. Automation을 사용하면 Excel 작업과 관련된 메서드 및 속성을 호출할 수 있습니다. 자동화를 사용하면 통합 문서에서 데이터의 위치를 지정하고, 통합 문서의 서식을 지정하고, 런타임에 다양한 설정을 만들 수 있습니다.

Automation을 사용하면 몇 가지 기술을 사용하여 데이터를 전송할 수 있습니다.

  • 셀별로 데이터 셀을 전송합니다.
  • 배열의 데이터를 셀 범위로 전송합니다.
  • CopyFromRecordset 메서드를 사용하여 ADO 레코드 집합의 데이터를 셀 범위로 전송합니다.
  • ODBC 또는 OLEDB 데이터 원본에 대한 쿼리 결과가 포함된 QueryTable 개체를 Excel 워크시트에 만듭니다.
  • 데이터를 클립보드로 전송한 다음 클립보드 내용을 Excel 워크시트에 붙여넣습니다.
    데이터를 Excel로 전송하기 위해 Automation이 반드시 필요하지 않은 여러 메서드를 사용할 수도 있습니다. 서버 쪽 프로그램을 실행하는 경우 클라이언트에서 대량의 데이터 처리를 제거하기 위한 좋은 방법이 될 수 있습니다.

Automation 없이 데이터를 전송하려면 다음 방법을 사용할 수 있습니다.

  • 나중에 Excel에서 워크시트의 셀로 구문 분석할 수 있는 탭으로 구분되거나 쉼표로 구분된 텍스트 파일로 데이터를 전송합니다.
  • ADO.NET 사용하여 워크시트로 데이터를 전송합니다.
  • XML 데이터를 Excel(버전 2002 및 2003)로 전송하여 서식이 지정되고 행과 열로 정렬된 데이터를 제공합니다.

이 문서에서는 이러한 각 기술에 대한 토론 및 코드 샘플을 제공합니다. 이 문서의 뒷부분에 있는 "전체 샘플 Visual C# 2005 또는 Visual C# .NET 프로젝트 만들기" 섹션에서는 각 기술을 실행하는 Visual C# .NET 프로그램을 만드는 방법을 보여 줍니다.

기술을

Automation을 사용하여 셀로 데이터 셀 전송

Automation을 사용하면 한 번에 한 셀씩 워크시트로 데이터를 전송할 수 있습니다.

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

소량의 데이터가 있는 경우 셀로 데이터 셀을 전송하는 것이 허용 가능한 방법입니다. 통합 문서의 어디에나 데이터를 배치할 수 있는 유연성이 있으며 런타임에 조건부로 셀의 서식을 지정할 수 있습니다. 그러나 Excel 통합 문서로 전송할 데이터가 많은 경우 이 방법을 사용하는 것은 좋지 않습니다. 런타임에 획득하는 각 Range 개체는 데이터 전송을 더 느리게 의미하는 인터페이스 요청을 생성합니다. 또한 Microsoft Windows 95, Microsoft Windows 98 및 Microsoft Windows Millennium Edition(Me)에는 인터페이스 요청에 64KB(킬로바이트) 제한이 있습니다. 인터페이스 요청이 64KB를 초과하는 경우 Automation 서버(Excel)의 응답이 중지되거나 메모리가 부족함을 나타내는 오류 메시지가 표시될 수 있습니다.

다시 말하지만 셀로 데이터 셀을 전송하는 것은 소량의 데이터에 대해서만 허용됩니다. 큰 데이터 집합을 Excel로 전송해야 하는 경우 이 문서에서 설명하는 다른 방법 중 하나를 사용하여 대량으로 데이터를 전송하는 것이 좋습니다.

자세한 내용과 Visual C# .NET을 사용하여 Excel을 자동화하는 예제를 보려면 아래 문서 번호를 클릭하여 Microsoft 기술 자료의 문서를 확인합니다.

302084 HOWTO: Microsoft Visual C# .NET에서 Microsoft Excel 자동화

Automation을 사용하여 워크시트의 범위로 데이터 배열 전송

데이터 배열을 한 번에 여러 셀 범위로 전송할 수 있습니다.

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

셀로 셀 대신 배열을 사용하여 데이터를 전송하는 경우 대량의 데이터로 엄청난 성능 향상을 실현할 수 있습니다. 워크시트의 300개 셀로 데이터를 전송하는 앞서 언급한 코드의 다음 줄을 고려합니다.

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

이 코드는 두 개의 인터페이스 요청을 나타냅니다. 하나는 Range 메서드가 반환하는 Range 개체에 대한 요청이고 다른 하나는 Resize 메서드가 반환하는 Range 개체에 대한 것입니다. 반면, 셀로 데이터 셀을 전송하려면 Range 개체에 대한 300개 인터페이스에 대한 요청이 필요합니다. 가능하면 데이터를 대량으로 전송하고 사용자가 하는 인터페이스 요청 수를 줄이는 이점을 얻을 수 있습니다.

배열을 사용하여 Excel Automation을 사용하여 범위의 값을 가져오고 설정하는 방법에 대한 자세한 내용은 아래 문서 번호를 클릭하여 Microsoft 기술 자료의 문서를 확인합니다.

302096 HOWTO: Visual C# .NET을 사용하여 Excel을 자동화하여 배열을 사용하여 범위에서 데이터를 채우거나 가져옵니다.

Automation을 사용하여 ADO 레코드 집합을 워크시트 범위로 전송

Excel 2000, Excel 2002 및 Excel 2003의 개체 모델은 ADO 레코드 집합을 워크시트의 범위로 전송하기 위한 CopyFromRecordset 메서드를 제공합니다. 다음 코드에서는 CopyFromRecordset 메서드를 사용하여 Northwind 샘플 데이터베이스에서 Orders 테이블의 내용을 전송하도록 Excel을 자동화하는 방법을 보여 줍니다.

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

참고

CopyFromRecordset은 ADO Recordset 개체에서만 작동합니다. CopyFromRecordset 메서드와 함께 ADO.NET 사용하여 만든 DataSet을 사용할 수 없습니다. 다음 섹션의 몇 가지 예제에서는 ADO.NET 사용하여 Excel로 데이터를 전송하는 방법을 보여 줍니다.

Automation을 사용하여 워크시트에서 QueryTable 개체 만들기

QueryTable 개체는 외부 데이터 원본에서 반환되는 데이터에서 빌드된 테이블을 나타냅니다. Excel을 자동화하는 경우 OLE DB 또는 ODBC 데이터 원본 및 SQL 문자열에 연결 문자열을 제공하여 QueryTable을 만들 수 있습니다. Excel에서는 레코드 집합을 생성하고 지정한 위치에 있는 워크시트에 레코드 집합을 삽입합니다. QueryTable 개체는 CopyFromRecordset 메서드에 비해 다음과 같은 이점을 제공합니다.

  • Excel은 워크시트에서 레코드 집합 만들기 및 해당 배치를 처리합니다.
  • QueryTable 개체를 사용하여 쿼리를 저장하고 나중에 새로 고쳐 업데이트된 레코드 집합을 가져올 수 있습니다.
  • 새 QueryTable이 워크시트에 추가되면 워크시트의 셀에 이미 있는 데이터를 이동하여 새 데이터를 처리하도록 지정할 수 있습니다(자세한 내용은 RefreshStyle 속성 참조).

다음 코드에서는 Northwind 샘플 데이터베이스의 데이터를 사용하여 Excel 워크시트에서 새 QueryTable을 만들기 위해 Excel 2000, Excel 2002 또는 Excel 2003을 자동화하는 방법을 보여 줍니다.

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

Windows 클립보드 사용

Windows 클립보드를 사용하여 워크시트로 데이터를 전송할 수 있습니다. 워크시트의 여러 셀에 데이터를 붙여넣기 위해 열이 TAB 문자로 구분되고 행이 캐리지 리턴으로 구분되는 문자열을 복사할 수 있습니다. 다음 코드에서는 Visual C# .NET에서 Windows 클립보드를 사용하여 데이터를 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();

Excel에서 행과 열로 구문 분석할 수 있는 구분 기호로 구분된 텍스트 파일 만들기

Excel에서는 탭 또는 쉼표로 구분된 파일을 열고 데이터를 셀로 올바르게 구문 분석할 수 있습니다. 자동화를 거의 사용하지 않는 경우 워크시트로 대량의 데이터를 전송하려는 경우 이 기능을 사용할 수 있습니다. 텍스트 파일을 서버 쪽에서 생성할 수 있기 때문에 클라이언트-서버 프로그램에 좋은 방법이 될 수 있습니다. 그런 다음, 적절한 경우 Automation을 사용하여 클라이언트에서 텍스트 파일을 열 수 있습니다.

다음 코드에서는 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(); 

앞서 언급한 코드는 Automation을 사용하지 않습니다. 그러나 원하는 경우 Automation을 사용하여 텍스트 파일을 열고 Excel 통합 문서 형식으로 파일을 다음과 같이 저장할 수 있습니다.

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

ADO.NET 사용하여 워크시트로 데이터 전송

Microsoft Jet OLE DB 공급자를 사용하여 기존 Excel 통합 문서의 테이블에 레코드를 추가할 수 있습니다. Excel의 표는 셀 범위일 뿐입니다. 범위에 정의된 이름이 있을 수 있습니다. 일반적으로 범위의 첫 번째 행에는 머리글(또는 필드 이름)이 포함되며 범위의 모든 이후 행에는 레코드가 포함됩니다.

다음 코드는 Book7.xls 테이블에 두 개의 새 레코드를 추가합니다. 이 경우 테이블은 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();

이 예제와 같이 ADO.NET 있는 레코드를 추가하면 통합 문서의 서식이 유지됩니다. 행에 추가되는 각 레코드는 행 앞의 형식을 차용합니다.

ADO.NET 사용에 대한 자세한 내용은 아래 문서 번호를 클릭하여 Microsoft 기술 자료에서 문서를 봅니다.

306636 방법: 데이터베이스에 연결하고 ADO.NET 및 Visual C# .NET을 사용하여 명령 실행

314145 방법: Visual C# .NET을 사용하여 데이터베이스에서 DataSet 개체 채우기

307587 방법: Visual C# .NET을 사용하여 DataSet 개체에서 데이터베이스 업데이트

Excel 데이터 원본에서 Jet OLEDB 공급자를 사용하는 방법에 대한 자세한 내용은 아래 문서 번호를 클릭하여 Microsoft 기술 자료의 문서를 확인합니다.

278973 샘플: ExcelADO에서 ADO를 사용하여 Excel 통합 문서에서 데이터를 읽고 쓰는 방법을 보여 줍니다.

257819 HOWTO: Visual Basic 또는 VBA의 Excel 데이터와 함께 ADO 사용

XML 데이터 전송(Excel 2002 및 Excel 2003)

Excel 2002 및 2003은 올바른 형식의 XML 파일을 열 수 있습니다. 파일 메뉴에서 열기 명령을 사용하거나 통합 문서 컬렉션의 Open 또는 OpenXML 메서드를 사용하여 프로그래밍 방식으로 XML 파일을 직접 열 수 있습니다. Excel에서 사용할 XML 파일을 만드는 경우 데이터 서식을 지정하는 스타일시트를 만들 수도 있습니다.

전체 샘플 Visual C# .NET 프로젝트 만들기

  1. C:\ExcelData라는 새 폴더를 만듭니다. 샘플 프로그램은 이 폴더에 Excel 통합 문서를 저장합니다.

  2. 샘플에서 쓸 새 통합 문서를 만듭니다.

    1. Excel에서 새 통합 문서를 시작합니다.
    2. 새 통합 문서의 Sheet1에서 셀 A1에 FirstName을 입력하고 B1 셀에 LastName을 입력합니다.
    3. A1:B1을 선택합니다.
    4. 삽입 메뉴에서 이름을 가리킨 다음 정의를 클릭합니다. MyTable 이름을 입력하고 확인을 클릭합니다.
    5. 통합 문서를 C:\Exceldata\Book7.xls 저장합니다.
    6. Excel을 종료합니다.
  3. Microsoft Visual Studio 2005 또는 Microsoft Visual Studio .NET을 시작합니다. 파일 메뉴에서 새로 만들기를 가리킨 다음 프로젝트를 클릭합니다. Visual C# 프로젝트 또는 Visual C#에서 Windows 애플리케이션을 선택합니다. 기본적으로 Form1이 만들어집니다.

  4. Excel 개체 라이브러리 및 ADODB 기본 interop 어셈블리에 대한 참조를 추가합니다. 이렇게 하려면 다음과 같이 하십시오.

    1. 프로젝트 메뉴에서 참조 추가를 클릭합니다.
    2. NET 탭에서 ADODB를 찾은 다음 선택을 클릭합니다.

    참고 Visual Studio 2005에서는 선택을 클릭할 필요가 없습니다.
    3. COM 탭에서 Microsoft Excel 10.0 개체 라이브러리 또는 Microsoft Excel 11.0 개체 라이브러리를 찾은 다음 선택을 클릭합니다.

    참고 Visual Studio 2005에서는 선택을 클릭할 필요가 없습니다.

    참고 Microsoft Excel 2002를 사용 중이고 아직 사용하지 않은 경우 Microsoft Office XP 기본 Interop 어셈블리(PIA)를 다운로드하여 설치하는 것이 좋습니다.

  5. 참조 추가 대화 상자에서 [확인]을 클릭하여 선택 내용을 적용합니다.

  6. Form1에 콤보 상자 컨트롤과 단추 컨트롤을 추가합니다.

  7. 폼 로드 이벤트 및 단추 컨트롤의 Click 이벤트에 대한 이벤트 처리기를 추가합니다.

    1. Form1.cs의 디자인 보기에서 Form1을 두 번 클릭합니다.

    Form의 Load 이벤트에 대한 처리기가 만들어지고 Form1.cs에 표시됩니다.
    2. 보기 메뉴에서 디자이너를 클릭하여 디자인 보기로 전환합니다.
    3. Button1을 두 번 클릭합니다.

    단추의 Click 이벤트에 대한 처리기가 만들어지고 Form1.cs에 표시됩니다.

  8. Form1.cs에서 다음 코드를 바꿉니다.

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

    with:

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

    참고 Visual Studio 2005에서 코드를 변경해야 합니다. 기본적으로 Visual C#은 Windows Forms 프로젝트를 만들 때 프로젝트에 하나의 양식을 추가합니다. 폼의 이름은 Form1입니다. 폼을 나타내는 두 파일의 이름은 Form1.cs 및 Form1.designer.cs입니다. Form1.cs에서 코드를 작성합니다. Form1.designer.cs 파일은 Windows Forms 디자이너가 도구 상자에서 컨트롤을 끌어서 놓아 수행한 모든 작업을 구현하는 코드를 작성하는 위치입니다.

    Visual C# 2005의 Windows Forms Designer에 대한 자세한 내용은 다음 MSDN(Microsoft Developer Network) 웹 사이트를 참조하세요.

    프로젝트 만들기(Visual C#) 참고 Office를 기본 폴더(C:\Program Files\Microsoft Office)에 설치하지 않은 경우 코드 샘플의 m_strNorthwind 상수가 Northwind.mdb의 설치 경로와 일치하도록 수정합니다.

  9. Form1.cs의 Using 지시문에 다음을 추가합니다.

    using System.Reflection;
    using System.Runtime.InteropServices;
    using Excel = Microsoft.Office.Interop.Excel;
    
  10. F5 키를 눌러 샘플을 빌드하고 실행합니다.

참조

자세한 내용을 확인하려면 다음 Microsoft 웹 사이트()를 방문하십시오.

Visual Studio를 사용한 Microsoft Office 개발