본문 바로가기
C++ 200제/코딩 IT 정보

C# 엑셀 읽기 오류, MS오피스 설치 없이 DataTable 이용

by vicddory 2019. 3. 20.

C# 엑셀 읽기 오류, MS오피스 설치 없이 DataTable 이용


회사에서 사용하는 컴퓨터에서 고갱님께 드릴 프로그램을 만드는 중 연동 에러가 발생했습니다. 제 컴퓨터에선 잘 되는데 고갱님 PC에선 오류가 발생하는 것이죠. (결론부터 말씀드리면, DataTable 사용하세요) 


C# 엑셀 읽기 에러 메시지


80040154 클래스가 등록되지 않았습니다. (예외가 발생한 HRESULT: 0x80040154 (REGDB_E_CLASSNOTREG)) 오류로 인해 CLSID가 {...}인 구성 요소의 COM 클래스 팩터리를 검색하지 못했습니다.



C# 엑셀 열기 오류, MS 오피스와 관계 (excel open 실패)[C# Excel Read Open Error]



C# 엑셀 읽기 에러가 발생한 라이브러리


  • mscorlib


C# ms 오피스 excel read[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오피스 설치 없이 ~!!

  1. OLE DB 형태로 소스를 다시 작성
  2. xlsx 확장자를 zip으로 변경 -> 압축 해제 -> xml 파일들을 읽기
  3. DataTable 사용



c# 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


C# 엑셀에서 제공하는 확장자 중 하나인 csv를 읽는 LINQ 소스입니다.

LINQ를 통해 ; 기준으로 단어를 나누고 칼럼에 추가합니다. 그리고 행도 마찬가지로 ; 를 기준으로 나눠 추가됩니다.

  • Take : 가져올 개수,
  • Skip : 앞에서 몇 개나 가져올지를 설정하는 함수입니다.


C# 엑셀 읽기 오류, MS오피스 설치 없이 DataTable 이용ms office worksheet read write


그리고 foreach로도 비슷하게 구현할 수 있습니다.

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

댓글