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