본문 바로가기
IT-개발,DB

[개발] [ASP.NET] 엑셀 파운 다운로드/업로드(소스)

by SB리치퍼슨 2010. 10. 28.

엑셀 파일 다운로드/업로드(소스)

//  프로그램설명 : DB Table 데이터를 엑셀로 저장하여 다운로드 받을 수 있도록 하거나,


//  엑셀의 데이터를 DB Table로 업로드할 수 있는 클래스


//  단, Excel 프로그램이 설치되어있어야 동작 가능함. SqlHelper 부분은 별도로 추가하셔야 합니다.

// 주석을 자세히 달았으므로 이해하는데는 문제가 없으실 겁니다.


 

using System;
using System.IO;
using System.Data;
using System.Reflection;
using Excel=Microsoft.Office.Interop.Excel;
using System.Collections;
using System.Web;
using System.Web.UI;
using System.Data.OleDb;
using System.Data.SqlClient;

namespace Utilities
{
    ///


    /// DataTable을 입력 데이타로 받아서 해당 데이타로 새로운 엑셀 파일을 만들며
    /// 3가지 유형의 함수를 현재 제공하고 있다.
    /// 향후에는 ADO.NET 처리를 하는 부분과 엑셀 파일에 컬럼명이 추가되도록 할 예정이다.
    /// DB Table 데이터를 엑셀로 저장하여 다운로드 받을 수 있도록 하거나,
    /// 엑셀의 데이터를 DB Table로 업로드할 수 있는 클래스
    /// 단, Excel 2003 혹은 최소 XP 프로그램이 설치되어있어야 동작 가능함.
    ///

    public class ExcelHandler
    {
        ///
        /// 임시 생성 엑셀파일 목록 관리
        ///

        private static ArrayList exportedFiles = new ArrayList();
        ///
        /// 임시 파일 삭제 주기(분 단위)
        ///

        private static int deleteMinutePeriod = 30;

        ///


        /// 임시 엑셀 파일 삭제 주기 설정한다.
        /// 단위는 분단위임. 설정하지 않을 시에는 기본 값이 30분이다.
        /// 30분간만의 임시 파일만 유지한다.
        ///

        public static int DeletePeriodMinute
        {
            set
            {
                deleteMinutePeriod = value;
            }
            get
            {
                return deleteMinutePeriod;
            }
        }

        ///


        /// 생성자
        ///

        public ExcelHandler()
        {
        }

        #region 새로운 엑셀 파일 생성 유형
        ///


        /// 데이타 테이블을 입력 데이타로 받아서 해당 데이타로 새로운
        /// 엑셀 파일을 만든다.
        /// 저장된 엑셀 파일을 다운로드하지 않는다.
        /// 1번째 행과 1번째 열부터 저장한다.
        ///

        /// 입력 데이타(DataTable)
        /// 저장 경로명과 파일명
        /// 저장 성공 여부
        public static bool ExportNewFile(DataTable dt, string savedFile)
        {
            return PExportNewFile(dt, savedFile, 1, 1, null);
        }

        ///


        /// 데이타 테이블을 입력 데이타로 받아서 해당 데이타로 새로운
        /// 엑셀 파일을 만든다.
        /// 저장된 엑셀 파일을 다운로드하지 않는다.
        /// 1번째 행과 1번째 열부터 저장한다.
        /// 저장된 엑셀 파일을 다운로드한다.
        ///

        /// 입력 데이타(DataTable)
        /// 저장 경로명과 파일명
        /// 다운로드될 페이지
        /// 저장 성공 여부
        public static bool ExportNewFile(DataTable dt, string savedFile, Page downloadPage)
        {
            return PExportNewFile(dt, savedFile, 1, 1, downloadPage);
        }

        ///


        /// 데이타 테이블을 입력 데이타로 받아서 해당 데이타로 새로운
        /// 엑셀 파일을 만든다.
        /// 저장된 엑셀 파일을 다운로드하지 않는다.
        ///

