login register Sysop! about ME  
qrcode
    최초 작성일 :    2005년 08월 01일
  최종 수정일 :    2005년 08월 01일
  작성자 :    taeyo
  편집자 :    Taeyo (김 태영)
  읽음수 :    32,091

강좌 목록으로 돌아가기

필자의 잡담~

세월은 정말로 빠릅니다. 어느덧 사이트를 운영한지도 만 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을 살펴주는 센스!!도필요할 것이구요 ^^

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


authored by


 
 
.NET과 Java 동영상 기반의 교육사이트

로딩 중입니다...

서버 프레임워크 지원 : NeoDEEX
based on ASP.NET 3.5
Creative Commons License
{5}
{2} 읽음   :{3} ({4})