출처 [ASP,ASP.NET,PHP,JSP,JavaScript,Database 등 웹개발자 모임] | tlsgidgh

원문 http://cafe.naver.com/webdeveloper/4014

Taeyo's ASP.NET

   강좌 최초 작성일 : 2005년 07월 29일
   강좌 최종 수정일 : 2005년 08월 01일

   작성자 : Taeyo(김 태영)
   편집자 : Taeyo(김 태영)

   강좌 제목 : DataGrid를 간단하게 Excel로 변환하기

강좌 전 태오의 잡담>

세월은 정말로 빠릅니다. 어느덧 사이트를 운영한지도 만 7년이 훌쩍 넘어버렸네요.
7년 4개월째라니... 거 참..

과연 3년 뒤에도 사이트는 존재하고 있을까요? 그랬으면 하는 바램입니다.


저번 강좌에서 여러분은 ASP.NET 페이지가 이미지로 둔갑하는 멋진 액숀을 보셨습니다. 이번 강좌에서는 그 지식을 기반으로 해서, DataGrid의 내용을 아주 쉽게 Excel로 다운로드 시키는 방법에 대해서 알아보고자 합니다.

참고로, 이 글은 http://azamsharp.net/DataGridExport.htm의 컬럼을 참고로 하여 재 작성한 것임을 밝힙니다.

단, 이번 강좌에서 다루는 방법은 아주 단순하고 빠르게 DataGrid의 데이터를 추가적인 변경작업이나 필터링없이 Excel로 단순 출력하고자 하는 경우에만 유용한 방법입니다. 그 외의 추가적인 요구사항이 있을 경우에는 이 방법을 사용할 수 없을 것입니다. 어떤 추가적인 처리가 필요한 경우에는 www.codeproject.com과 같은 사이트에서 ASP.NET에서 엑셀을 제어하는 샘플 소스들을 구해서 그를 응용하여 구현하셔야 할 것입니다. 물론, 그 경우에는 구현이 간단하지도 않겠죠?

하지만, 간단한 수준의 엑셀 출력이라면 그런 복잡한 방법을 사용하지 않고도 가능합니다. 왜냐하면, 최신 Excel 어플리케이션은 HTML 태그를 인식하기 때문입니다. 근데, 말입니다. HTML을 지원하기 시작한 Excel의 버전이 몇 부터인지는 죄송하게도.. 잘 모르겠습니다. ㅜㅜ(아마도 Excel 2002부터가 아닌가 하는데..) 혹시, 아시는 분이 있다면 연락주시면 바로 여기에 추가적으로 기입하도록 하겠습니다.

먼저, 엑셀이 HTML을 지원한다는 것을 확인해보는 것으로 시작해 보도록 하겠습니다. 이를 위해서, 여러분이 매우 자주~ 습관적으로 편하게~ 임시 데이터를 저장하는 장소인 [바탕화면]에 다음과 같은 HTML 태그들을 갖는 html 페이지를 하나 만들어 주세요.     

<table>
    <tr>
        <td>아이디</td>
        <td>이름</td>
        <td>성별</td>
    </tr>
    <tr>
        <td>taeyo</td>
        <td>김태영</td>
        <td>남</td>
    </tr>
    <tr>
        <td>queeny</td>
        <td>욘쟈</td>
        <td>여</td>
    </tr>
    <tr>
        <td>hyunny</td>
        <td>김영현</td>
        <td>남</td>
    </tr>
    <tr>
        <td>vangelis</td>
        <td>성지용</td>
        <td>남</td>
    </tr>
    <tr>
        <td>dukyoung</td>
        <td>김덕영</td>
        <td>남</td>
    </tr>
</table>

그리고, 이 파일을 test.htm 이라고 저장합니다. ^^ 저장이 되셨다면, 이를 Excel 프로그램을 이용해서 열어보세요 ^^ 그러면, 다음과 같이 멋들어지게 Excel로 말끔하게 열리는 것을 볼 수 있을 것입니다.

멋지죠? 여기까지만 설명드려도... 오호라, 이렇다면 그리드의 데이터를 엑셀로 출력하는 것은 정말로 쉽겠구나 하시는 분들이 있죠? 여기 저기서 많이 보이네요.. 하~ 정말이지. 너무 쉬운듯 했네요. 이런 쉬운 내용을 강좌로 올리다니 배신이야 하시는 분들도 조금 보이고.. ㅠㅠ

그렇군요... 그렇다면, 굳이 더 진행을 하지 않아도 될 듯 합니다.






라고 끝을 내면... 허걱!!! 매우 곤란한 지경에 빠질 수 있다는 사실을 압니다. 잠깐의 장난에 대해서도 여러분의 강력한 포스가 느껴지는 군요..