        /// 입력 데이타(DataTable)
        /// 저장 경로명과 파일명
        /// 엑셀에서 데이타 시작행
        /// 엑셀에서 데이타 시작열
        /// 저장 성공 여부
        public static bool ExportNewFile(DataTable dt, string SavedFile, int row, int col)
        {
            return PExportNewFile(dt, SavedFile, row, col, null);
        }

        ///


        /// 데이타 테이블을 입력 데이타로 받아서 해당 데이타로 새로운
        /// 엑셀 파일을 만든다.
        /// 저장된 엑셀 파일을 다운로드한다.
        ///

        /// 입력 데이타(DataTable)
        /// 저장 경로명과 파일명
        /// 엑셀에서 데이타 시작행
        /// 엑셀에서 데이타 시작열
        /// 엑셀 파일 다운로드를 요청한 페이지
        /// 저장 성공 여부
        public static bool ExportNewFile(DataTable dt, string SavedFile, int row, int col, Page downloadPage)
        {
            return PExportNewFile(dt, SavedFile, row, col, downloadPage);
        }

        ///


        /// 데이타 테이블을 입력 데이타로 받아서 해당 데이타로 새로운
        /// 엑셀 파일을 만든다.
        ///

        /// 입력 데이타(DataTable)
        /// 저장 경로명과 파일명
        /// 엑셀에서 데이타 시작행
        /// 엑셀에서 데이타 시작열
        /// 엑셀 파일 다운로드를 요청한 페이지
        /// 저장 성공 여부
        private static bool PExportNewFile(DataTable dt, string SavedFile, int row, int col, Page downloadPage)
        {
            try
            {
                DeleteTemporaryFiles();

                GC.Collect();// clean up any other excel guys hangin'' around...
                Excel.Application excelApp = new Excel.Application();
                // excelApp.Visible = true;
                Excel.Workbook excelWorkbook = excelApp.Workbooks.Add(Type.Missing);
                Excel.Sheets excelSheets = excelWorkbook.Worksheets;
                string currentSheet = "Sheet1";
                Excel.Worksheet excelWorksheet = (Excel.Worksheet)excelSheets.get_Item(currentSheet);
    
                int ColCounter = dt.Columns.Count;

                // 컬럼명을 먼저 기록한다.
                int columnidex = 0;
                foreach(DataColumn dc in dt.Columns)
                {
                    excelWorksheet.Cells[row, col+columnidex++] = dc.ColumnName;
                }

                // 컬럼명을 적은 Row 다음에 데이터를 적을 수 있게끔 증가한다.
                row++;

                DataRow[] rpt = dt.Select();
                foreach(DataRow dr in rpt)
                {
                    for(int i = 0; i < ColCounter; i++)
                    {
                        excelWorksheet.Cells[row, col+i] = dr[i].ToString();
                    }
                    row++;
                }

                string tempSavedFileName = SavedFile + "." + Guid.NewGuid().ToString();
               

                FileInfo f = new FileInfo(tempSavedFileName);
                if(f.Exists)
                    f.Delete(); // delete the file if it already exist.
                // Workbook 저장
                excelWorkbook.SaveAs(tempSavedFileName, Excel.XlFileFormat.xlWorkbookNormal, null, null, false, false, Excel.XlSaveAsAccessMode.xlExclusive, false, false, null, null, null);
                // 클린업 작업
                excelWorkbook.Close(null, null, null);
                excelApp.Workbooks.Close();
                // excelApp.Application.Quit();
                excelApp.Quit();
                System.Runtime.InteropServices.Marshal.ReleaseComObject(excelWorksheet);
                System.Runtime.InteropServices.Marshal.ReleaseComObject(excelWorkbook);
                System.Runtime.InteropServices.Marshal.ReleaseComObject(excelApp);
                excelWorksheet = null;
                excelWorkbook = null;
                excelApp = null;
                GC.Collect();

                if(downloadPage != null)
                    Download(downloadPage, SavedFile, tempSavedFileName);

                return true;

            }
            catch( Exception theException )
            {
                GC.Collect();
                throw theException;
            }
        }
        #endregion

        #region 템플릿 파일 사용 유형 1
        ///


