none
여러개의 datagridview 에 있는 데이터를 엑셀로 저장하고 싶어요. RRS feed

  • 질문

  • 안녕하세요.

    현재 winform 기반으로 DB의 각 테이블에 저장되어 있는 사항을 DataGridView에 출력을 해 놓은 상태인데요.

    이렇게 DataGridView에 출력되어 있는 정보를 각각의 엑셀 시트에 저장하고 싶어요.

    예를 들면 DataGridView1의 데이터는 sheet1에, DataGridView2의 데이터는 sheet2에.. 이런 방식으로요.

    엑셀로 출력하는 방법들은 찾아보았지만, 다수의 DataGridView처리와 각각의 sheet에 저장하는 방법은 제 검색능력이 부족해서인지

    찾기가 힘들더라구요.

    어떻게하면 구현을 할 수 있을지... 조언좀 부탁드립니다.

    2016년 10월 5일 수요일 오전 7:07

모든 응답

  • 질문자께서 선택한 포럼의 분류는 ASP.NET이고 질문상에는 winform으로 서술되어 있어 무엇을 원하시는지 헷갈리지만

    도움이 되고자 다음의 C# WinForm예제를 올립니다.

    • .NET Framework 4.0
    • VisualStudio 2010
    • Microsoft Excel 14.0 Object Library

    1. Windows Forms 프로젝트에서 [참조] > [참조추가] > [COM] > [Microsoft Excel 14.0 Object Library]를 추가합니다.

    2. 다음 그림과 같이 폼을 구성합니다(DataGridView2개, 버튼 1개 - 소스상의 이름이 쉽게 매칭 되실겁니다)


    3. 다음과 같이 코드를 작성합니다.

    using System;
    using System.Data;
    using System.Windows.Forms;
    using System.Data.SqlClient;
    
    using Excel = Microsoft.Office.Interop.Excel;
    using System.Runtime.InteropServices;
    
    namespace ExcelTest
    {
    	public partial class Form1 : Form
    	{
    		Excel.Application excelApp = null;		// Excel 프로그램을 의미합니다.
    		Excel.Workbook wb = null;				// 통합문서를 의미합니다.
    		Excel.Worksheet ws = null;				// 워크시트를 의미합니다.
    
    		string m_connectionString = "Data Source=(local);Initial Catalog=Northwind;"
    								+ "Integrated Security=true";
    		string m_queryString1 = "SELECT EmployeeID, LastName, FirstName from dbo.Employees;";
    		string m_queryString2 = "SELECT [CustomerID], [CompanyName], [ContactName], [ContactTitle] from dbo.Customers;";
    
    		public Form1()
    		{
    			InitializeComponent();
    		}
    
    		private void Form1_Load(object sender, EventArgs e)
    		{
    			ExecuteQueryResult(m_queryString1, dataGridView1);
    			ExecuteQueryResult(m_queryString2, dataGridView2);
    		}
    
    		/// <summary>
    		/// 쿼리를 실행시켜 DataGridView에 출력합니다.
    		/// </summary>
    		/// <param name="queryString">실행시킬 쿼리 문자열</param>
    		/// <param name="dataGridView">쿼리 결과를 출력할 DataGridView</param>
    		private void ExecuteQueryResult(string queryString, DataGridView dataGridView)
    		{
    			using (SqlConnection connection = new SqlConnection(m_connectionString))
    			{
    				SqlCommand command = new SqlCommand(queryString, connection);
    				DataTable table = new DataTable();
    
    				try
    				{
    					connection.Open();
    					SqlDataAdapter adapter = new SqlDataAdapter(command);
    					adapter.Fill(table);
    					dataGridView.DataSource = table;
    				}
    				catch (Exception ex)
    				{
    					MessageBox.Show(ex.Message);
    				}
    			}
    		}
    
    		/// <summary>
    		/// 저장버튼 클릭
    		/// </summary>
    		/// <param name="sender"></param>
    		/// <param name="e"></param>
    		private void btn_Save_Click(object sender, EventArgs e)
    		{
    			try
    			{
    				// Excel프로그램을 실행합니다.
    				excelApp = new Excel.Application();
    				// 실행된 Excel프로그램에 통합문서를 추가합니다.
    				wb = excelApp.Workbooks.Add();
    				Map_DataGridView_To_ExcelSheet(dataGridView1, "Sheet1");
    				Map_DataGridView_To_ExcelSheet(dataGridView2, "Sheet2");
    				// 여기서 저장경로를 변경하면 됩니다.
    				wb.SaveAs(@"C:\test.xls", Excel.XlFileFormat.xlWorkbookNormal);
    				wb.Close(true);
    				excelApp.Quit();
    				MessageBox.Show("저장이 완료되었습니다.");
    			}
    			finally
    			{
    				ReleaseExcelObject(ws);
    				ReleaseExcelObject(wb);
    				ReleaseExcelObject(excelApp);
    			}
    			
    		}
    
    		/// <summary>
    		/// DataGridView를 지정된 Sheet에 사상(Mapping)합니다.
    		/// </summary>
    		/// <param name="dataGridView">Sheet에 사상할 DataGridView 개체</param>
    		/// <param name="sheetName">DataGridView가 사상될 Sheet를 지정하는 문자열</param>
    		private void Map_DataGridView_To_ExcelSheet(DataGridView dataGridView, string sheetName)
    		{
    			// 지정된 문자열에 해당하는 Sheet를 가져옵니다.
    			ws = wb.Worksheets.get_Item(sheetName) as Excel.Worksheet;
    
    			for (int i = 0; i < dataGridView.ColumnCount; i++)
    			{
    				for (int j = 0; j < dataGridView.RowCount; j++)
    				{
    					// 워크시트 개체 ws의 Cells(Range 개체)와 DataGridView의 인덱스가 반대인것에 유의하십시오.
    					// 또한, Cells는 인덱스가 1부터 시작합니다.
    					// ws.Cells[Row, Column]
    					// dataGridView[Column, Row]
    					ws.Cells[j + 1, i + 1] = dataGridView[i, j].Value;
    				}
    			}
    		}
    
    		/// <summary>
    		/// 지정된 개체의 리소스를 해제합니다.
    		/// </summary>
    		/// <param name="obj">리소스를 해제할 개체</param>
    		private static void ReleaseExcelObject(object obj)
    		{
    			try
    			{
    				if (obj != null)
    				{
    					Marshal.ReleaseComObject(obj);
    					obj = null;
    				}
    			}
    			catch (Exception ex)
    			{
    				obj = null;
    				throw ex;
    			}
    			finally
    			{
    				GC.Collect();
    			}
    		}
    	}
    }

    위의 소스를 응용해보시고 추가 질의사항 있으면 질문해 주세요.

    MSDN의 [Excel 개체 모델]을 참조하였습니다.

    https://msdn.microsoft.com/ko-kr/library/wss56bz7.aspx

    다음은 결과물 예시입니다.

    • Sheet1


    • Sheet2



    2016년 11월 28일 월요일 오전 7:27