Microsoft Q&A
이 태그를 사용하여 제안, 기능 요청 및 버그를 Microsoft Q&A 팀과 공유합니다. Microsoft Q&A 팀은 정기적으로 피드백을 평가하고 그 과정에서 업데이트를 제공합니다.
질문 236개
안녕하십니까?
C#으로 개발을 하고있는 개발자 입니다.
C# Winform 에서 Panel 을 이용하여 icrosoft.Office.Interop.Excel의 Excel Application을 생성하여 panel 과 연결하여 C#프로그램 안에서 Excel 을 제어하는 프로그램을 구성하였습니다.
개발중 특정 Office 버전(Office 2019 Pro 1808버전) 에서는 셀의 값을 변경하면 0xC0000005 에러를 발생시키며 Excel 프로세스가 종료되는 걸 확인하였습니다.
예전버전과 업데이트 둘다 해보았지만 해당 버전에서는 프로세스가 종료 됩니다.
해당 문제를 해결 할 수 있는 방법이 있을까요?
아래는 간단하게 구현한 프로그램입니다.
감사합니다.
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System;
using System.Windows.Forms;
using System.Runtime.InteropServices;
using Excel = Microsoft.Office.Interop.Excel;
using System.Threading;
using System.Diagnostics;
using System.Security.Principal;
namespace ExcelPanelIntegration
{
public partial class Form1 : Form
{
private Excel.Application excelApp;
private Excel.Workbook workbook;
private Excel.Worksheet worksheet;
private Panel excelPanel;
[DllImport("user32.dll")]
private static extern IntPtr SetParent(IntPtr hWndChild, IntPtr hWndNewParent);
[DllImport("user32.dll")]
private static extern bool SetWindowPos(IntPtr hWnd, IntPtr hWndInsertAfter, int X, int Y, int cx, int cy, uint uFlags);
private const int SWP_NOZORDER = 0x4;
private const int SWP_NOACTIVATE = 0x10;
public Form1()
{
InitializeComponent();
excelPanel = new Panel();
excelPanel.Dock = DockStyle.Fill;
this.Controls.Add(excelPanel);
InitializeExcel();
}
private void InitializeExcel()
{
try
{
excelApp = new Excel.Application();
workbook = excelApp.Workbooks.Add();
worksheet = workbook.ActiveSheet;
// Set Excel window as a child of our panel
SetParent(new IntPtr(excelApp.Hwnd), excelPanel.Handle);
// Resize Excel window to fit the panel
SetWindowPos(new IntPtr(excelApp.Hwnd), IntPtr.Zero, 0, 0, excelPanel.Width, excelPanel.Height, SWP_NOZORDER | SWP_NOACTIVATE);
// Make Excel visible
excelApp.Visible = true;
// Disable Excel's standard error handling
excelApp.DisplayAlerts = false;
}
catch (COMException comEx)
{
MessageBox.Show($"COM Exception during Excel initialization: {comEx.Message}\nError Code: {comEx.ErrorCode:X}");
}
catch (Exception ex)
{
MessageBox.Show($"Error during Excel initialization: {ex.Message}");
}
}
protected override void OnFormClosing(FormClosingEventArgs e)
{
base.OnFormClosing(e);
CleanupExcel();
}
private void CleanupExcel()
{
try
{
if (worksheet != null)
{
Marshal.ReleaseComObject(worksheet);
worksheet = null;
}
if (workbook != null)
{
workbook.Close(false);
Marshal.ReleaseComObject(workbook);
workbook = null;
}
if (excelApp != null)
{
excelApp.Quit();
Marshal.ReleaseComObject(excelApp);
excelApp = null;
}
}
catch (Exception ex)
{
MessageBox.Show($"Error during Excel cleanup: {ex.Message}");
}
finally
{
GC.Collect();
GC.WaitForPendingFinalizers();
}
}
}
}