        /// 데이타 테이블을 입력 데이타로 받아서 해당 데이타로 기존 엑셀 파일(혹은 서식 파일)을
        /// 열어 엑셀 파일을 만든다.
        /// 저장된 파일의 다운로드를 요청하지 않는다.
        ///

        /// 입력 데이타
        /// 기존 엑셀 파일 경로명과 파일명
        /// 저장 경로명과 파일명
        /// 데이타가 저장될 Sheet명
        /// 저장 성공 여부
        public static bool ExportExistFile(DataTable dt, string OriginalFile, string SavedFile, string ws)
        {
            return PExportExistFile(dt, OriginalFile, SavedFile, ws, 1, 1, null);
        }

        ///


        /// 데이타 테이블을 입력 데이타로 받아서 해당 데이타로 기존 엑셀 파일(혹은 서식 파일)을
        /// 열어 엑셀 파일을 만든다.
        /// 저장된 파일의 다운로드를 요청한다.
        ///

        /// 입력 데이타
        /// 기존 엑셀 파일 경로명과 파일명
        /// 저장 경로명과 파일명
        /// 데이타가 저장될 Sheet명
        /// 엑셀 파일 다운로드를 요청한 페이지
        /// 저장 성공 여부
        public static bool ExportExistFile(DataTable dt, string OriginalFile, string SavedFile, string ws, Page downloadPage)
        {
            return PExportExistFile(dt, OriginalFile, SavedFile, ws, 1, 1, downloadPage);
        }

        ///


        /// 데이타 테이블을 입력 데이타로 받아서 해당 데이타로 기존 엑셀 파일(혹은 서식 파일)을
        /// 열어 엑셀 파일을 만든다.
        /// 저장된 파일의 다운로드를 요청하지 않는다.
        ///

        /// 입력 데이타
        /// 기존 엑셀 파일 경로명과 파일명
        /// 저장 경로명과 파일명
        /// 데이타가 저장될 Sheet명
        /// Sheet에서 데이타의 시작 행
        /// Sheet에서 데이타의 시작 컬럼
        /// 저장 성공 여부
        public static bool ExportExistFile(DataTable dt, string OriginalFile, string SavedFile, string ws, int row, int col)
        {
            return PExportExistFile(dt, OriginalFile, SavedFile, ws, row, col, null);
        }

        ///


        /// 데이타 테이블을 입력 데이타로 받아서 해당 데이타로 기존 엑셀 파일(혹은 서식 파일)을
        /// 열어 엑셀 파일을 만든다.
        /// 저장된 파일의 다운로드를 요청한다.
        ///

        /// 입력 데이타
        /// 기존 엑셀 파일 경로명과 파일명
        /// 저장 경로명과 파일명
        /// 데이타가 저장될 Sheet명
        /// Sheet에서 데이타의 시작 행
        /// Sheet에서 데이타의 시작 컬럼
        /// 엑셀 파일 다운로드를 요청한 페이지
        /// 저장 성공 여부
        public static bool ExportExistFile(DataTable dt, string OriginalFile, string SavedFile, string ws, int row, int col, Page downloadPage)
        {
            return PExportExistFile(dt, OriginalFile, SavedFile, ws, row, col, downloadPage);
        }

        ///


        /// 데이타 테이블을 입력 데이타로 받아서 해당 데이타로 기존 엑셀 파일(혹은 서식 파일)을
        /// 열어 엑셀 파일을 만든다.
        ///

