첨부 실행 코드는 나눔고딕코딩 폰트를 사용합니다.
728x90
반응형
728x170

TestProject.zip
다운로드

▶ Program.cs

using System;
using System.Collections.Generic;
using System.IO;
using System.Text;

namespace TestProject
{
    /// <summary>
    /// 프로그램
    /// </summary>
    class Program
    {
        //////////////////////////////////////////////////////////////////////////////////////////////////// Method
        ////////////////////////////////////////////////////////////////////////////////////////// Static
        //////////////////////////////////////////////////////////////////////////////// Private

        #region 전체 페이지 카운트 구하기 - GetTotalPageCount(itemCount, pageItemCount)

        /// <summary>
        /// 전체 페이지 카운트 구하기
        /// </summary>
        /// <param name="itemCount">항목 카운트</param>
        /// <param name="pageItemCount">페이지당 항목 카운트</param>
        /// <returns>전체 페이지 카운트</returns>
        private static int GetTotalPageCount(int itemCount, int pageItemCount)
        {
            return (int)Math.Ceiling((double)itemCount / (double)pageItemCount);
        }

        #endregion
        #region 항목 시작 인덱스 구하기 - GetItemStartIndex(totalPageCount, pageItemCount, pageIndex)

        /// <summary>
        /// 항목 시작 인덱스 구하기
        /// </summary>
        /// <param name="totalPageCount">전체 페이지 카운트</param>
        /// <param name="pageItemCount">페이지당 항목 카운트</param>
        /// <param name="pageIndex">페이지 인덱스</param>
        /// <returns>항목 시작 인덱스</returns>
        private static int GetItemStartIndex(int totalPageCount, int pageItemCount, int pageIndex)
        {
            if(pageIndex < 0 || pageIndex >= totalPageCount)
            {
                return -1;
            }

            int itemStartIndex = pageIndex * pageItemCount;

            return itemStartIndex;
        }

        #endregion
        #region 항목 종료 인덱스 구하기 - GetItemEndIndex(itemCount, pageItemCount, itemStartIndex)

        /// <summary>
        /// 항목 종료 인덱스 구하기
        /// </summary>
        /// <param name="itemCount">항목 카운트</param>
        /// <param name="pageItemCount">페이지당 항목 카운트</param>
        /// <param name="itemStartIndex">항목 시작 인덱스</param>
        /// <returns>항목 종료 인덱스</returns>
        private static int GetItemEndIndex(int itemCount, int pageItemCount, int itemStartIndex)
        {
            int itemEndIndex = Math.Min(itemCount - 1, itemStartIndex + pageItemCount - 1);

            return itemEndIndex;
        }

        #endregion
        #region HTML 페이지 파일명 구하기 - GetHTMLPageFileName(pageNumber)

        /// <summary>
        /// HTML 페이지 파일명 구하기
        /// </summary>
        /// <param name="pageNumber">페이지 번호</param>
        /// <returns>HTML 페이지 파일명</returns>
        /// <remarks>페이지 번호 : 1부터 시작한다.</remarks>
        private static string GetHTMLPageFileName(int pageNumber)
        {
            return string.Format("page{0}.html", pageNumber);
        }

        #endregion
        #region 페이지 링크 HTML 구하기 - GetPageLinkHTML(totalPageCount, pageRange, currentPage)

