본문 바로가기
프로그래밍/C#

[C#] 엑셀 읽기

by JR2 2021. 3. 19.

엄청난 삽질끝에 얻어내게 된 소스코드이다.

 

왜 내 컴퓨터만 안될까!! 그건 바로 꾸져서 그렇다.

 

버전을 먼저 알려줘야할 것 같다.

 

visual studio : Microsoft Visual Studio Community 2019
버전 16.9.2

 

Excel : 2013

 

 

1. 우선 프로젝트 오른쪽 클릭 -> 추가 -> COM 참조 -> Microsoft Excel 15.0 Object Library를 추가한다.

 

2. 프로젝트 우클릭 -> 속성 -> .NET 5.0으로 설정한다. (3.1로 설정되어 있어서 삽질함)

 

3. 2개의 Textbox, Button 을 만든다.

대충

 

 

4. 소스코드를 입력한다.

                Excel.Application application = new Excel.Application(); // application이라는 이름으로 추가
                Excel.Workbook workbook = application.Workbooks.Open(Filename: @filePath); // workbook 열기
                Excel.Worksheet worksheet1 = (Excel.Worksheet)workbook.Worksheets.get_Item("sheet1"); // worksheet 열기(sheet1)
                application.Visible = false; // background에서 실행
                Excel.Range range = worksheet1.UsedRange; // row, col 사용중인 범위를 전부 다 받아서 출력할거임
                String data = "";

                for (int i = 1; i <= range.Rows.Count; ++i) // A1~사용하는곳 까지
                {
                    for (int j = 1; j <= range.Columns.Count; ++j)
                    {
                        //try
                        //{
                        //    data += ((range.Cells[i, j] as Excel.Range).Value2.ToString() + " "); //string으로 바꿔서 Data에 추가.
                        //}
                        //catch (Exception exc) { } // 근데 만약, NULL값이 읽힐경우 에러가 나기때문에 예외처리

                        data += Convert.ToString(range.Cells[i, j].value2); // 인터넷보고 적은 소스코드. Null이라도 에러가 안나더라
                    }
                    data += "\n"; // 줄바꿈 하려고 적었는데, 실제로는 안됨..
                }

 

엑셀파일은 아래에서 받을 수 있다.

 

그리고 DeleteObject가 필수라고 한다.

아니면 백그라운드에서 계속 실행된다고 한다. ㄷㄷ

 

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 Excel = 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)
            {
                textBox1.Clear();
                textBox1.Text = OFD.FileName;
                filePath = OFD.FileName;
            }
        }

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

                for (int i = 1; i <= range.Rows.Count; ++i)
                {
                    for (int j = 1; j <= range.Columns.Count; ++j)
                    {
                        //try
                        //{
                        //    data += ((range.Cells[i, j] as Excel.Range).Value2.ToString() + " ");
                        //}
                        //catch (Exception exc) { }

                        data += Convert.ToString(range.Cells[i, j].value2);
                    }
                    data += "\n";
                }


                textBox2.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();
            }
        }

        private void Form1_Load(object sender, EventArgs e)
        {

        }
    }
}

전체 소스코드이다.

 

test.zip
1.60MB
통합 문서1.xlsx
0.01MB

 

이렇게 하면 엑셀 읽을 수 있다.. 드디어 내 컴퓨터에서..

 

legacy.tistory.com/99

s00741.tistory.com/entry/c-EXCEL-%ED%8C%8C%EC%9D%BC-%EC%9D%BD%EA%B8%B0

kwanghyuk.tistory.com/167

'프로그래밍 > C#' 카테고리의 다른 글

[C#] 문자열 비교방법  (0) 2021.03.21
[C#] 구조체 변수, 구조체 배열 사용법  (0) 2021.03.21
[C#] Form Closed, Closing 설정방법  (0) 2021.03.17
[C#] 클립보드  (0) 2021.03.17
[C#] 문자열 나누기 Split  (0) 2021.03.17

댓글