개발팁2016. 8. 31. 10:00

기존에 ASP.NET 에서 크리스탈레포트 출력기능을 만들어 보셨다면,
CrystalReportViewer 라는 서버컨트롤을 통해서 출력 화면을 만들었지만,
ASP.NET MVC 에서는 PDF 파일을 통해 출력하게 된다.

 

우선, Visual Studio 크리스탈레포트 개발환경을 만들어야 한다.
Crystal Reports for Visual Studio .NET 2010 또는 2012 를 검색해서 다운받아 설치한다.
이를 설치해야, Visual Studio 에서 API 와 Report Designer 를 사용할 수 있다.

 

ASP.NET MVC 프로젝트를 새로 만들고,

 

참조에 아래 4개를 추가한다.

 

CrystalDecisions.CrystalReports.Engine
CrystalDecisions.ReportSource
CrystalDecisions.Shared
CrystalDecisions.Web

 


솔루션 탐색기에서, 상위에 Reports 라는 폴더를 만든다.

 

 

 

Reports 를 선택하고, 마우스 오른쪽을 눌러, 추가 -> 새항목을 클릭한다.

 

 

Reporting 항목을 선택하고, Crystal Reports 를 선택하여, 생성할 rpt 파일 이름을 적어주고, 추가 버튼을 누른다.


 

 

 

새 Crystal Report 문서 만들기 창이 뜨면,
보고서 마법사를 사용할수도 있지만, 일단 빈 보고서 사용을 선택하면,
Report Designer 가 나온다.

 

 

 

머리글, 본문, 바닥글을 적당히 작성해보자.
아직까지는, DB 데이터 연결이나, 수식 등은 사용하지 않고, 그냥, 내용만 작성해보자.


 

 

이제, 생성된 레포트 파일을 Controller 에 연결할 차례다.

 

public ActionResult ShowReport()
{
     using (ReportClass rpt = new ReportClass())
     {
          rpt.FileName = Server.MapPath("~/") + "/Reports/Test1.rpt";
          rpt.Load();
          Stream stream = rpt.ExportToStream(CrystalDecisions.Shared.ExportFormatType.PortableDocFormat);

          return File(stream, "application/pdf");
     }
}

 

ReportClass 를 이용하여,  rpt 파일을 Load 하여, PDF (Portable Doc Format) 로 변환하여,
리턴한다.
아직, DB연결은 들어가지 않았기 때문에, 소스파일은 아주 간단하다.

실제로, PDF 로 리턴하게 되면, 웹브라우저에서는 Acrobat Reader 를 통해, 화면에 출력이 되며, 인쇄가 가능하다.

ExportFormatType 에는 Excel 이나 Word, html 등 여러가지가 있으니, 변경하면서, 테스트 해보길 바란다.

 

인터넷익스플로러에서 보여지는 화면이다.

 

 

크롬에서 통해 보여지는 화면이다.

 

실제 인터넷익스플로러 에서는 Object 태그로 구성이 되고, 크롬에서는 Embed 태그를 통해 구성이 된다.

Posted by 헝개
개발팁2016. 7. 20. 09:41

ASP.NET 의 View 를 ViewEngine 으로 렌더링해서 나온 HTML 을 엑셀로 내려받는 방법이다.

 

아래와 같이 2개의 정적 메서드를 정적 클래스 (static class) 안에 정의한다.

 

// Copyright 헝그리개발자​(http://bemeal2.tistory.com)
// 소스는 자유롭게 사용가능합니다. Copyright 는 삭제하지 마세요.

// HTML 을 엑셀파일로 웹 다운로드
public static void ToExcelDownload(this string strHTML, string filename)
{
    filename = filename.Replace(" ", "_");



    HttpContext.Current.Response.AppendHeader("content-disposition", "attachment;filename=" + HttpUtility.UrlEncode(filename));
    HttpContext.Current.Response.Charset = "";
    HttpContext.Current.Response.Cache.SetCacheability(HttpCacheability.NoCache);
    HttpContext.Current.Response.ContentType = "application/vnd.ms-excel";
    HttpContext.Current.Response.Write(strHTML);
    HttpContext.Current.Response.End();
}



// View 를 HTML 문자열로 변환
public static string ViewToString(this ControllerContext controller, string viewName, ViewDataDictionary ViewData, TempDataDictionary TempData, object model)
{
    ViewData.Model = model;
    using (var sw = new StringWriter())
    {
         var viewResult = ViewEngines.Engines.FindPartialView(controller, viewName);
         var viewContext = new ViewContext(controller, viewResult.View, ViewData, TempData, sw);
         viewResult.View.Render(viewContext, sw);
         viewResult.ViewEngine.ReleaseView(controller, viewResult.View);


         return sw.GetStringBuilder().ToString();
    }
}

 

ToExcelDownload 메서드는 문자열(html)을 엑셀타입으로 내려받도록 해준다.

실제 내용은 table 테그로 구성된 html 이지만, 엑셀 형식으로 다운로드하도록 해주는 것이다.

 

ViewToString 메서드는 ViewContext 로, View 를 렌더링해서 String 으로 만들어준다.

 

 

엑셀 다운로드 버튼에 대한 Controller 를 아래와 같이 정의할 수 있다.

Model 을 구성하여, ViewToString 으로 View 이름과 Model 객체를 전달하여 준다.

예제에서는 Controller 이름과 동일한 이름의 View 이름을 사용하였다.

 

이 말은, 현재 Controller 의 View 를 호출하여 렌더링 한다는 뜻이다.

물론, 다른 Controller 의 View 이름을 넣어주어도 상관이 없다. 해당 View 에 맞는 Model 만 생성해서 전달해주면 된다.

 

 // 엑셀 다운로드에 대한 컨트롤러
public ActionResult Sample_ExcelDownload(int key_id)
{
    MySampleDataContainer model = new MySampleDataContainer();



    BizSample biz = new BizSample();
    model.header = biz.SampleDataInfo(key_id);
    model.list = biz.SampleDataList(key_id);



    string strHTML = this.ControllerContext.ViewToString("Sample_ExcelDownload", this.ViewData, this.TempData, model);
    string filename = "excel_download_sample.xls";
    strHTML.ToExcelDownload(filename);

    return View();
}

 

 

View 내용인데, 일반적으로 사용하는 View 와 동일하다.

다만 Excel 파일로 열어줘야 하기 때문에 엑셀에서 인식하도록 몇가지 태그가 추가되었을 뿐이다.

 

 // 엑셀 내용에 대한 뷰 - Sample_ExcelDownload
@model HD.DataFactory.MySampleDataContainer
@{
    ViewBag.Title = "Excel";
    Layout = "~/Views/Shared/_ContentLayout.cshtml";
}

<html xmlns:o="urn:schemas-microsoft-com:office:office" xmlns:x="urn:schemas-microsoft-com:office:excel" xmlns="http://www.w3.org/TR/REC-html40">
<head>
    <meta content="text/html; charset=utf-8" http-equiv="content-type" />
    <!--[if gte mso 9]>
<xml>
<x:ExcelWorkbook>
<x:ExcelWorksheets>
<x:ExcelWorksheet>
<x:Name>sheet name</x:Name>
<x:WorksheetOptions>
<x:DisplayGridlines/>
</x:WorksheetOptions>
</x:ExcelWorksheet>
</x:ExcelWorksheets>
</x:ExcelWorkbook>
</xml>
<![endif]-->
</head>
<body>

<table class="doc_data_list" border="1">
...
</table>

</body>
</html>

 

 

Posted by 헝개