C# Excel 파일 Control (open, save, write) 하기 (1)

2023. 3. 30. 17:52개발 일기/C#

<프로그램 목적>
: 엑셀의 마우스로 활성화(선택) 한 곳에, 특정 데이터 값을 지속적으로 쓰는 것
(실제로는 센서를 연결하지만, 카운트 값으로 대체하였음)

*** 엑셀 라이센스 필요한 방법입니다. ***

* 엑셀 라이센스 없이 열어서 데이터를 쓰고 싶다면 → https://reta98.tistory.com/22 

특징 정리
  1. C#에서 엑셀 파일을 직접 담아 접근하는 방법이다.
  2. 해당 엑셀 파일에 동시 접속이 불가하기 때문에 같은 파일을 열면 [읽기모드]로 막힐 수 있다.
    (파일 입출력을 안다면 당연한 말!)
  3. Excel 라이센스가 없다면 일부 이상 동작이 불가능하다.
    (에러코드: System.Runtime.InteropServices.COMException: '예외가 발생한 HRESULT: 0x800AC472')

 

코드

* C#에서 엑셀  접근하는 방법(도구-Nuget)은 하단에 참고사이트 참고하세요!

using System;
using System.Windows.Forms;

using Microsoft.Office.Interop.Excel;
using System.Runtime.InteropServices;

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

		Microsoft.Office.Interop.Excel.Application application = null;
		Workbook workBook = null;

		int cnt = -1;
		int before_column = 0, before_row = 0;

		private void btn_Open_Click(object sender, EventArgs e)
		{
			try
			{
				OpenFileDialog dlg = new OpenFileDialog();
				if (dlg.ShowDialog() != DialogResult.OK)
					return;

				//Excel 프로그램 실행
				application = new Microsoft.Office.Interop.Excel.Application();
				//Excel 화면 띄우기 옵션
				application.Visible = true;
				//파일로부터 불러오기
				workBook = application.Workbooks.Open(dlg.FileName);

				tm.Start();
			}
			catch (Exception exc)
			{
				MessageBox.Show(exc.Message);
			}
		}

		private void ReleaseExcelObject(object obj)
		{
			try
			{
				if (obj != null)
				{
					Marshal.ReleaseComObject(obj);
					obj = null;
				}
			}
			catch (Exception ex)
			{
				obj = null;
				throw ex;
			}
			finally
			{
				GC.Collect();
			}
		}

		private void btn_Save_Click(object sender, EventArgs e)
		{
			Microsoft.Office.Interop.Excel.Application application = null;
			Workbook workBook = null;

			try
			{
				SaveFileDialog dlg = new SaveFileDialog();
				dlg.Filter = "xlsx files|*.xlsx";
				if (dlg.ShowDialog() != DialogResult.OK)
					return;

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

				//Workbook 생성
				workBook = application.Workbooks.Add();
				//특정 경로에 엑셀 파일로 저장
				workBook.SaveAs(dlg.FileName, XlFileFormat.xlWorkbookDefault);
			}
			catch (Exception exc)
			{
				MessageBox.Show(exc.Message);
			}
			finally
			{
				workBook.Close(true);
				application.Quit();

				ReleaseExcelObject(workBook);
				ReleaseExcelObject(application);
			}
		}

        private void btn_getCursor_Click(object sender, EventArgs e)
		{
			input_value();
		}

		private void input_value()
        {
            before_column = application.ActiveCell.Column;
            before_row = application.ActiveCell.Row;

			if (cnt < 0) { cnt++; return; }	// 첫 실행에 값 넣는 것 막기

			txt_Test.Text += before_row.ToString() + ", " + before_column.ToString() + "\r\n";

            Range cell2 = application.Cells[before_row, before_column];
            cell2.Value = cnt++.ToString();    // 해결 : 라이센스 등록 후 실행 시 정상작동 한다고 함.
        }

		private void btn_close_Click(object sender, EventArgs e)
		{
			tm.Stop();

            //변경점 저장하면서 닫기
            workBook.Close(true);
            //Excel 프로그램 종료
            application.Quit();
            //오브젝트 해제
            ReleaseExcelObject(workBook);
            ReleaseExcelObject(application);

			this.Close();
        }

        private void tm_Tick(object sender, EventArgs e)
		{
            if (application.ActiveCell.Row != before_row || application.ActiveCell.Column != before_column)
            {
                input_value();
            }
		}
    }
}

 

동작

1. 프로그램 실행, 엑셀 파일 open

1. 프로그램 실행, 엑셀 파일 open

2. 마우스로 클릭할때마다 Count 값 입력

2. 마우스로 클릭할때마다 Count 값 입력

3. Save도 있기는 한데 저한테는 지금 필요한 부분이 아니라서 생략하겠습니다.

필요시 밑에 참고사이트 보고 진행해주세요!

 

2번 동작 gif

 

참고 사이트: https://luckygg.tistory.com/324

'개발 일기 > C#' 카테고리의 다른 글

C# Excel에 값 쓰기(write) (2) / SendKeys 사용하기  (0) 2023.03.31