        /// 입력 데이타
        /// 기존 엑셀 파일 경로명과 파일명
        /// 저장 경로명과 파일명
        /// 데이타가 저장될 Sheet명
        /// Sheet에서 데이타의 시작 행
        /// Sheet에서 데이타의 시작 컬럼
        /// 엑셀 파일 다운로드를 요청한 페이지
        /// 저장 성공 여부
        private static bool PExportExistFile(DataTable dt, string OriginalFile, string SavedFile, string ws, int row, int col, Page downloadPage)
        {
            try
            {
                DeleteTemporaryFiles();

                GC.Collect();// clean up any other excel guys hangin'' around...
                Excel.Application excelApp = new Excel.Application();
                Excel.Workbook excelWorkbook = excelApp.Workbooks.Open(OriginalFile, 0, false, 5, "", "", false, Excel.XlPlatform.xlWindows, "", true, false, 0, true, false, false);
                Excel.Sheets excelSheets = excelWorkbook.Worksheets;
                Excel.Worksheet excelWorksheet = (Excel.Worksheet)excelSheets.get_Item(ws);
                int ColCounter = dt.Columns.Count;

                // 컬럼명을 먼저 기록한다.
                int columnidex = 0;
                foreach(DataColumn dc in dt.Columns)
                {
                    excelWorksheet.Cells[row, col+columnidex++] = dc.ColumnName;
                }

                // 컬럼명을 적은 Row 다음에 데이터를 적을 수 있게끔 증가한다.
                row++;

                DataRow[] rpt = dt.Select();
                foreach(DataRow dr in rpt)
                {
                    for(int i = 0; i < ColCounter; i++)
                    {
                        excelWorksheet.Cells[row, i+col] = dr[i].ToString();
                    }
                    row++;
                }

                string tempSavedFileName = SavedFile + "." + Guid.NewGuid().ToString();

                FileInfo f = new FileInfo(tempSavedFileName);
                if(f.Exists)
                    f.Delete(); // delete the file if it already exist.
                // Workbook 저장
                excelWorkbook.SaveAs(tempSavedFileName, Excel.XlFileFormat.xlWorkbookNormal, null, null, false, false, Excel.XlSaveAsAccessMode.xlExclusive, false, false, null, null, null);
                // 클린업 작업
                excelWorkbook.Close(null, null, null);
                excelApp.Workbooks.Close();
                // excelApp.Application.Quit();
                excelApp.Quit();
                System.Runtime.InteropServices.Marshal.ReleaseComObject(excelWorksheet);
                System.Runtime.InteropServices.Marshal.ReleaseComObject(excelWorkbook);
                System.Runtime.InteropServices.Marshal.ReleaseComObject(excelApp);
                excelWorksheet = null;
                excelWorkbook = null;
                excelApp = null;
                GC.Collect();

                if(downloadPage != null)
                    Download(downloadPage, SavedFile, tempSavedFileName);

                return true;

            }
            catch( Exception theException )
            {
                GC.Collect();
                throw theException;
            }
        }
        #endregion

        #region 템플릿 파일 사용 유형 2
        ///


        /// Array를 입력 데이타로 받아서 해당 데이타로 기존 엑셀 파일(혹은 서식 파일)을 열어
        /// Array에 저장된 키, 값 형태의 데이터를 엑셀 파일 Sheet의 해당 위치에 저장되는 엑셀 파일을 만든다.
        /// 엑셀 파일을 만든 뒤 다운로드를 수행하지 않는 오버로드
        ///

        /// 입력 데이타(Array)
        /// 기존 엑셀 파일 경로명과 파일명
        /// 저장 경로명과 파일명
        /// 데이타가 저장될 Sheet명
        /// 저장 성공 여부
        public static bool ExportExistFile(Hashtable ht, string OriginalFile, string SavedFile, string ws)
        {
            return PExportExistFile(ht, OriginalFile, SavedFile, ws, null);
        }

        ///


        /// Array를 입력 데이타로 받아서 해당 데이타로 기존 엑셀 파일(혹은 서식 파일)을 열어
        /// Array에 저장된 키, 값 형태의 데이터를 엑셀 파일 Sheet의 해당 위치에 저장되는 엑셀 파일을 만든다.
        /// 엑셀 파일을 만든 뒤 다운로드를 수행하는 오버로드
        ///

        /// 입력 데이타(Array)
        /// 기존 엑셀 파일 경로명과 파일명
        /// 저장 경로명과 파일명
        /// 데이타가 저장될 Sheet명
        /// 엑셀 파일 다운로드를 요청한 페이지
        /// 저장 성공 여부
        public static bool ExportExistFile(Hashtable ht, string OriginalFile, string SavedFile, string ws, Page downloadPage)
        {
            return PExportExistFile(ht, OriginalFile, SavedFile, ws, downloadPage);
        }

