본문 바로가기
개발언어/C#

[C#] Excel 파일을 읽는 방법

by 창용이랑 2022. 9. 27.
728x90

1. Microsoft.Office.Interop.Excel 참조 준비 (Nuget 패키지 다운)

 

NuGet Packages를 다운받을 수 있다.
검색해서 다운

 

 

 

이제 C#에서 Excel을 불러오고, 쓰는 것이 가능하다.

 

 

 

2. File Path 입력 추가

 

Excel 파일을 읽기 전에 App에서 Excel파일의 경로를 알아야 불러올 수 있습니다.

간단한 Textbox와 Button을 넣어서 File Path를 불러올 수 있도록 준비합니다.

 

 

Design 모드로 편집하면 간단하게 만들 수 있습니다.

 

 

디자인 모드에서 버튼을 더블 클릭하면 button1_Click() 이라는 함수가 자동으로 생성 됩니다.

거기서 아래와 같이 코드를 추가합니다.

 

private void button1_Click(object sender, EventArgs e)
{
    OpenFileDialog OFD = new OpenFileDialog();
    if (OFD.ShowDialog() == DialogResult.OK)
    {
        richTextBox1.Clear();
        richTextBox1.Text = OFD.FileName;
    }
}

 

기본 템플릿에 합친 모습은 다음과 같습니다.

 

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace WindowsFormsApplication1
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        private void button1_Click(object sender, EventArgs e)
        {
            OpenFileDialog OFD = new OpenFileDialog();
            if (OFD.ShowDialog() == DialogResult.OK)
            {
                richTextBox1.Clear();
                richTextBox1.Text = OFD.FileName;
            }
        }
    }
}

여기까지 한다음 빌드를 해서 Browse 버튼을 눌러보면 아래와 같이 파일을 선택할 수 있습니다.

 

 

 

 

파일을 선택하게 되면 해당 파일의 path가 Textbox에 표시됩니다.

 

 

 

3. Excel 파일 읽기

Read 버튼을 눌렀을 경우 Excel file path에 따라 파일을 읽어 richTextBox 에 출력해 보겠습니다.

Microsoft.Office.Interop.Excel.Application application = new Microsoft.Office.Interop.Excel.Application();
Workbook workbook = application.Workbooks.Open(Filename: @filePath);
Worksheet worksheet1 = workbook.Worksheets.get_Item("member");
application.Visible = false;

상기 구문을 통해 Excel 실행 -> worksheet 불러오기가 가능해집니다.

sheet까지 골랐다면 이제 추출할 범위를 정해주어야 합니다.

저의 경우는 data가 있는 범위에서 data를 모두 가져오고 싶었기 때문에 범위를 아래와 같이 설정해주었습니다.

Range range = worksheet1.UsedRange;
그리고 각 행열을 돌아다니면서 value를 수집하고, 원하는 형태로 가공하여 출력하였습니다.
String data = "";

for (int i = 1; i <= range.Rows.Count; ++i)
{
   for (int j = 1; j <= range.Columns.Count; ++j)
   {
      data += ((range.Cells[i, j] as Range).Value2.ToString() + " ");
   }
   data += "\n";
}

C#에서 Excel을 불러오고, 사용하였다면 항상 마지막에는 release 시켜 주어야 합니다.

private void DeleteObject(object obj) {
   try {
       System.Runtime.InteropServices.Marshal.ReleaseComObject(obj);
       obj = null;
   } catch (Exception ex) {
       obj = null;
       MessageBox.Show("메모리 할당을 해제하는 중 문제가 발생하였습니다." + ex.ToString(), "경고!");
   } finally {
       GC.Collect();
   }
}

여기까지 코드를 모두 합치면 아래와 같은 모습이 됩니다.

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using Microsoft.Office.Interop.Excel;

namespace WindowsFormsApplication1
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }


        private string filePath = "";


        private void button1_Click(object sender, EventArgs e)
        {
            OpenFileDialog OFD = new OpenFileDialog();
            if (OFD.ShowDialog() == DialogResult.OK)
            {
                richTextBox1.Clear();
                richTextBox1.Text = OFD.FileName;
                filePath = OFD.FileName;
            }
        }

        private void button2_Click(object sender, EventArgs e)
        {
            if (filePath != "")
            {
                Microsoft.Office.Interop.Excel.Application application = new Microsoft.Office.Interop.Excel.Application();
                Workbook workbook = application.Workbooks.Open(Filename: @filePath);
                Worksheet worksheet1 = workbook.Worksheets.get_Item("member");
                application.Visible = false;
                Range range = worksheet1.UsedRange;
                String data = "";

                for (int i = 1; i <= range.Rows.Count; ++i)
                {
                    for (int j = 1; j <= range.Columns.Count; ++j)
                    {
                        data += ((range.Cells[i, j] as Range).Value2.ToString() + " ");
                    }
                    data += "\n";
                }

                
                richTextBox2.Text = data;
                
                DeleteObject(worksheet1);
                DeleteObject(workbook);
                application.Quit();
                DeleteObject(application);
            }
        }

        private void DeleteObject(object obj) {
            try {
                System.Runtime.InteropServices.Marshal.ReleaseComObject(obj);
                obj = null;
            } catch (Exception ex) {
                obj = null;
                MessageBox.Show("메모리 할당을 해제하는 중 문제가 발생하였습니다." + ex.ToString(), "경고!");
            } finally {
                GC.Collect();
            }
        }
    }
}

 

결과 화면

 

 

특정 Cell만 Read 하는 방법

Microsoft.Office.Interop.Excel.Application application = new 
Microsoft.Office.Interop.Excel.Application();

Workbook workbook = application.Workbooks.Open(Filename: @filePath);
Worksheet worksheet1 = workbook.Worksheets.get_Item("member");
application.Visible = false;

Range startRange = worksheet1.Cells[12, 3];
Range endRange = worksheet1.Cells[14, 6];

Range range = worksheet1.get_Range(startRange,endRange);
object[,] rawData = range.Value;

String data = "";


for (int i = 1; i <= rawData.GetLength(0); ++i)
{
    for (int j = 1; j <= rawData.GetLength(1); ++j)
    {
        if (rawData[i, j] == null) continue;
        data += (rawData[i,j].ToString() + " ");
    }
    data += "\n";
}

 

출처 : https://kwanghyuk.tistory.com/167