그렇다면, 계속해 보겠습니다. ^^ 방법은 다음과 같습니다. 엑셀이 HTML을 지원하니, DataGrid의 결과 HTML을 얻어서 이를 엑셀로 둔갑시켜 다운로드 시키는 것입니다. 저번 강좌에서 ASP.NET 페이지를 이미지로 둔갑하는 것을 해 보았으니, ASP.NET 페이지를 Excel로 변환하는 것 또한 어렵지 않을 것이라는 것을 아실 것입니다. 문제는 DataGrid의 데이터를 HTML로 얻어내는 것이지요.

하지만, 이 또한 어렵지 않습니다. 왜냐하면, 모든 ASP.NET 서버 컨트롤들은 그 컨트롤이 보유하고 있는 데이터를 기본적으로 HTML로 출력하기 때문입니다. 우리는 DataGrid 컨트롤의 RenderControl()라는 메서드를 이용해서 그러한 데이터를 얻어낼 수가 있습니다. 그리고, 그것을 브라우저를 통해서 화면에 다운로드 시킬 수 있죠.

그렇다면, 소스를 한번 볼까요? 일단, 테스트를 위해서 작성한 웹 폼의 디자인은 다음과 같습니다. DataGrid 컨트롤 하나와 Button 컨트롤 하나죠~ 덜렁~

그리고, 제가 작성한 코드 비하인드 코드는 다음과 같습니다.     

public class GridExportTest : System.Web.UI.Page
{
    protected System.Web.UI.WebControls.DataGrid DataGrid1;
    protected System.Web.UI.WebControls.Button Button1;

    private void Page_Load(object sender, System.EventArgs e)
    {
        SqlConnection con = new SqlConnection();
        con.ConnectionString = "server=.;database=pubs;uid=***;pwd=***";

        SqlCommand cmd = new SqlCommand("Select * from Authors", con);
        SqlDataAdapter a = new SqlDataAdapter(cmd);

        DataSet ds = new DataSet();
        a.Fill(ds);

        DataGrid1.DataSource = ds;
        DataGrid1.DataBind();
    }

    private void Button1_Click(object sender, System.EventArgs e)
    {
        Response.Clear();
        Response.AddHeader("content-disposition", "attachment;filename=DataGrid.xls");
        Response.ContentType = "application/vnd.xls";

        System.IO.StringWriter stringWriter = new System.IO.StringWriter();
        System.Web.UI.HtmlTextWriter htmlWriter = new HtmlTextWriter(stringWriter);
        DataGrid1.RenderControl(htmlWriter);

        Response.Write(stringWrite.ToString());
        Response.End();
    }
}

설명을 일단 간단하게 드리자면, 페이지가 로드될 경우 DataGrid에다가 MS-SQL 서버의 Pubs 데이터베이스에 있는 데이터를 로드 하구요. Excel Download라는 버튼이 눌릴 경우, 포스트백과 동시에 DataGrid의 데이터를 얻어와서 그 것을 엑셀 형식으로 다운로드 시키는 것입니다.

코드를 모두 작성하셨다면, 실행하여 결과를 보도록 하세요 ^^

그러면, 위와 같이 엑셀 다운로드 창이 뜨구요. [열기] 버튼을 누르면 뜨거운 열기를 뿜어대며 다음과 같이 Excel 응용 프로그램이 뜨는 것을 보실 수 있을 것입니다.

멋지죠? 또한, 간단하죠?

오오.. 뭔가 뜨거운 기운이 느껴집니다.

그렇다면, 이제 코드를 살펴보도록 하겠습니다. 핵심이 되는 코드는 역시나 Button1_Click 이겠죠?

우선, 버튼이 클릭될 경우에는 저번 강좌에서 설명드렸던 것처럼, Response.Clear() 메서드를 통해서 버퍼에 존재할 지 모르는 모든 데이터를 제거합니다. 즉, 이제부터 작성되는 데이터만을 클라이언트의 브라우저로 내려보내기 위해서 기존 버퍼를 말끔히 비우는 것이지요. ^^

그 다음에는, Response.AddHeader("content-disposition", "attachment;filename=DataGrid.xls") 를 통해서 내려보낼 파일의 이름을 DataGrid.xls라고 지정합니다. 반드시 필요한 코드는 아니겠지만, 이렇게 명칭을 주는 것이 파일을 받아보는 사용자 입장에서는 더욱 분간이 쉬울 것입니다. 만일, 이 한 줄의 코드가 없다면 사용자는 aspx 파일 확장자를 갖는 Excel 파일을 보게 될테니까요 ^^

Response.ContentType = "application/vnd.xls"는 현재 내려보낼 데이터의 형식을 지정해 주는 부분입니다. 이 코드를 통해서 지금부터 내려보낼 데이터는 엑셀(Excel) 데이터라는 것을 클라이언트 브라우저가 인식할 수 있게 됩니다. ^^