        ///


        /// Array를 입력 데이타로 받아서 해당 데이타로 기존 엑셀 파일(혹은 서식 파일)을 열어
        /// Array에 저장된 키, 값 형태의 데이터를 엑셀 파일 Sheet의 해당 위치에 저장되는 엑셀 파일을 만든다.
        ///

        /// 입력 데이타(Array)
        /// 기존 엑셀 파일 경로명과 파일명
        /// 저장 경로명과 파일명
        /// 데이타가 저장될 Sheet명
        /// 엑셀 파일 다운로드를 요청한 페이지
        /// 저장 성공 여부
        private static bool PExportExistFile(Hashtable ht, string OriginalFile, string SavedFile, string ws, Page downloadPage)
        {
            try
            {
                GC.Collect();// clean up any other excel guys hangin'' around...
                Excel.Application excelApp = new Excel.Application();
                Excel.Workbook excelWorkbook = excelApp.Workbooks.Open(OriginalFile, 0, false, 5, "", "", false, Excel.XlPlatform.xlWindows, "", true, false, 0, true, false, false);
                Excel.Sheets excelSheets = excelWorkbook.Worksheets;
                Excel.Worksheet excelWorksheet = (Excel.Worksheet)excelSheets.get_Item(ws);

    
                foreach(string str in ht.Keys)
                {
                    int x = str.IndexOf(":");
                    string col = str.Substring(0, x);
                    string row = str.Substring(x + 1, str.Length - x -1);
                    excelWorksheet.Cells[row, col] = ht[str];
     
                }
    
                FileInfo f = new FileInfo(SavedFile);

                if(f.Exists)
                    f.Delete(); // delete the file if it already exist.
                // Workbook 저장
                excelWorkbook.SaveAs(SavedFile, Excel.XlFileFormat.xlWorkbookNormal, null, null, false, false, Excel.XlSaveAsAccessMode.xlExclusive, false, false, null, null, null);
                // 클린업 작업
                excelWorkbook.Close(null, null, null);
                excelApp.Workbooks.Close();
                // excelApp.Application.Quit();
                excelApp.Quit();
                System.Runtime.InteropServices.Marshal.ReleaseComObject(excelWorksheet);
                System.Runtime.InteropServices.Marshal.ReleaseComObject(excelWorkbook);
                System.Runtime.InteropServices.Marshal.ReleaseComObject(excelApp);
                excelWorksheet = null;
                excelWorkbook = null;
                excelApp = null;
                GC.Collect();

                if(downloadPage != null)
                {
                    Download(downloadPage, SavedFile);
                }

                return true;

            }
            catch( Exception theException )
            {
                GC.Collect();
                throw theException;
            }
        }
        #endregion

        #region 임시 생성 엑셀 파일 정리
        private static void DeleteTemporaryFiles()
        {
            // 임시로 생성한 엑셀 파일들 삭제
            if(exportedFiles.Count > 0)
            {
                ArrayList tempFiles = new ArrayList();

                foreach(FileInfo fi in exportedFiles)
                {
                    TimeSpan diffTimes = new TimeSpan( DateTime.Now.Ticks - fi.CreationTime.Ticks );

                    if(diffTimes.TotalMinutes > deleteMinutePeriod)
                    {
                        tempFiles.Add(fi);
                        fi.Delete();
                    }
                }
       
                foreach(FileInfo fi in tempFiles)
                    exportedFiles.Remove(fi);
            }
        }
       
        private static void AddExportedFileName(FileInfo fi)
        {
            exportedFiles.Add(fi);
        }
        #endregion

        #region 엑셀 파일 DB 업로드

        ///


        /// 엑셀로부터 데이터를 추출하여 DataSet으로 반환한다.
        ///

        /// 업로드할 엑셀 파일
        /// 엑셀 데이터셋
        public static DataSet GetDataSetFromExcelFile(System.Web.UI.HtmlControls.HtmlInputFile hif)
        {
            return GetDataSetFromExcelFile(hif, "Sheet1", true);
        }

        ///


        /// 엑셀로부터 데이터를 추출하여 DataSet으로 반환한다.
        ///

