C# Excel 파일 Control (open, save, write) 하기 (1)
2023. 3. 30. 17:52ㆍ개발 일기/C#
<프로그램 목적>
: 엑셀의 마우스로 활성화(선택) 한 곳에, 특정 데이터 값을 지속적으로 쓰는 것
(실제로는 센서를 연결하지만, 카운트 값으로 대체하였음)
*** 엑셀 라이센스 필요한 방법입니다. ***
* 엑셀 라이센스 없이 열어서 데이터를 쓰고 싶다면 → https://reta98.tistory.com/22
특징 정리
- C#에서 엑셀 파일을 직접 담아 접근하는 방법이다.
- 해당 엑셀 파일에 동시 접속이 불가하기 때문에 같은 파일을 열면 [읽기모드]로 막힐 수 있다.
(파일 입출력을 안다면 당연한 말!) - 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
2. 마우스로 클릭할때마다 Count 값 입력
3. Save도 있기는 한데 저한테는 지금 필요한 부분이 아니라서 생략하겠습니다.
필요시 밑에 참고사이트 보고 진행해주세요!
참고 사이트: https://luckygg.tistory.com/324
'개발 일기 > C#' 카테고리의 다른 글
C# Excel에 값 쓰기(write) (2) / SendKeys 사용하기 (0) | 2023.03.31 |
---|