728x90
반응형
WPF & C# - 엑셀 읽기 쓰기 ( Microsoft.Office.Interop.Excel ) |
Microsoft.Office.Interop.Excel
엑셀을 읽고 쓰는데에는 몇가지가 있다.
일단 마이크로소프트에서 제공하는 'Microsoft.Office.Interop.Excel' 가 있는데,
버전에 따라 되거나 안되거나 하는 부분때문에 꺼리게된다.
'참조추가' 에서 COM 에 있는 Microsoft.Office.Interop.Excel 가 아닌, 어셈블리 > 확장 에 있는 Microsoft.Office.Interop.Excel 을 가져다가 하면 버전 상관없이 11.0 까지는 된다고 하는데,
윈도우 11 인 지금은 잘 모르겠다.
어셈블리에 Microsoft.Office.Interop.Excel 가 안 보인다.
그냥 NuGet 에서 검색해서 썼다.
MainWindows.xaml
<Window x:Class="TestEXCEL.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:local="clr-namespace:TestEXCEL"
mc:Ignorable="d"
Title="MainWindow" Height="450" Width="800">
<Grid>
<StackPanel>
<Button x:Name="btnOPEN" Height="30" Click="btnOPEN_Click">OPEN</Button>
<Button x:Name="btnSAVE" Height="30" Click="btnSAVE_Click">SAVE</Button>
<DataGrid x:Name="dtGrd" AutoGenerateColumns="True" IsReadOnly="False"></DataGrid>
</StackPanel>
</Grid>
</Window>
MainWindows.xaml.cs
using Microsoft.Office.Interop.Excel;
using Microsoft.Win32;
using System;
using System.Data;
using System.Windows;
using System.Windows.Controls;
namespace TestEXCEL
{
/// <summary>
/// MainWindow.xaml에 대한 상호 작용 논리
/// </summary>
public partial class MainWindow : System.Windows.Window
{
public MainWindow()
{
InitializeComponent();
}
private void btnOPEN_Click(object sender, RoutedEventArgs e)
{
string filePath = string.Empty;
OpenFileDialog openFileDialog = new OpenFileDialog
{
Filter = "Excel 파일 | *.xls; *.xlsx",
CheckFileExists = true,
CheckPathExists = true
};
if (openFileDialog.ShowDialog().GetValueOrDefault())
{
filePath = openFileDialog.FileName;
}
else
{
return;
}
Microsoft.Office.Interop.Excel.Application excelApp = new Microsoft.Office.Interop.Excel.Application();
Workbook workbook = excelApp.Workbooks.Open(filePath);
Worksheet sheet = (Worksheet)workbook.Sheets[1];
// 데이터를 담을 DataTable 생성
System.Data.DataTable dt = new System.Data.DataTable();
// 엑셀 파일의 첫 번째 행을 DataTable의 열로 추가
for (int i = 1; i <= sheet.UsedRange.Columns.Count; i++)
{
dt.Columns.Add(((Range)sheet.Cells[1, i]).Value.ToString());
}
// 나머지 행을 DataTable에 추가
for (int i = 2; i <= sheet.UsedRange.Rows.Count; i++)
{
DataRow row = dt.NewRow();
for (int j = 1; j <= sheet.UsedRange.Columns.Count; j++)
{
row[j - 1] = ((Range)sheet.Cells[i, j]).Value;
}
dt.Rows.Add(row);
}
// DataGridView에 DataTable 바인딩
if(dtGrd.ItemsSource == null) dtGrd.Items.Clear();
dtGrd.ItemsSource = dt.DefaultView;
// Excel 파일 및 COM 객체 해제
workbook.Close(false);
excelApp.Quit();
System.Runtime.InteropServices.Marshal.ReleaseComObject(excelApp);
}
private void btnSAVE_Click(object sender, RoutedEventArgs e)
{
try
{
// SaveFileDialog 인스턴스 생성
SaveFileDialog saveFileDialog = new SaveFileDialog();
saveFileDialog.Filter = "Excel 파일 (*.xls, *.xlsx)|*.xlsx|모든 파일 (*.*)|*.*";
saveFileDialog.Title = "저장 위치 및 파일 선택";
// 다이얼로그 표시 및 사용자의 선택 결과 확인
if (saveFileDialog.ShowDialog() == true)
{
// Microsoft.Office.Interop.Excel을 사용하여 저장
string filePath = saveFileDialog.FileName;
SaveExcelFile(dtGrd, filePath);
MessageBox.Show("파일이 저장되었습니다.", "성공", MessageBoxButton.OK, MessageBoxImage.Information);
}
}
catch (Exception ex)
{
MessageBox.Show($"저장 중 오류 발생: {ex.Message}", "오류", MessageBoxButton.OK, MessageBoxImage.Error);
}
}
private void SaveExcelFile(DataGrid dtGrd, string filePath)
{
Microsoft.Office.Interop.Excel.Application excelApp = new Microsoft.Office.Interop.Excel.Application();
Workbook workbook = excelApp.Workbooks.Add(Type.Missing);
Worksheet sheet = (Worksheet)workbook.ActiveSheet;
// 헤더 행 추가
for (int i = 0; i < dtGrd.Columns.Count; i++)
{
sheet.Cells[1, i + 1] = dtGrd.Columns[i].Header?.ToString() ?? string.Empty;
}
// 데이터 행 추가
for (int i = 0; i < dtGrd.Items.Count; i++)
{
for (int j = 0; j < dtGrd.Columns.Count; j++)
{
var cellValue = (dtGrd.Items[i] as DataRowView)?.Row[j]; // Assuming data binding to DataTable
sheet.Cells[i + 2, j + 1] = cellValue != null ? cellValue.ToString() : string.Empty;
}
}
// Excel 파일 저장
workbook.SaveAs(filePath);
workbook.Close();
excelApp.Quit();
}
}
}
728x90
반응형
'Programing (프로그래밍) > WPF & C# (C Sharp)' 카테고리의 다른 글
WPF - 햄버거 버튼 유니코드 엔터티 ( WPF / HTML) (0) | 2024.08.01 |
---|---|
WPF & C# - 트레이아이콘 ( TrayIcon / notifyIcon ) (0) | 2024.07.19 |
WPF & C# - ASCII or HEX 구분 방법 ( 아스키 ) (0) | 2023.12.30 |
WPF C# HttpClient vs WebRequest 장단점 (0) | 2023.08.20 |
WPF & C# - DataGrid 바탕화면으로 Drag&Drop 하여 파일 복사하기 ( DragnDrop 데이터 그리드 데이타그리드 ) (0) | 2023.08.08 |
WPF & C# - 엑셀없이 엑셀파일 빠르게 읽기 ( XLS, XLSX, ExcelDataReader, EXCEL ) (0) | 2023.03.12 |
[자작] WPF & C# - isIPSCAN( Ping Test Program / 맥주소 / MACaddress / 호스트명 / HostName / 닉네임 / NicName / 핑 테스트 ) (0) | 2022.11.13 |
WPF & C# - Array Index Check ( 배열 인덱스 내외 여부 체크 확인 ) (0) | 2022.10.15 |