C# 에서 Excel 파일을 읽는 방법
2019. 9. 17. 00:21ㆍ개발/C#
반응형
1. Microsoft.Office.Interop.Excel 참조 준비 (Nuget 패키지 다운)
이제 C#에서 Excel을 불러오고, 쓰는 것이 가능하다.
2. File Path 입력 추가
Excel 파일을 읽기 전에 App에서 Excel파일의 경로를 알아야 불러올 수 있습니다.
간단한 Textbox와 Button을 넣어서 File Path를 불러올 수 있도록 준비합니다.
디자인 모드에서 버튼을 더블 클릭하면 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";
}
반응형