티스토리 뷰
목차
C# 엑셀 읽기 오류, MS오피스 설치 없이 DataTable 이용
회사에서 사용하는 컴퓨터에서 고갱님께 드릴 프로그램을 만드는 중 연동 에러가 발생했습니다. 제 컴퓨터에선 잘 되는데 고갱님 PC에선 오류가 발생하는 것이죠. (결론부터 말씀드리면, DataTable 사용하세요)
C# 엑셀 읽기 에러 메시지
80040154 클래스가 등록되지 않았습니다. (예외가 발생한 HRESULT: 0x80040154 (REGDB_E_CLASSNOTREG)) 오류로 인해 CLSID가 {...}인 구성 요소의 COM 클래스 팩터리를 검색하지 못했습니다.
[C# Excel Read Open Error]
C# 엑셀 읽기 에러가 발생한 라이브러리
- mscorlib
[C# Excel Read Open Error]
이 에러는 C# 엑셀 객체를 만드는 시점에 발생합니다.
아래 코드처럼 new를 사용하는 순간 오류가 발생하는 것이죠.
1 | Excel.Application app = new Excel.Application(); | cs |
왜 에러가 발생하는지 몰랐는데, 알고 봤더니 이유는 간단했습니다.
MS 오피스가 설치되어 있지 않은 PC에서는 위 소스를 사용할 수 없다. C# 엑셀 객체는 생성할 수 없다.
『고객님 PC에 MS 오피스가 설치되어 있지 않았던 것이 원인』이었습니다.
그럼 MS 오피스가 없는 PC에 C# Excel 연동 프로그램은 어떻게 만들어야 할까? 제가 알아본 해결책은 3가지입니다.
C# 엑셀 읽기 오류 해결 - MS오피스 설치 없이 ~!!
- OLE DB 형태로 소스를 다시 작성
- xlsx 확장자를 zip으로 변경 -> 압축 해제 -> xml 파일들을 읽기
- DataTable 사용
[C# Excel Read Open Error]
문제는 1, 2번은 완벽한 해결책이라 할 수 없습니다.
- 1. OLE DB 형태로 소스를 작성하려면 버전을 꼭 맞춰줘야 하기에 환경 설정 구현에 손이 많이 간다.
- 배보다 배꼽이 큰 경우가 발생할 수 있으며, 소스 재사용성이 떨어집니다. 왜냐면 여기서 되던 소스가 OLE DB 버전 때문에 호환이 안 되는 경우도 있습니다.
- 2. 확장자를 zip로 강제 변경할 경우 오류가 발생할 가능성이 있다.
- 압축 파일 자체에 오류가 생길 가능성이 있어 강제 변환은 추천할 수 없습니다.
제가 생각하기에 가장 좋은 방법은 DataTable로 구현하는 겁니다.
DataTable은 버전의 영향도 받지 않고 내가 원하는 형태로 자유롭게 테이블을 꾸밀 수 있습니다. 굳이 C# 엑셀이 아니어도 일반적으로 사용할 수 있으며, 확장성이 좋아 Excel과도 연동할 수 있는 것이죠.
그래서 저와 비슷한 문제를 겪고 있으시다면 아래 사이트를 참조해 주세요.
정말 좋은 예제가 담겨 있는 글입니다. C# 엑셀 읽기 오류, MS 오피스 설치 없이 해결하는 방법입니다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | public DataTable readCSV(string filePath) { var dt = new DataTable(); // Creating the columns File.ReadLines(filePath).Take(1) .SelectMany(x => x.Split(new[] { ';' }, StringSplitOptions.RemoveEmptyEntries)) .ToList() .ForEach(x => dt.Columns.Add(x.Trim())); // Adding the rows File.ReadLines(filePath).Skip(1) .Select(x => x.Split(';')) .ToList() .ForEach(line => dt.Rows.Add(line)); return dt; } | cs |
- Take : 가져올 개수,
- Skip : 앞에서 몇 개나 가져올지를 설정하는 함수입니다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 | public DataTable readCSV(string filePath) { var dt = new DataTable(); // Creating the columns foreach(var headerLine in File.ReadLines(filePath).Take(1)) { foreach(var headerItem in headerLine.Split(new[] { ';' }, StringSplitOptions.RemoveEmptyEntries)) { dt.Columns.Add(headerItem.Trim()); } } // Adding the rows foreach(var line in File.ReadLines(filePath).Skip(1)) { dt.Rows.Add(x.Split(';')); } return dt; } | cs |
소스를 잘 살펴보면 어디에도 구속되지 않음을 알 수 있습니다. 즉, 자유로운 연동 가능합니다.
C#, 닷넷 프레임워크에서 사용할 수 있는 기본 클래스를 이용해 C# 엑셀 파일을 무리 없이 읽어올 수 있습니다. 얼마 전 까지 C#에서 엑셀을 사용할 때 무조건 Excel을 참조 추가했는데, 이젠 그럴 필요가 없네요.
어떤 경우든 DataTable을 이용해 Excel을 비롯한 각종 파일을 읽는 것이 좋겠다는 생각이 듭니다. 어디에도 구속되지 않고 자유롭게 원하는 형태로 가공할 수 있는 DataTable 이용하는 것이 합리적이네요.
C# 엑셀 읽기 오류, MS오피스 설치 없이 DataTable 이용
written by vicddory