Исключение нулевого указателя генерируется, когда приложение пытается использовать null в случае, когда требуется объект. К ним относятся:
null
. null
. null
, как если бы это был массив. null
, как если бы это был массив. null
как будто это было значение Throwable. Приложения должны бросать экземпляры этого класса, чтобы указать на другие незаконные использования объекта null
.
Ссылка: http://docs.oracle.com/javase/8/docs/api/java/lang/NullPointerException.html
Вам необходимо добавить ссылку 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 включено полезное практическое правило: «Никогда не используйте 2 точки с COM-объектами» . В вашем коде; у вас будут настоящие проблемы с этим. Мой демонстрационный код выше НЕ очищает приложение Excel должным образом, но это начало!
Некоторые другие ссылки, которые я нашел полезными при рассмотрении этого вопроса:
в соответствии с MSDN
Для использования COM-взаимодействия необходимо иметь разрешения безопасности администратора или опытного пользователя .
Надеюсь, что помогает.
Хотел бы поблагодарить Вас за некоторые превосходные ответы. @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();
}
}
}
}
Спасибо за всю Вашу справку.
Еще один «Up Tick» для AR ..., но если вам не нужно использовать взаимодействие, я бы вообще его избежал. Этот продукт на самом деле довольно интересен: http://www.clearoffice.com/ и предоставляет очень интуитивно понятный, полностью управляемый API для манипулирования файлами Excel и, кажется, бесплатный. (по крайней мере, пока) SpreadSheetGear также отлично, но дорого.
мои два цента.
Вы можете использовать OLEDB для создания и управления файлами Excel. См. этот вопрос для ссылок и образцов.
COM определенно не хороший путь. Точнее говоря, не стоит идти, если вы имеете дело с веб-средой ...
Я успешно использовал следующие проекты с открытым исходным кодом:
ExcelPackage для форматов OOXML (Office 2007)
NPOI для. Формат XLS (Office 2003)
Посмотрите на эти записи в блоге:
У меня была похожая проблема надстройки уровня приложения в VSTO, исключение HRESULT: 0x800A03EC при добавлении нового листа.
Код ошибки 0x800A03EC (или -2146827284) означает NAME_NOT_FOUND; другими словами, вы что-то просили, а Excel не может его найти.
Доминик Цукевич @ Ошибка Excel HRESULT: 0x800A03EC при попытке получить диапазон с именем ячейки
Затем я наконец-то понял ThisWorkbook , которое вызвало исключение. ActiveWorkbook пошел хорошо.
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);
Вот пара вещей, которые я выяснил:
Вы не можете открыть более одного экземпляра одного и того же объекта одновременно. Например, если вы указываете новый объект листа Excel Cized XLshet1
, вы должны отпустить его перед созданием другого объекта листа Excel Ex XLsheet2
. Кажется, что COM ослабляет отслеживание объекта и оставляет процесс зомби на сервере.
Использование метода открытия, связанного с Excel.Workbooks
Также становится сложно закрыть, если у вас есть несколько пользователей, доступа к одному и тому же файлу. Вместо этого используйте способ добавления, он работает так же хорошо, не блокируя файл. например. xlbook = xlbooks.add («C: \ location \ xltemplate.xls»)
Поместите сборку мусора в отдельный блок или метод после освобождения объектов COM.