Запись NPOI в XLS, но не XLSX

Имея трудное время с этим …

Все работает на 100% с XLS (я использую NPOI в своем приложении ASP.NET):

using NPOI.HSSF.UserModel; using NPOI.SS.UserModel; private MemoryStream ms = new MemoryStream(); private IWorkbook workbook; private ISheet worksheet; private byte[] buffer; using (FileStream file = new FileStream(@"C:\template.xls", FileMode.Open, FileAccess.Read)) { workbook = new HSSFWorkbook(file); } worksheet = workbook.GetSheetAt(0); worksheet.GetRow(11).GetCell(11).SetCellValue("hello"); // etc etc etc workbook.Write(ms); buffer = ms.ToArray(); System.Web.HttpResponse response = System.Web.HttpContext.Current.Response; response.Clear(); response.AddHeader("Content-Type", "application/vnd.ms-excel"); response.AddHeader("Content-Disposition", String.Format("attachment; filename=template.xls; size={0}", buffer.Length.ToString())); response.BinaryWrite(buffer); response.End(); 

Требования изменились, и новый шаблон Excel использует функции из XLSX, поэтому теперь он является template.xlsx . Я все время использую NPOI 2.0, и я видел, что он поддерживает XLSX (используя XSSF вместо HSSF). Я изменил код, как это (только показывая различия здесь – все остальное – одно и то же):

 using NPOI.XSSF.UserModel; using (FileStream file = new FileStream(@"C:\template.xlsx", FileMode.Open, FileAccess.Read)) { workbook = new XSSFWorkbook(file); } response.AddHeader("Content-Type", "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet"); response.AddHeader("Content-Disposition", String.Format("attachment; filename=template.xlsx; size={0}", buffer.Length.ToString())); 

Исключение получает бросок в строке workbook.Write(ms); :

 System.NotImplementedException: The method or operation is not implemented. at NPOI.XSSF.UserModel.XSSFChartSheet.Write(Stream out1) at NPOI.XSSF.UserModel.XSSFSheet.Commit() at NPOI.POIXMLDocumentPart.OnSave(List`1 alreadySaved) at NPOI.POIXMLDocumentPart.OnSave(List`1 alreadySaved) at NPOI.POIXMLDocument.Write(Stream stream) 

Что я могу сделать неправильно?

edit: Я пробовал NPOI 2.1.1 Beta – тот же вопрос

Я провел несколько тестов с вашим примером кода и несколькими различными файлами XLSX. Исходя из результатов и полученного вами исключения, проблема связана не с вашим кодом, а с библиотекой NPOI и файлом шаблона XLSX, с которым вы работаете.

В принципе, в Excel вы можете отображать диаграмму двумя способами:

  1. Встроенный в рабочий лист, так что рабочий лист может отображать другую информацию.
  2. Все само по себе в отдельном листе. Это известно как диаграмма .

Кажется, что ваш шаблон XLSX содержит лист диаграммы, и возникает ошибка при попытке записать лист диаграммы ( XSSFChartSheet.Write ). В настоящее время у NPOI нет поддержки для написания графиков диаграмм XLSX, вместо этого он просто генерирует исключение.

Это дает вам три варианта:

  1. Удалите все листы диаграмм из вашего файла XLSX.
  2. Преобразуйте все диаграммы в свой шаблон во встроенные диаграммы. Обратите внимание, что в моем тестировании поддержка NPOI для встроенных диаграмм была немного недостаточной. Хотя он не генерировал исключения при их написании, в результирующих диаграммах иногда добавлялись метки данных, если их не было, или заставить Excel восстановить документ, удалив сам график. Ваш пробег может отличаться.
  3. Снимите NPOI и используйте другую библиотеку, например EPPlus, которая, как представляется, поддерживает диаграммы в файлах XLSX, основываясь на этом ответе .
  • Как получить данные в файле excel (используя NPOI)
  • Попытка изменить значение ячейки существующего файла Excel с помощью NPOI
  • C #: как оценить формулу excel, состоящую из диапазонов имен, используя NPOI или любую другую библиотеку
  • Как преобразовать форму в изображение из Excel (xls и xlsx) с помощью NPOI (C #)
  • Как вставить макрос в файл excel без использования библиотеки excel com
  • NPOI: создать ячейку, содержащую две строки разного размера
  • NPOI / POI Excel Lib ISheet.ShiftRows Index Вне диапазона Исключение
  • Как получить значение ячейки excel, используя имя столбца в c #, используя NPOI
  • Как пересчитать формулу ячейки?
  • Самый быстрый способ открыть Excel
  • Экспорт excel в DataTable с использованием пакетов NPOI nuGet в c #
  • Interesting Posts

    Mac Excel 2016, макрос VBA, GetAsyncKeyState: Файл не найден: user32

    Почему оператор if then превращается в #VALUE! после закрытия и повторного открытия файла Excel?

    Саморегуляция изнутри элемента управления Excel VBA

    Запуск макроса с различным количеством строк и столбцов каждый раз

    Рекурсивный вызов изменения листа в VBA

    Исключение Zip-bomb при написании форматированного Excel (.xlsx)

    Экзамен Excel VBA: сбой при завершении if

    C # /. Создать файл Excel из XML

    Сводная таблица на том же рабочем листе с данными

    Как ускорить преобразование excel в php с большими данными и несколькими вызовами функций

    Печать с помощью excel и java или других

    Как устранить ошибку библиотеки объектов Missing Powerpoint 15

    Создайте макрос, который будет скрывать и показывать столбцы на основе выбора из выпадающего списка

    Сохранять местоположение адреса ячейки кнопки управления переменной в VBA

    как преобразовать ms excel xml с помощью простой таблицы стилей?

    Давайте будем гением компьютера.