        /// <summary>
        /// 페이지 링크 HTML 구하기
        /// </summary>
        /// <param name="totalPageCount">전체 페이지 카운트</param>
        /// <param name="pageRange">페이지 범위</param>
        /// <param name="currentPage">현재 페이지</param>
        /// <returns>페이지 링크 HTML</returns>
        /// <remarks>현재 페이지 : 1부터 시작한다.</remarks>
        private static string GetPageLinkHTML(int totalPageCount, int pageRange, int currentPage)
        {
            StringBuilder stringBuilder = new StringBuilder();

            if(totalPageCount == 0)
            {
                return string.Empty;
            }

            stringBuilder.AppendLine("<table cellpadding=\"0\" cellspacing=\"0\" border=\"0\">");
            stringBuilder.AppendLine("<tr>");
            stringBuilder.AppendLine("<td>");

            int rangeCount = currentPage / pageRange;

            if(currentPage % pageRange == 0)
            {
                rangeCount = currentPage / pageRange - 1;
            }

            #region 첫번째 페이지 링크를 추가한다.

            int firstPage = currentPage - pageRange;

            if(firstPage > 0)
            {
                stringBuilder.AppendFormat("<a href=\"{0}\">첫번째 페이지</a>", GetHTMLPageFileName(1));
                stringBuilder.AppendLine();
            }
            else
            {
                //stringBuilder.AppendLine("첫번째 페이지");
            }

            #endregion
            #region 이전 페이지 링크를 추가한다.

            if(currentPage > pageRange)
            {
                int pageNumber;

                if(currentPage % pageRange == 0)
                {
                    pageNumber = currentPage - pageRange;
                }
                else
                {
                    pageNumber = currentPage - currentPage % pageRange;
                }

                stringBuilder.AppendFormat("<a href=\"{0}\">이전 페이지</a>", GetHTMLPageFileName(pageNumber));
                stringBuilder.AppendLine();
            }
            else
            {
                //stringBuilder.AppendLine("이전 페이지");
            }

            #endregion
            #region 페이지 링크를 추가한다.

            for(int pageNumber = rangeCount * pageRange + 1; pageNumber < (rangeCount + 1) * pageRange + 1; pageNumber++)
            {
                string fontStartHTML = "<font size=\"2\">";
                string fontEndHTML   = "</font>";

                if(pageNumber == currentPage)
                {
                    fontStartHTML = "<font size=\"2\"><b>";
                    fontEndHTML   = "</b></font>";
                }

                stringBuilder.AppendFormat("{0}<a href=\"{1}\">{2}</a>{3}",
                    fontStartHTML, GetHTMLPageFileName(pageNumber), pageNumber, fontEndHTML);
                stringBuilder.AppendLine();

                if(pageNumber == totalPageCount)
                {
                    break;
                }
            }

            #endregion
            #region 다음 페이지 링크를 추가한다.

            if(totalPageCount > (rangeCount + 1) * pageRange)
            {
                stringBuilder.AppendFormat("<a href=\"{0}\">다음 페이지</a>",
                    GetHTMLPageFileName((rangeCount + 1) * pageRange + 1));
                stringBuilder.AppendLine();
            }
            else
            {
                //stringBuilder.AppendLine("다음 페이지");
            }

            #endregion
            #region 마지막 페이지 링크를 추가한다.

            int endPage = currentPage + pageRange;

            if(endPage < totalPageCount)
            {
                stringBuilder.AppendFormat("<a href=\"{0}\">마지막 페이지</a>", totalPageCount);
                stringBuilder.AppendLine();
            }
            else
            {
                //stringBuilder.AppendLine("마지막 페이지");
            }

            #endregion

            stringBuilder.AppendLine("</td>");
            stringBuilder.AppendLine("</tr>");
            stringBuilder.AppendLine("</table>");

            return stringBuilder.ToString();
        }

        #endregion
        #region HTML 페이지 구하기 - GetHTMLPage(itemHorizontalCount, itemWidth, itemHeight, totalPageCount,
                                                 pageIndex, itemStartIndex, itemEndIndex)