자. 여기까지의 코드로 엑셀을 내려보내기 위한 환경적인 준비는 모두 된 것 같네요. 그렇다면, 이제부터는 실제로 Excel을 위한 데이터를 내려보낼 차례입니다.

무엇보다 먼저,데이터를 문자열로 기록하기 위한 클래스인 StringWriter의 개체가 필요할 것입니다. System.IO.StringWriter stringWriter = new System.IO.StringWriter()는 이를 위해 StringWriter 개체를 생성하는 코드입니다.

그리고, HTML 관련 문자 및 텍스트를 순차적으로 쓰기 위해 필요한 클래스인 HtmlTextWriter 클래스 인스턴스를 생성합니다. 이는 생성자의 인자로 방금 앞에서 만들어 둔 StringWriter 개체를 사용하게 됩니다.

DataGrid1.RenderControl(htmlWriter)는 DataGrid의 HTML 출력 렌더를 HtmlTextWriter에 기록하는 작업을 수행합니다. 이로써, 우리는 그리드의 출력을 HtmlTextWriter에 저장할 수 있게 됩니다. 이 작업이 핵심이라 볼 수 있겠네요 ^^

이제 마지막으로, DataGrid의 출력결과 HTML을 Response.Write(stringWrite.ToString())를 통해서 문자열로 브라우저의 화면에 출력합니다. 그러면, 이 모든 HTML 데이터는 실제로는 HTML 태그이지만, 엑셀 타입 형식으로 클라이언트에게로 내려가게 될 것입니다. ^^

생각보다 대단히 간단합니다. 원하는 컨트롤의 출력 HTML을 그대로 브라우저를 통해서 내려주면서, 파일의 형식만을 바꿔주면 되는 것이죠. 같은 방식으로 DataGrid의 출력물을 Excel이 아닌 Word 파일로도 내려보낼 수 있습니다. 왜냐하면, Microsoft Word도 HTML을 인식하거든요. ^^

말이 나온 김에 한번 해 볼까요?

기존의 코드에서 Response.AddHeader() 부분과 Response.ContentType을 주는 부분을 Excel이 아닌 Word 로 바꿔주기만 하면 간단하게 해결이 됩니다. ^^ 다음과 같이 말이죠 ^^     

    private void Button1_Click(object sender, System.EventArgs e)
    {
        Response.Clear();
//     Response.AddHeader("content-disposition", "attachment;filename=DataGrid.xls");
//     Response.ContentType = "application/vnd.xls";

        Response.AddHeader("content-disposition", "attachment;filename=DataGrid.doc");
        Response.ContentType = "application/vnd.word";


        System.IO.StringWriter stringWriter = new System.IO.StringWriter();
        System.Web.UI.HtmlTextWriter htmlWriter = new HtmlTextWriter(stringWriter);
        DataGrid1.RenderControl(htmlWriter);

        Response.Write(stringWrite.ToString());
        Response.End();
    }
}

코드를 모두 작성하셨다면, 실행하여 결과를 보도록 하세요 ^^. 그리드의 출력모습은 동일하겠지만, 버튼을 클릭할 경우 이번에는, 엑셀 다운로드 창이 아닌 워드 다운로드 창이 뜨는 것을 보실 수 있을 것입니다.

그리고, [열기] 버튼을 누르면 매우매우 뜨거운 열기를 마구마구 뿜어대며 다음과 같이 워드 응용 프로그램이 실행되어 그리드가 출력되는 것을 보실 수 있을 것입니다.

재미있죠???

다시 한번 강조하지만, 이 방법은 DataGrid의 출력 결과를 간단하게 엑셀이나 워드로 Export하고자 하는 경우에만 사용할 수 있습니다. 즉, 매우 제한적인 상황에서만 사용이 가능한 방법이라는 것이죠. 하지만, 그렇다 하더라도 상당히 유용하게 써먹을 수 있을 것입니다. ^^ 의외로 단순 엑셀 출력을 요구하는 경우는 많으니까요 ^^;

그런데, 안타까운 것은 대부분의 경우 프로젝트 시, 클라이언트들은 말입니다. 설계 시에는 단순 출력만 되면 된다고 말했으면서도, 막상 이렇게 만들어주면 더 추가적인 기능을 요구하는 경우가 많다는 것입니다. 쩝... ㅜㅜ 해서, 의외로 엑셀을 더 세밀하게 제어해야 할 필요가 있는 경우도 많을 것입니다. 그 때에는... 어떻게 해야 할까요?

그때는 홧팅을 해야 할 것입니다. ^^
마음을 가라앉히고, http://www.codeproject.com을 살펴주는 센스!!도 필요할 것이구요 ^^

그럼 다음 시간에 또 뵐께요~ 


Posted by 세모아
,