엑셀_2

ASP.NET 2005. 4. 27. 22:25

여러 방법으로 엑셀로 SQL 데이터를 보낼 수 있겠지만...

질문 내용만 가지고 말씀드리면....

1)엑셀은 OleDb를 사용한다.

전에 민범규님이 잘 답변해드렸던데...

Sql 데이터는 SqlClient로 이용하지만

엑셀마저 SqlClient로 바꾸셨군요.

엑셀을 ADO.NET으로 처리하려면

SqlClient를 사용하면 안됩니다.

OleDb를 이용하십시오.

2) ADO.Net을 이용하여 시트를 추가한다.

시트를 추가하기위해 굳이 자동화를 통해 추가하지 마시고....

ADO.NET을 통해 시트를 추가하십시오.

시트는 하나의 테이블입니다.

따라서 CRETE TABLE sql 구문을 이용하시면 간단히 추가됩니다.

(기타 DROP... ALTER... 구문도 사용가능...)

다음과 같이 하면 연결된 엑셀 파일의 워크북에 [Test]라는 엑셀 시트가 하나 추가됩니다.

예외처리는 직접 하시고....

// 파일을 새로 만들려면 기존 파일을 삭제하고

string xls = "D:\\myExcel.xls";

    if (Systtem.IO.File.Exists(xls)

    {

    Systtem.IO.File.Delete(xls);

    }

string strConn="Provider=Microsoft.Jet.OLEDB.4.0;" +

@"Data Source=D:\\myExcel.xls;Extended Properties=""Excel 8.0;HDR=YES""" ;

OleDbConnection connection = new OleDbConnection (strConn);

connectionn.Open();

// 기존 파일이 없으면 파일을 만들고 시트(테이블)를 추가한다.

string sql = "CREATE TABLE Test (ID char(50), Name char(255))";

OleDbCommand command = new OleDbCommand(sql , connection);

command.ExecuteNonQuery();

connectionn.Close();

3) 워크북에 해당 시트가 있는가 ?

OleDB로 엑셀 파일의 스키마를 읽어와서

스키마 테이블에서 시트이름과 컬럼이름을 얻어서 사용하십시오.

다음 코드를 참고하십시오.

폼에 데이터그리드를 2개 두시고 그 그리드에 스키마 정보를 읽어 들여서

그 스키마 정보가 어떻게 구성되었는가를 확인하시면

아이디어가 바로 떠오를 겁니다.

테이블(시트)이름은

string strCn = "Provider=Microsoft.Jet.OLEDB.4.0; " +

"Data Source=E:\\test.xls;Extended Properties=Excel 8.0";

OleDbConnection cn =new OleDbConnection(strCn);

cn.Open();

DataTable dtTables = cn.GetOleDbSchemaTable(OleDbSchemaGuid.Tables, new object[]{null,null,null,"TABLE"});

dataGrid1.DataSource = dtTables;

위에서 테이블(시트)이름을 얻은 후

테이블(시트) 이름을 가지고 컬럼(필드)이름을 얻을 수 있습니다.

DataTable dtColumns = cn.GetOleDbSchemaTable(OleDbSchemaGuid.Columns,new Object[]{null,null, <테이블이름>, null});

dataGrid2.DataSource = dtColumns;

레지스트리 경로와 파일이름 문제도 없는데...

테스트 해볼겸 간단하게 코딩 한건데....

private void button6_Click(object sender, System.EventArgs e)

{

System.Data.OleDb.OleDbConnection objConn;

try

{

objConn = new System.Data.OleDb.OleDbConnection(

"Provider=Microsoft.Jet.OLEDB.4.0;" +

@"Data Source=C:\test.xls;Extended Properties= " +" Excel 8.0;HDR=YES ;ReadOnly=0;");

objConn.Open();

string sql = "CREATE TABLE Test (ID char(50), Name char(255))";

OleDbCommand command = new OleDbCommand(sql , objConn);

command.ExecuteNonQuery();

objConn.Close();

}

catch(Exception ex)

{

MessageBox.Show(ex.Message);

}

}

이전 질문을 보면 잘 하셨던데 테스트 하시다가 실수하신 모양이네요...

      string strConn="Provider=Microsoft.Jet.OLEDB.4.0;" +

      @"Data Source=D:\\myExcel.xls;Extended Properties=""Excel 8.0;HDR=YES""" ;

다음 빨간색의 큰따옴표내의 큰따옴표는 큰따옴표를 겹쳐서 사용해야 하는데

그냥 작은 따옴표를 사용하는 것도 좋습니다.

objConn = new System.Data.OleDb.OleDbConnection(

"Provider=Microsoft.Jet.OLEDB.4.0;" +

@"Data Source=C:\test.xls;Extended Properties= ' Excel 8.0;HDR=YES ;ReadOnly=0;' ");