        /// 업로드할 엑셀 파일
        /// 엑셀 파일에 컬럼명 포함 여부(기본값: 포함)
        /// 엑셀 데이터셋
        public static DataSet GetDataSetFromExcelFile(System.Web.UI.HtmlControls.HtmlInputFile hif, bool IsIncludeHeader)
        {
            return GetDataSetFromExcelFile(hif, "Sheet1", IsIncludeHeader);
        }

        ///


        /// 엑셀로부터 데이터를 추출하여 DataSet으로 반환한다.
        ///

        /// 업로드할 엑셀 파일
        /// 업로드할 엑셀 파일내의 워크 쉬트명(기본값:Sheet1)
        /// 엑셀 파일에 컬럼명 포함 여부(기본값: 포함)
        /// 엑셀 데이터셋
        public static DataSet GetDataSetFromExcelFile(System.Web.UI.HtmlControls.HtmlInputFile hif, string WorkSheet, bool IsIncludeHeader)
        {
            string FilePath = Upload(hif);
            string ConnectionString1 = string.Empty;
            string excelConnStrFormat = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" + FilePath + ";Extended Properties=\"Excel 8.0;HDR={0}\"";

            if(IsIncludeHeader == true)
                ConnectionString1 = string.Format(excelConnStrFormat, "YES");
            else
                ConnectionString1 = string.Format(excelConnStrFormat, "NO");

            OleDbConnection conn = new OleDbConnection(ConnectionString1);

            string strQuery;
            strQuery = "select * from [" + WorkSheet + "$]";
   
            OleDbCommand cmd = new OleDbCommand(strQuery, conn);
            OleDbDataAdapter Adapter = new OleDbDataAdapter();
            Adapter.SelectCommand = cmd;
            DataSet dsExcel = new DataSet();
            Adapter.Fill(dsExcel);

            return dsExcel;
        }

        ///


        /// 원하는 엑셀 파일의 원하는 워크쉬트를 지정한 DB의 테이블에 업로드한다.
        /// 이 경우 ht 파라미터를 통해 워크쉬트의 특정열을 테이블의 특정 컬럼에 매핑할 수 있다.
        /// 단, 이 경우 엑셀 파일의 컬럼에 대해서는 F1, F2, F3 ... 식으로 이름을 붙여야 한다.
        /// 그렇지 않고 Excel 커넥션 스트링의 HDR=YES로 설정하면 첫째 Row가 컬럼명으로 인식되게
        /// 할 수도 있다.
        ///

        /// 업로드할 엑셀 파일
        /// 업로드할 엑셀 파일내의 워크 쉬트명(기본값:Sheet1)
        /// 업로드할 DB 연결 문자열
        /// 업로드할 테이블명
        /// 엑셀 파일 컬럼명과 DB 테이블 컬럼명과의 매핑 정보
        /// 엑셀파일 DB업로드 성공 여부
        public static bool ExcelFileDBUpload(System.Web.UI.HtmlControls.HtmlInputFile hif, string WorkSheet, string ConnectionString, string Table, Hashtable ht)
        {
            return ExcelFileDBUpload(hif, WorkSheet, ConnectionString, Table, ht, true);
        }

        ///


        /// 원하는 엑셀 파일의 원하는 워크쉬트를 지정한 DB의 테이블에 업로드한다.
        /// 이 경우 ht 파라미터를 통해 워크쉬트의 특정열을 테이블의 특정 컬럼에 매핑할 수 있다.
        /// 단, 이 경우 엑셀 파일의 컬럼에 대해서는 F1, F2, F3 ... 식으로 이름을 붙여야 한다.
        /// 그렇지 않고 Excel 커넥션 스트링의 HDR=YES로 설정하면 첫째 Row가 컬럼명으로 인식되게
        /// 할 수도 있다.
        ///

