Повреждён файл xlsx после записи его через npoi

191
15 августа 2018, 07:10

Есть шаблон экселя .xlsx. Проблема не новая и много чего уже перечитал по ней, но решения не нашёл. И так. Открываю существующий файл, заношу в нужные ячейки данные, сохраняю под другим именем.

var stabilizerData = (StabilizerParsedData) data;
        if (string.IsNullOrEmpty(TemplateFileName)) return;
        var filePath = $@"{Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location)}\misc\{TemplateFileName}";
        using (
            var file =
                new FileStream(filePath,
                    FileMode.Open, FileAccess.Read))
        {
            Book = new XSSFWorkbook(file);
        }
        Sheet = Book.GetSheetAt(0);
        //Запись заголовка
        FillHeader(stabilizerData);
        //cellNum - Номер ячейки (в контексте таблицы - столбца), в которую вставляются данные, соответстует столбцу G в шаблоне
        var cellNum = 6;
        //SerialNumber
        SetCellValue(14, cellNum, stabilizerData.SerialNumber);
        //TOP
        SetCellValue(17, cellNum, stabilizerData.ConnectionOne.TreadSize);
        //BOT
        SetCellValue(18, cellNum, stabilizerData.ConnectionTwo.TreadSize);
        //L
        SetCellValue(22, cellNum, stabilizerData.Length);
        //L1
        SetCellValue(23, cellNum, stabilizerData.FishingNeckTongSpace);
        //OD
        SetCellValue(29, cellNum, stabilizerData.ConnectionOne.Od);
        //ID
        SetCellValue(30, cellNum, stabilizerData.ConnectionTwo.Id);
        //MaxOD
        SetCellValue(31, cellNum, stabilizerData.StabilizerOd);
        //BladeLength
        SetCellValue(32, cellNum, stabilizerData.LobeLength);
        //BladeWidth
        SetCellValue(34, cellNum, stabilizerData.LobeWidth);
        var fileName = $@"{Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location)}\out\{
            stabilizerData.Name}_{stabilizerData.SerialNumber}_FinishedDiagram.xlsx";
        //Сохранение изменённого файла
        using (
            var file =
                new FileStream(fileName, FileMode.Create, FileAccess.Write))
        {
            Book.Write(file);
        }

В файле есть картинка (схема из автокада вроде бы и всякие стрелочки, указывающие размеры). Таких шаблона у меня 4, все делаю так, как в коде выше. С тремя проблем не возникает, с 4 же после сохранения начинается какая-то фигня, а именно, при открытии документа получаю ошибку "Ошибка в части содержимого в книге... " и так далее. Предложение исправить, если согласиться, то картинка просто удаляется и файл спокойно открывается. Из информации в интернете узнал, что картинка как-то связана с файлом drawings1.xml, что находится в архиве файла xlsx. Получается, что этот файл в новом документе меньше, чем в исходном. Понятное дело, что что при сохранении что-то не дописывается, но почему и что? И как это можно поправить? Использую C# и NPOI 2.3.0 и к нему идёт SharpZipLib 0.86.0... Уже установил, что если скопировать Drawings1.xml из старого документа в новый, проблема исчезает, но моя задача скопировать данные в этот шаблон и открыть его программно в excel, не хотелось бы париться с разархивированием, изменением и архивированием. Мой мозговой штурм продолжается, может и сам додумаюсь, но буду рад помощи или совету. Заранее спасибо.

Update: выяснилось, что проблема не столько в сломанном файле, сколько в том, что NPOI не дописывает часть информации в новый файл, который относится к рисункам, созданным в самом Excel, как например линии (в моём случае это был чертёж детали). Часть информации просто не дописалась в готовый файл.

READ ALSO
Хранение и поиск в графе

Хранение и поиск в графе

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

192
WPF сохранение изображения из буфера в bmp

WPF сохранение изображения из буфера в bmp

Собственно код который был на WinForm, нужно сделать что-то подобное на WPF

184
ImageController в .NET

ImageController в .NET

В ASPNET-приложении необходимо реализовать разворот картинок на 90 градусов

170
Команды между 2-мя UserControl WPF

Команды между 2-мя UserControl WPF

Имеется приложение с 2-мя Юзер контролами1 - со списком пользователей, 2 - с историей сообщений

176