C# - Excel 워크시트를 프로그래밍 방식으로 추가하는 방법 - Office XP / 2003
이제 막 C#를 통해 Excel을 만지작거리기 시작했고, Excel 파일 작성과 추가를 자동화할 수 있게 되었습니다.
파일을 열고 데이터를 업데이트하고 기존 워크시트를 이동할 수 있습니다.문제는 어떻게 새 시트를 추가할 수 있느냐는 것입니다.
나는 시도했다.
Excel.Worksheet newWorksheet;
newWorksheet = (Excel.Worksheet)excelApp.ThisWorkbook.Worksheets.Add(
Type.Missing, Type.Missing, Type.Missing, Type.Missing);
그러나 COM Exception을 밑돌고 검색에서 아무런 답변을 얻지 못했습니다.
HRESULT 예외: 0x800A03EC 소스: "Interop.엑셀
누군가 절 고통에서 구해줬으면 좋겠어요
프로젝트의 COM 참조를 "Microsoft Excel 11.0 Object Library 또는 적절한 버전에 추가해야 합니다.
이 코드는 유효합니다.
private void AddWorksheetToExcelWorkbook(string fullFilename,string worksheetName)
{
Microsoft.Office.Interop.Excel.Application xlApp = null;
Workbook xlWorkbook = null;
Sheets xlSheets = null;
Worksheet xlNewSheet = null;
try {
xlApp = new Microsoft.Office.Interop.Excel.Application();
if (xlApp == null)
return;
// Uncomment the line below if you want to see what's happening in Excel
// xlApp.Visible = true;
xlWorkbook = xlApp.Workbooks.Open(fullFilename, 0, false, 5, "", "",
false, XlPlatform.xlWindows, "",
true, false, 0, true, false, false);
xlSheets = xlWorkbook.Sheets as Sheets;
// The first argument below inserts the new worksheet as the first one
xlNewSheet = (Worksheet)xlSheets.Add(xlSheets[1], Type.Missing, Type.Missing, Type.Missing);
xlNewSheet.Name = worksheetName;
xlWorkbook.Save();
xlWorkbook.Close(Type.Missing,Type.Missing,Type.Missing);
xlApp.Quit();
}
finally {
Marshal.ReleaseComObject(xlNewSheet);
Marshal.ReleaseComObject(xlSheets);
Marshal.ReleaseComObject(xlWorkbook);
Marshal.ReleaseComObject(xlApp);
xlApp = null;
}
}
COM 오브젝트 참조를 적절히 정리하고 해방하는 것에 주의해 주세요.이 StackOverflow 질문에는 "COM 개체와 함께 2개의 도트를 사용하지 마십시오"라는 유용한 경험칙이 포함되어 있습니다.당신의 코드에 따르면, 당신은 그것에 큰 어려움을 겪을 것입니다.위의 데모 코드로는 Excel 앱이 제대로 정리되지 않지만 시작입니다!
이 질문을 조사할 때 도움이 되는 기타 링크:
MSDN에 따르면
COM interop을 사용하려면 관리자 또는 Power User 보안 권한이 있어야 합니다.
도움이 됐으면 좋겠다.
좋은 답변 감사합니다. @AR, 당신은 스타이고 완벽하게 작동합니다.어제 밤에 알아차렸었는데Excel.exe닫히지 않아서 COM 오브젝트를 해제하는 방법을 조사했습니다.마지막 코드는 다음과 같습니다.
using System;
using System.Collections.Generic;
using System.Text;
using System.Reflection;
using System.IO;
using Excel;
namespace testExcelconsoleApp
{
class Program
{
private String fileLoc = @"C:\temp\test.xls";
static void Main(string[] args)
{
Program p = new Program();
p.createExcel();
}
private void createExcel()
{
Excel.Application excelApp = null;
Excel.Workbook workbook = null;
Excel.Sheets sheets = null;
Excel.Worksheet newSheet = null;
try
{
FileInfo file = new FileInfo(fileLoc);
if (file.Exists)
{
excelApp = new Excel.Application();
workbook = excelApp.Workbooks.Open(fileLoc, 0, false, 5, "", "",
false, XlPlatform.xlWindows, "",
true, false, 0, true, false, false);
sheets = workbook.Sheets;
//check columns exist
foreach (Excel.Worksheet sheet in sheets)
{
Console.WriteLine(sheet.Name);
sheet.Select(Type.Missing);
System.Runtime.InteropServices.Marshal.ReleaseComObject(sheet);
}
newSheet = (Worksheet)sheets.Add(sheets[1], Type.Missing, Type.Missing, Type.Missing);
newSheet.Name = "My New Sheet";
newSheet.Cells[1, 1] = "BOO!";
workbook.Save();
workbook.Close(null, null, null);
excelApp.Quit();
}
}
finally
{
System.Runtime.InteropServices.Marshal.ReleaseComObject(newSheet);
System.Runtime.InteropServices.Marshal.ReleaseComObject(sheets);
System.Runtime.InteropServices.Marshal.ReleaseComObject(workbook);
System.Runtime.InteropServices.Marshal.ReleaseComObject(excelApp);
newSheet = null;
sheets = null;
workbook = null;
excelApp = null;
GC.Collect();
}
}
}
}
도와주셔서 감사합니다.
AR을 위한 "Up Tick"이 하나 더 있지만 인터옵션을 사용할 필요가 없다면 아예 피하겠습니다.이 제품은 실제로 매우 흥미롭습니다.http://www.clearoffice.com/는 매우 직관적이고 완벽하게 관리된 엑셀 파일을 조작하기 위한 API를 제공하며 무료인 것처럼 보입니다.(적어도 당분간은) Spread Sheet Gear도 훌륭하지만 가격이 비쌉니다.
제 의견입니다.
참조처 포함을 잊지 마십시오.
using Excel = Microsoft.Office.Interop.Excel;
// Include this Namespace
Microsoft.Office.Interop.Excel.Application xlApp = null;
Excel.Workbook xlWorkbook = null;
Excel.Sheets xlSheets = null;
Excel.Worksheet xlNewSheet = null;
string worksheetName ="Sheet_Name";
object readOnly1 = false;
object isVisible = true;
object missing = System.Reflection.Missing.Value;
try
{
xlApp = new Microsoft.Office.Interop.Excel.Application();
if (xlApp == null)
return;
// Uncomment the line below if you want to see what's happening in Excel
// xlApp.Visible = true;
xlWorkbook = xlApp.Workbooks.Open(@"C:\Book1.xls", missing, readOnly1, missing, missing, missing, missing, missing, missing, missing, missing, isVisible, missing, missing, missing);
xlSheets = (Excel.Sheets)xlWorkbook.Sheets;
// The first argument below inserts the new worksheet as the first one
xlNewSheet = (Excel.Worksheet)xlSheets.Add(xlSheets[1], Type.Missing, Type.Missing, Type.Missing);
xlNewSheet.Name = worksheetName;
xlWorkbook.Save();
xlWorkbook.Close(Type.Missing, Type.Missing, Type.Missing);
xlApp.Quit();
}
finally
{
System.Runtime.InteropServices.Marshal.ReleaseComObject(xlNewSheet);
System.Runtime.InteropServices.Marshal.ReleaseComObject(xlSheets);
System.Runtime.InteropServices.Marshal.ReleaseComObject(xlWorkbook);
System.Runtime.InteropServices.Marshal.ReleaseComObject(xlApp);
//xlApp = null;
}
OLEDB를 사용하여 Excel 파일을 만들고 조작할 수 있습니다.링크 및 샘플은 이 질문을 참조하십시오.
다음은 제가 알아낸 몇 가지 사항입니다.
동일한 개체의 인스턴스를 동시에 두 개 이상 열 수 없습니다.예를 들어 다음과 같은 새로운 Excel 시트 개체를 설치하는 경우
xlsheet1다른 Excel 시트 개체를 만들기 전에 excel sheet 개체를 해제해야 합니다.xlsheet2COM은 오브젝트의 추적을 잃고 서버에 좀비 프로세스를 남기는 것처럼 보입니다.관련 오픈 메서드 사용
excel.workbooks또, 같은 파일에 액세스 하고 있는 복수의 유저가 있는 경우, 를 닫는 것도 어려워집니다.대신 Add 메서드를 사용합니다.파일을 잠그지 않아도 똑같이 동작합니다.예:xlBook = xlBooks.Add("C:\location\XlTemplate.xls")COM 개체를 해제한 후 가비지 컬렉션을 별도의 블록 또는 메서드에 배치합니다.
COM은 결코 좋은 방법이 아닙니다.구체적으로 말하면, 웹 환경을 다루는 경우에는 안 됩니다.
저는 다음과 같은 오픈 소스 프로젝트를 성공적으로 사용했습니다.
OOXML 포맷용 Excel 패키지 (Office 2007)
.X의 NPOILS 형식(Office 2003)
다음의 블로그 투고를 봐 주세요.
Excel 스프레드시트 작성 중.XLS 및 .XC#의 LSX
이것은 내가 추가 워크시트를 추가할 때 사용했던 것이다.
Workbook workbook = null;
Worksheet worksheet = null;
workbook = app.Workbooks.Add(1);
workbook.Sheets.Add();
Worksheet additionalWorksheet = workbook.ActiveSheet;
VSTO에서도 애플리케이션 레벨의 add-in과 같은 문제가 발생했지만 예외 HRESULT: 0x800A03신규 시트 추가 시 EC.
에러 코드 0x800A03.EC(또는 -2146827284)는 NAME_NOT_FOUND를 의미합니다.즉, 사용자가 무언가를 요구했지만 Excel은 찾을 수 없습니다.
Domino Zukiewicz @ Excel 오류 HRESULT: 0x800A03셀 이름을 사용하여 범위를 가져오는 동안 EC가 발생했습니다.
그리고 마침내 This Workbook이 예외를 발생시켰다는 것을 깨달았습니다.Active Workbook은 정상적으로 동작.
Excel.Worksheet newSheetException = Globals.ThisAddIn.Application.ThisWorkbook.Worksheets.Add(Type.Missing, sheet, Type.Missing, Type.Missing);
Excel.Worksheet newSheetNoException = Globals.ThisAddIn.Application.ActiveWorkbook.Worksheets.Add(Type.Missing, sheet, Type.Missing, Type.Missing);
언급URL : https://stackoverflow.com/questions/193092/c-sharp-how-to-add-an-excel-worksheet-programmatically-office-xp-2003
'programing' 카테고리의 다른 글
| arc4random_uniform()의 범위 사이에 난수를 어떻게 만들 수 있습니까? (0) | 2023.04.29 |
|---|---|
| Xcode 10 오류: 여러 명령이 생성됩니다. (0) | 2023.04.29 |
| 프레임워크가 있는 iOS 앱이 장치에서 크래시됨, dyld: 라이브러리가 로드되지 않음, Xcode 6 베타 (0) | 2023.04.19 |
| bash/shell 스크립트에서 http 응답 코드를 평가하는 방법 (0) | 2023.04.19 |
| UITableView셀을 선택한 색상? (0) | 2023.04.19 |