        /// 업로드할 엑셀 파일
        /// 업로드할 DB 연결 문자열
        /// 업로드할 테이블명
        /// 엑셀 파일 컬럼명과 DB 테이블 컬럼명과의 매핑 정보
        /// 엑셀파일 DB업로드 성공 여부
        public static bool ExcelFileDBUpload(System.Web.UI.HtmlControls.HtmlInputFile hif, string ConnectionString, string Table, Hashtable ht)
        {
            return ExcelFileDBUpload(hif, "Sheet1", ConnectionString, Table, ht, true);
        }

        ///


        /// 원하는 엑셀 파일의 원하는 워크쉬트를 지정한 DB의 테이블에 업로드한다.
        /// 이 경우 ht 파라미터를 통해 워크쉬트의 특정열을 테이블의 특정 컬럼에 매핑할 수 있다.
        /// 단, 이 경우 엑셀 파일의 컬럼에 대해서는 F1, F2, F3 ... 식으로 이름을 붙여야 한다.
        /// 그렇지 않고 Excel 커넥션 스트링의 HDR=YES로 설정하면 첫째 Row가 컬럼명으로 인식되게
        /// 할 수도 있다.
        ///

        /// 업로드할 엑셀 파일
        /// 업로드할 DB 연결 문자열
        /// 업로드할 테이블명
        /// 엑셀 파일 컬럼명과 DB 테이블 컬럼명과의 매핑 정보
        /// 엑셀 파일에 컬럼명 포함 여부(기본값: 포함)
        /// 엑셀파일 DB업로드 성공 여부
        public static bool ExcelFileDBUpload(System.Web.UI.HtmlControls.HtmlInputFile hif, string ConnectionString, string Table, Hashtable ht, bool IsIncludeHeader)
        {
            return ExcelFileDBUpload(hif, "Sheet1", ConnectionString, Table, ht, IsIncludeHeader);
        }

        ///


        /// 원하는 엑셀 파일의 원하는 워크쉬트를 지정한 DB의 테이블에 업로드한다.
        /// 이 경우 ht 파라미터를 통해 워크쉬트의 특정열을 테이블의 특정 컬럼에 매핑할 수 있다.
        /// 단, 이 경우 엑셀 파일의 컬럼에 대해서는 F1, F2, F3 ... 식으로 이름을 붙여야 한다.
        /// 그렇지 않고 Excel 커넥션 스트링의 HDR=YES로 설정하면 첫째 Row가 컬럼명으로 인식되게
        /// 할 수도 있다.
        ///

        /// 업로드할 엑셀 파일
        /// 업로드할 엑셀 파일내의 워크 쉬트명(기본값:Sheet1)
        /// 업로드할 DB 연결 문자열
        /// 업로드할 테이블명
        /// 엑셀 파일 컬럼명과 DB 테이블 컬럼명과의 매핑 정보
        /// 엑셀 파일에 컬럼명 포함 여부(기본값: 포함)
        /// 엑셀파일 DB업로드 성공 여부
        public static bool ExcelFileDBUpload(System.Web.UI.HtmlControls.HtmlInputFile hif, string WorkSheet, string ConnectionString, string Table, Hashtable ht, bool IsIncludeHeader)
        {

            //   dsExcel = SqlHelper.ExecuteDataset(ConnectionString1, CommandType.Text, strQuery);
            //   SqlHelper.FillDataset(ConnectionString1, CommandType.Text, strQuery, dsExcel, Table);

            DataSet dsExcel = GetDataSetFromExcelFile(hif, WorkSheet, IsIncludeHeader);

            string ConnectionString2 = ConnectionString;
            SqlConnection conn2 = new SqlConnection(ConnectionString2);
            string strQuery2;
            strQuery2 = "select * from " + Table;
            SqlCommand cmd2 = new SqlCommand(strQuery2, conn2);
            SqlDataAdapter adpt = new SqlDataAdapter();
            adpt.SelectCommand = cmd2;
   
            SqlCommandBuilder custCB = new SqlCommandBuilder(adpt);

            DataSet dsDB = new DataSet();
            adpt.FillSchema(dsDB, SchemaType.Mapped);
   
            foreach(DataRow excelRow in dsExcel.Tables[0].Rows)
            {
                DataRow dbRow = dsDB.Tables[0].NewRow();
                foreach(string excelCol in ht.Keys)
                {
                    string DBCol = ht[excelCol].ToString();
                    dbRow[DBCol] = excelRow[excelCol];
                }
                dsDB.Tables[0].Rows.Add(dbRow);
            }

            DataSet dsUpload = dsDB.GetChanges();
            int result = adpt.Update(dsUpload);
            if(dsUpload.Tables[0].Rows.Count == result)
                return true;
            else
                return false;

        }
        #endregion
  
