Posted
Filed under C#

[원문]

Excel 내용을 읽는 것을 하고 있는데

Excel. range범위를

range = ESheet.get_Range("A1", missing); //A1 셀 선택

range = range.get_Resize(5,5) // A1부터 5,5의 크기

이런 식으로 설정 해줘야 해서.

이런 식으로는 텍스트를 읽어 올 수 있는데

내가 모든 EXCEL 파일의 셀의 크기를 알 수 없어서

읽어 오는 파일 마다 셀의 크기가 다른데 그럴 땐 어떻게 해야 하나

하루 종일 찾았다 ㅜㅜ

(엑셀에서 셀이 만들어 질 수 있는 크기까지 찾아서 모든 크기안에 있는 내용을 찾으려고 했는데

데이터가 너무 커서 오버플로우 남 ㅋ 1048576 x 16384)

셀에 대한 메서드가 따로 있어서

range를 설정 해 줄때 사용된 범위에 있는 마지막 셀을 이용하여

아무 엑셀 파일을 선택하면 텍스트를 읽어 올 수 있게 설정해 주었다.

public string ReadExcel(string path)

{

string filename = path;// string filename = "C:\\test.xlsx";

object missing = System.Reflection.Missing.Value;

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

Excel.Workbook EBook;

Excel.Workbooks EBooks;

Excel.Sheets ESheets;

Excel._Worksheet ESheet;

Excel.Range range;

EApp.Visible = false;

// EApp.WindowState = Excel.XlWindowState.xlMinimized;

EBooks = EApp.Workbooks;

EBook = EApp.Workbooks.Open(filename, missing, missing, missing, missing, missing, missing

, missing, missing, missing, missing, missing, missing, missing, missing);

ESheets = EBook.Worksheets;

ESheet = (Excel._Worksheet)EBook.ActiveSheet;

ESheet = (Excel._Worksheet)ESheets.get_Item(1);

range = ESheet.get_Range("A1").SpecialCells(Excel.XlCellType.xlCellTypeLastCell);


long row = range.Row;

long column = range.Column;

String valueString = "";


for (long rowCounter = 1; rowCounter <= row; rowCounter++)

{

for (long colCounter = 1; colCounter <= column; colCounter++)

{

Excel.Range cell = (Excel.Range)ESheet.Cells[rowCounter, colCounter];


if (cell.Value == null)

valueString = string.Concat(valueString, " ");

else

{

valueString = string.Concat(valueString, cell.Value.ToString() + ",");

Console.Write(valueString);

}

textBox1.Text = valueString;

}

valueString = String.Concat(valueString,"\r\n");


}


================================================================================
저 위의 함수를 이용해서 그동안 엑셀을 읽어 왔는데,
데이터가 너무 클 경우에는 읽는 속도가 10분이 넘어감...ㅋㅋ( 2중 for문 때문인가ㅜㅜ )

그래서 새로운 방법을 알아 냄
DataTable을 이용하여서 DataTable에 값을 저장 -> 이 부분이 진짜 빠름

나는 필요한게 String 형이여서 row[Col].ToString()으로 변환 해준다

그래도 이전보다는 빨라졌당 1분 30초 정도


using System.Data.OleDb;


public string ReadExcel(string strFilePath)
{
// 엑셀 문서 내용 추출
object missing = System.Reflection.Missing.Value;
String valueString = "";
string strProvider = string.Empty;
strProvider = "Provider=Microsoft.ACE.OLEDB.12.0; Data Source=" + strFilePath + @";Extended Properties=Excel 12.0";
OleDbConnection excelConnection = new OleDbConnection(strProvider);
excelConnection.Open();
string strQuery = "SELECT * FROM [Sheet1$]";
OleDbCommand dbCommand = new OleDbCommand(strQuery, excelConnection);
OleDbDataAdapter dataAdapter = new OleDbDataAdapter(dbCommand);
DataTable dTable = new DataTable();
dataAdapter.Fill(dTable);
// dTable에 추출된 내용을 String으로 변환
foreach (DataRow row in dTable.Rows)
{
foreach (DataColumn Col in dTable.Columns)
{
valueString += row[Col].ToString() + " ";
}
}
dTable.Dispose();
dataAdapter.Dispose();
dbCommand.Dispose();
excelConnection.Close();
excelConnection.Dispose();
return valueString;
}







- 참고

NamedRange.SpecialCells 메서드

셀에 대한 내용
http://technet.microsoft.com/ko-kr/subscriptions/microsoft.office.tools.excel.namedrange.specialcells
2013/02/12 16:57 2013/02/12 16:57