С# - Как добавить рабочий лист Excel программно - Office XP/2003
Я только начинаю возиться с 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.Excel"
Я надеюсь, что кто-то, возможно, сможет вывести меня из моих страданий.
Ответы
Ответ 1
Вам нужно добавить ссылку на 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 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 входит полезное эмпирическое правило: "Никогда не используйте 2 точки со COM-объектами". В вашем коде; у вас будут настоящие проблемы с этим. Мой демо-код выше НЕ правильно очищает приложение Excel, но он запускается!
Некоторые другие ссылки, которые я нашел полезными при изучении этого вопроса:
Согласно MSDN
Чтобы использовать COM-взаимодействие, вы должны иметь администратора или Power User разрешения.
Надеюсь, что это поможет.
Ответ 2
Хотел бы поблагодарить вас за отличные ответы. @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();
}
}
}
}
Благодарим вас за вашу помощь.
Ответ 3
Еще один "Up Tick" для AR..., но если вам не нужно использовать interop, я бы вообще этого не избежал. Этот продукт действительно интересен:
http://www.clearoffice.com/ и предоставляет очень интуитивно понятный, полностью управляемый api для обработки файлов excel и, кажется, свободен. (по крайней мере, на данный момент) SpreadSheetGear также отлично, но дорого.
мои два цента.
Ответ 4
Не забудьте включить ссылку Microsoft Excel 12.0/11.0 object Library
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 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;
}
Ответ 5
Вы можете использовать OLEDB для создания и обработки файлов Excel. См. этот вопрос для ссылок и образцов.
Ответ 6
Вот несколько вещей, которые я выяснил:
-
Вы не можете открывать одновременно несколько экземпляров одного и того же объекта. Например, если вы создаете новый объект листа excel под названием xlsheet1
, вам необходимо его освободить перед созданием другого объекта excel sheet ex xlsheet2
. Кажется, что COM теряет отслеживание объекта и оставляет на сервере процесс зомби.
-
Использование открытого метода, связанного с excel.workbooks
, также становится трудно закрыть, если у вас есть несколько пользователей, обращающихся к одному файлу. Вместо этого используйте метод Add, он работает так же хорошо, не блокируя файл. например. xlBook = xlBooks.Add("C:\location\XlTemplate.xls")
-
Поместите свою сборку мусора в отдельный блок или метод после выпуска COM-объектов.
Ответ 7
COM, безусловно, не очень хороший способ. Более конкретно, это не выход, если вы имеете дело с веб-средой...
Я успешно использовал следующие проекты с открытым исходным кодом:
Взгляните на эти сообщения в блоге:
Создание таблиц Excel.XLS и .XLSX на С#
NPOI с таблицей Excel и динамической диаграммой
Ответ 8
Это то, что я использовал для добавления дополнительного рабочего листа
Workbook workbook = null;
Worksheet worksheet = null;
workbook = app.Workbooks.Add(1);
workbook.Sheets.Add();
Worksheet additionalWorksheet = workbook.ActiveSheet;
Ответ 9
У меня была аналогичная проблема надстройки уровня приложения в VSTO, исключение HRESULT: 0x800A03EC при добавлении нового листа.
Код ошибки 0x800A03EC (или -2146827284) означает NAME_NOT_FOUND; в другими словами, вы просили что-то, и Excel не может его найти.
Dominic Zukiewicz @Ошибка Excel HRESULT: 0x800A03EC при попытке получить диапазон с именем ячейки
Затем я, наконец, понял, что ThisWorkbook вызвало исключение. Активная книга прошла нормально.
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);