파일 업로드라면 정확히 무엇을 말씀하시는건지요?

엑셀파일로 데이타를 변환하는 것을 말하는 것인가요?

제 생각에는 이렇게 한번 해보세요...

ADO.NET을 이용하셔서...

Excel 파일을 OleDb로 연결을 하구요...

Excel의 데이타를 DataTable이나 DataSet으로 가지고 있다가...

INSERT할 DataBase를 연결하셔서...

DataTable이나 DataSet의 내용을 INSERT 하시면 될 것 같네요...

INSERT 하는 방법은 여러가지가 있겠죠...

루프를 돌면서 DataTable이나 DataSet의 데이타를 한건씩 INSERT 하는 방법이 있겠구요...

DataAdpater를 사용하여 임의의 DataSet에 INSERT할 Table의 데이타를 가져온 다음...

DataSet의 Merge() 메소드를 이용하여...

DB의 데이타와 Excel에서 가져온 데이타를 병합한 다음...

DataAdapter의 Update() 메소드를 호출하여 Update하는 방법이 있겠죠...

데이타를 INSERT할 경우...

Transaction을 신경써주셔야겠죠...

일단 엑셀개체를 생성하신 후

(이 부분을 모르신다면 '엑셀'로 검색하시면

엑셀파일을 열고 엑셀 개체를 생성하는 내용이 많이 있을 겁니다.

참고 하십시오.)

다음과 같이 해보십시오.

Excel.Application xlApp= new Excel.Application();

Excel.Workbooks xlBooks=xlApp.Workbooks;

Excel.Workbook xlBook=xlBooks.Open(

@"E:\test.xls",Missing.Value, Missing.Value,Missing.Value,

"", "", Missing.Value, Excel.XlPlatform.xlWindows,

Missing.Value, Missing.Value, Missing.Value,

Missing.Value, Missing.Value, Missing.Value, Missing.Value);

Excel.Sheets xlSheets =xlBook.Worksheets;

Excel.Worksheet xlSheet = (Excel.Worksheet) xlSheets.get_Item(1);

// UsedRange: 값이 들어있는 좌상단 셀에서부터 우하단 셀까지의 범위

int c = xlActiveSheet.UsedRange.Columns.Count;

int r = xlActiveSheet.UsedRange.Rows.Count;

MessageBox.Show("현재 데이터가 들어있는 범위의 행/열 수는 :" + r.ToString() + "/" + c.ToString());

// 눈으로 확인해본다.

// xlApp.Visible=true;

xlSheet.UsedRange.Select();

일단 엑셀개체를 생성하신 후

(이 부분을 모르신다면 '엑셀'로 검색하시면

엑셀파일을 열고 엑셀 개체를 생성하는 내용이 많이 있을 겁니다.

참고 하십시오.)

다음과 같이 해보십시오.

Excel.Application xlApp= new Excel.Application();

Excel.Workbooks xlBooks=xlApp.Workbooks;

Excel.Workbook xlBook=xlBooks.Open(

@"E:\test.xls",Missing.Value, Missing.Value,Missing.Value,

"", "", Missing.Value, Excel.XlPlatform.xlWindows,

Missing.Value, Missing.Value, Missing.Value,

Missing.Value, Missing.Value, Missing.Value, Missing.Value);

Excel.Sheets xlSheets =xlBook.Worksheets;

Excel.Worksheet xlSheet = (Excel.Worksheet) xlSheets.get_Item(1);

// UsedRange: 값이 들어있는 좌상단 셀에서부터 우하단 셀까지의 범위

int c = xlActiveSheet.UsedRange.Columns.Count;

int r = xlActiveSheet.UsedRange.Rows.Count;

MessageBox.Show("현재 데이터가 들어있는 범위의 행/열 수는 :" + r.ToString() + "/" + c.ToString());

// 눈으로 확인해본다.

// xlApp.Visible=true;

xlSheet.UsedRange.Select();

oledb나 odbc를 이용해서 연결설정하시면...

db다루듯이 사용가능합니다.

엑셀파일을 직접 핸들링하시려면...

http://msdn.microsoft.com/library/default.asp?url=/library/en-us/dnexcl2k2/html/odc_offcs.asp

여기를 참고해 보세요..

'ASP.NET' 카테고리의 다른 글

엑셀4  (0) 2005.04.27
엑셀 3  (0) 2005.04.27
엑셀 문제_1  (0) 2005.04.27
사용자 지정 데이터 바인딩  (0) 2005.03.18
보안 문제! ASP.NET 2.0으로 해결하세요!  (0) 2005.03.18
Posted by 퓨전마법사
,