        /// <summary>
        /// HTML 페이지 구하기
        /// </summary>
        /// <param name="itemHorizontalCount">항목 수평 카운트</param>
        /// <param name="itemWidth">항목 너비</param>
        /// <param name="itemHeight">항목 높이</param>
        /// <param name="totalPageCount">전체 페이지 카운트</param>
        /// <param name="pageIndex">페이지 인덱스</param>
        /// <param name="itemStartIndex">항목 시작 인덱스</param>
        /// <param name="itemEndIndex">항목 종료 인덱스</param>
        /// <returns>HTML 페이지</returns>
        private static string GetHTMLPage(int itemHorizontalCount, int itemWidth, int itemHeight, int totalPageCount,
                                          int pageIndex, int itemStartIndex, int itemEndIndex)
        {
            StringBuilder stringBuilder = new StringBuilder();

            stringBuilder.AppendLine("<html>");
            stringBuilder.AppendLine("<head>");
            stringBuilder.AppendLine("<meta charset=\"utf-8\">");
            stringBuilder.AppendLine("<head>");
            stringBuilder.AppendLine("<body>");
            stringBuilder.AppendFormat("<h1>Page : {0}</h1>", pageIndex +1);
            stringBuilder.AppendLine();
            stringBuilder.AppendLine("<table>");
            stringBuilder.AppendLine("<tr>");

            int count = itemEndIndex - itemStartIndex + 1;

            for(int i = 0; i < count; i++)
            {
                stringBuilder.AppendFormat("<td>Item {0}</td>", itemStartIndex + i + 1);
                stringBuilder.AppendLine();

                if(i > 0 && (i + 1) % itemHorizontalCount == 0)
                {
                    stringBuilder.AppendLine("</tr>");
                    stringBuilder.AppendLine("<tr>");
                }
            }

            stringBuilder.AppendLine("</tr>");
            stringBuilder.AppendLine("</table>");
            stringBuilder.AppendLine("<p></p>");

            string pageLinkHTML = GetPageLinkHTML(totalPageCount, 10, pageIndex + 1);

            stringBuilder.AppendLine(pageLinkHTML);

            stringBuilder.AppendLine("</body>");
            stringBuilder.AppendLine("</html>");

            string htmlPage = stringBuilder.ToString();

            return htmlPage;
        }

        #endregion
        #region HTML 페이지 리스트 구하기 - GetHTMLPageList(itemCount, itemHorizontalCount, pageItemCount,
                                                            itemWidth, itemHeight)

        /// <summary>
        /// HTML 페이지 리스트 구하기
        /// </summary>
        /// <param name="itemCount">항목 카운트</param>
        /// <param name="itemHorizontalCount">항목 수평 카운트</param>
        /// <param name="pageItemCount">페이지당 항목 카운트</param>
        /// <param name="itemWidth">항목 너비</param>
        /// <param name="itemHeight">항목 높이</param>
        /// <returns>HTML 페이지 리스트</returns>
        private static List<string> GetHTMLPageList(int itemCount, int itemHorizontalCount, int pageItemCount,
                                                    int itemWidth, int itemHeight)
        {
            int totalPageCount = GetTotalPageCount(itemCount, pageItemCount);

            List<string> list = new List<string>();

            for(int pageIndex = 0; pageIndex < totalPageCount; pageIndex++)
            {
                int    itemStartIndex = GetItemStartIndex(totalPageCount, pageItemCount, pageIndex);
                int    itemEndIndex   = GetItemEndIndex(itemCount, pageItemCount, itemStartIndex);
                string htmlPage       = GetHTMLPage(itemHorizontalCount, itemWidth, itemHeight, totalPageCount,
                                                    pageIndex, itemStartIndex, itemEndIndex);

                list.Add(htmlPage);
            }

            return list;
        }

        #endregion

        #region 프로그램 시작하기 - Main()

        /// <summary>
        /// 프로그램 시작하기
        /// </summary>
        private static void Main()
        {
            #region 저장 디렉토리가 없는 경우 생성한다.

            string saveDirectory = "c:\\temp";

            if(!Directory.Exists(saveDirectory))
            {
                Directory.CreateDirectory(saveDirectory);
            }

            #endregion

            // 536건의 항목들을 페이지당 100건씩 나눠서 HTML 페이지 파일을 생성한다.
            // HTML 페이지에서 항목들을 한 줄에 4건씩 표시한다.
            // 생성된 페이지는 [첫번째 페이지][이전 페이지][페이지 번호...][다음 페이지][마지막 페이지] 링크를 갖는다.
            // 항목 너비와 높이는 HTML 문서 생성시 참조될 수 있으나 예제에서는 참조하지 않았다.
            int itemCount           = 536;
            int pageItemCount       = 100;
            int itemHorizontalCount = 4;
            int itemWidth           = 200;
            int itemHeight          = 200;

            List<string> htmlPageList = GetHTMLPageList(itemCount, itemHorizontalCount, pageItemCount, itemWidth, itemHeight);

            for(int i = 0; i < htmlPageList.Count; i++)
            {
                string htmlPageFileName = GetHTMLPageFileName(i + 1);

                File.WriteAllText(Path.Combine(saveDirectory, htmlPageFileName), htmlPageList[i]);
            }
        }

        #endregion
    }
}
728x90
반응형
그리드형(광고전용)
Posted by icodebroker

댓글을 달아 주세요