        #region 엑셀 파일 Download
        ///


        /// 생성된 엑셀 파일을 다운로드를 수행하는 로직
        ///

        /// 저장된 엑셀파일의 다운로드를 요청한 페이지
        /// 다운로드시 보여줄 엑셀파일 경로명과 파일명
        /// 서버에 저장된 임시 엑셀파일 경로명과 파일명
        private static void Download(Page downloadPage, string excelfile, string tempSavedFileName)
        {
            using(System.Web.UI.Page dp = downloadPage)
            {
                FileInfo fi = new FileInfo(tempSavedFileName);
                AddExportedFileName(fi);
                dp.Response.Clear();
                dp.Response.AddHeader("Content-Disposition", "attachment; filename=" + Path.GetFileName(excelfile));
                dp.Response.AddHeader("Content-Length", fi.Length.ToString());
                dp.Response.ContentType = "application/vnd.ms-exce";
                dp.Response.Charset = "";
                dp.EnableViewState = false;
                dp.Response.CacheControl = "public";
                dp.Response.WriteFile(fi.FullName);
                dp.Response.End();
            }
        }

        ///


        /// 생성된 엑셀 파일을 다운로드를 수행하는 로직
        ///

        /// 저장된 엑셀파일의 다운로드를 요청한 페이지
        /// 다운로드시 보여줄 엑셀파일 경로명과 파일명
        private static void Download(Page downloadPage, string excelfile)
        {
            using(System.Web.UI.Page dp = downloadPage)
            {
                FileInfo fi = new FileInfo(excelfile);
                dp.Response.Clear();
                dp.Response.AddHeader("Content-Disposition", "attachment; filename=" + Path.GetFileName(excelfile));
                dp.Response.AddHeader("Content-Length", fi.Length.ToString());
                dp.Response.ContentType = "application/vnd.ms-exce";
                dp.Response.Charset = "";
                dp.EnableViewState = false;
                dp.Response.CacheControl = "public";
                dp.Response.WriteFile(fi.FullName);
                dp.Response.End();
            }
        }
        #endregion

        #region 엑셀 파일 Upload
        private static string Upload(System.Web.UI.HtmlControls.HtmlInputFile hif)
        {

            if(hif.PostedFile.FileName.Length == 0)
            {
                throw new Exception("업로드할 파일이 없습니다.");
            }
            if(hif.PostedFile.ContentLength == 0)
            {
                throw new Exception("업로드할 파일의 크기가 0바이트입니다.");
            }

            string UploadPath = Path.GetTempPath();
   
            if(hif.PostedFile != null)
            {
                string fileName = Path.GetFileName(hif.PostedFile.FileName.ToString());
                string uniqueFilePath = GetUniqueFileNameWithPath(UploadPath, fileName);
                hif.PostedFile.SaveAs(uniqueFilePath);
                return uniqueFilePath;
            }
            else
            {
                throw new ApplicationException("업로드할 파일이 없습니다.");
            }
        }

        private static string GetUniqueFileNameWithPath(string dirPath, string fileN)
        {
            string fileName = fileN;

            int indexOfDot = fileName.LastIndexOf(".");
            string strName = fileName.Substring(0, indexOfDot);
            string strExt = fileName.Substring(indexOfDot+1);

            bool bExist = true;
            int fileCount = 0;

            while(bExist)
            {
                if(File.Exists(Path.Combine(dirPath, fileName)))
                {
                    fileCount++;
                    fileName = strName + "(" + fileCount + ")." +strExt;
                }
                else
                {
                    bExist = false;
                }
            }

            return Path.Combine(dirPath, fileName);
        }
        #endregion
    }
}

반응형

댓글