엄청난 삽질끝에 얻어내게 된 소스코드이다.
왜 내 컴퓨터만 안될까!! 그건 바로 꾸져서 그렇다.
버전을 먼저 알려줘야할 것 같다.
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)
{
}
}
}
전체 소스코드이다.
이렇게 하면 엑셀 읽을 수 있다.. 드디어 내 컴퓨터에서..
s00741.tistory.com/entry/c-EXCEL-%ED%8C%8C%EC%9D%BC-%EC%9D%BD%EA%B8%B0
'프로그래밍 > 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 |
댓글