2012-06-24 3 views
4

Excel 응용 프로그램 (Microsoft.Office.Interop.Excel)으로 * .htm 파일을 열었습니다. 그것은 훌륭하게 분석되었습니다! 그래서 나는 그것으로 일할 수있다. 속도를 더 높이려면 Excel 범위에서 데이터를 가져와 System.Array에 삽입하여 작업하려고합니다.C#/Excel : Excel 범위를 올바른 데이터 형식으로 배열로 변환

Excel.Range range = ExcelWorksheet.get_Range("A1", "H1500"); // get all values 
System.Array dataArray = (System.Array)(range.Cells.Value2); // insert into array 

데이터 유형에 문제가 있습니다. 엑셀 셀은 시간 또는 날짜 형식이있는 경우, range.Cells.Value2 만든다 :
12.06.2012 (엑셀 셀 유형 - 일) 41072-
14시 48분 (엑셀 셀 유형 - 시간) 0,616666666666667에 나는 하나의 값 양식을 얻을 경우
엑셀 셀, 나는 (Cells.Text.ToString()로) 정확한 값을 얻을 :

ExcelWorksheet.get_Range("A1", "A1").Cells.Text.ToString() 

작업 : 할 또 다른 유형으로, 단지 텍스트처럼, 그들이 엑셀 시트에서 값을 얻을 필요가있다.
그리고 Excel 대신 나를 생각하고 싶지 않아 :)

답변

4

왜 반환 된 값을 필요한 형식으로 변환하지 않습니까? DateTime의 FromOADate 메서드는이를 위해 설계되었습니다 (http://msdn.microsoft.com/en-us/library/1ad4d8d6(v=vs.80).aspx 참조). 예를 들어, 반환 된 시간 값은 우리 시대의 분수 부분을 나타냅니다. 따라서 다음 예제는 "14:48"을 출력합니다 :

double oleDateTime = 0.616666666666667; 
DateTime dt = DateTime.FromOADate(oleDateTime); 
string time = dt.ToString("H:mm"); 
Console.WriteLine(time); 

최대 값까지 동일한 접근법을 사용할 수 있습니다. 유일한 차이점은 Excel (double)의 값이 날짜 부분 (시간뿐 아니라)을 포함하기 때문에 0보다 큰 값이라는 사실입니다. "12.06.2012"을 얻을 것입니다 다음 :

dt = DateTime.FromOADate(41072); 
string date = dt.ToString("dd.MM.yyyy"); 
Console.WriteLine(date); 

더, 당신은 날짜와 시간을 처리하는 경우에 (반환 엑셀 값이 0보다 큰 경우) 설명하기 위해, 다음을 얻을 것 "6/12/2012 오후 2시 48분 0초 "

dt = DateTime.FromOADate(41072.616666666666667); 
Console.WriteLine(dt.ToString()); 
+1

물론 당신 말이 맞습니다. 배열을'System.Array dataArray = (System.Array) (range.Cells.Value2)'로 변환하면 배열의 객체 셀 ('object [,] dataArray'와 동일)은 기본 데이터 셀의 데이터 형식입니다. 그래서 데이터 배열의 셀이 과 같은 datetime 타입인지 알 수 있습니다. 위의 액션을 수행 할 수 있습니다. (dataArray.GetValue (1,1) is DateTime) 나는이 문제를 다음과 같이 해결했다 : 'object [,] dataArray = (object [,]) range.get_Value (Excel.XlRangeValueDataType.xlRangeValueDefault);'. DataTime 값은 '2012-06-01 0:00:00'과 같습니다. 그들과 함께 일하는 것도 가능합니다. –

0

사용하면 Excel 파일에 표시/볼을 정확히 읽으려면이 방법.

Excel.Range range = workSheet.get_Range("A1", "D4"); 

int totalRows = range.Rows.Count; 
int totalColumns = range.Columns.Count; 
for (int rowCounter = 1; rowCounter <= totalRows; rowCounter++) 
{ 
    for (int colCounter = 1; colCounter <= totalColumns; colCounter++) 
    { 
    var cellVal = workSheet.Cells[rowCounter, colCounter]; 
    var val = cellVal.Text; 
    } 
} 
+3

이 방법은 Excel 범위의 값을 배열로 가져 오는 것과 비교하여 셀별로 값을 읽는 중 ... – sergeidave

관련 문제