엑셀 파일 다운로드/업로드(소스)
// 프로그램설명 : 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 테이블 컬럼명과의 매핑 정보
///
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 테이블 컬럼명과의 매핑 정보
///
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 테이블 컬럼명과의 매핑 정보
/// 엑셀 파일에 컬럼명 포함 여부(기본값: 포함)
///
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 테이블 컬럼명과의 매핑 정보
/// 엑셀 파일에 컬럼명 포함 여부(기본값: 포함)
///
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
}
}
'IT-개발,DB' 카테고리의 다른 글
[asp.net] IIS 6 웹서버 설정예 (0) | 2010.10.28 |
---|---|
[개발] [asp.net 2.0] 비하인드코드에서 클라이언트 스크립트 사용하기 (0) | 2010.10.28 |
[개발] Javascript로 Excel파일 만들어보자 (0) | 2010.10.28 |
[개발] 웹 응용 프로그램에서 보다 효율적인 ASP.NET 파일 다운로드 구축 (0) | 2010.10.28 |
[개발] ASP.NET 페이지에 빌드 배너 추가 (0) | 2010.10.28 |
댓글