.xlsx, созданный и сохраненный с использованием шаблона с EPPlus, не читается/поврежден

Проблема

Я пытаюсь создать небольшую программу, которая использует шаблон Excel для создания документа Excel, а затем записывает в несколько ячеек, используя EPPlus. К сожалению, файлы кажутся поврежденными независимо от того, что я пытаюсь сделать.

Мой код:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using OfficeOpenXml;
using System.IO;

namespace ConsoleApplication9
{
    public sealed class ExcelSerialize
    {
        private readonly List<Tuple<string, string>> Results;
        private readonly string Directory;
        private ExcelPackage package;

        public ExcelSerialize(List<Tuple<string, string>> Results, string Directory)
        {
            this.Results = Results;
            this.Directory = Directory;
        }

        public bool WriteResults()
        {
            FileInfo template = new FileInfo(Directory);

            using (package = new ExcelPackage(template, true))
            {
                ExcelWorksheet worksheet = package.Workbook.Worksheets[1];

                //foreach (Tuple<string, string> Result in Results)
                //{
                //    worksheet.Cells[Result.Item1].Value = Result.Item2;
                //}

                string file = string.Format(System.AppDomain.CurrentDomain.BaseDirectory.ToString() + @"results\results" + System.DateTime.Now.ToString().Replace(" ", "").Replace("/", "_").Replace(":", "-") + ".xlsx");

                Byte[] bin = package.GetAsByteArray();
                File.WriteAllBytes(file, bin);

                return true;
            }
        }
    }
}

Что я пробовал:

  • Изменение значений различных ячеек в шаблоне.
  • Сохранение документа Excel, созданного на основе шаблона, без записи в него новых данных.
  • Создание базового шаблона с ячейками A1, A2 и A3, содержащими «ТЕСТ», и никаких других изменений вместо более сложного шаблона, который я собираюсь использовать.
  • Сохранение с помощью Package.SaveAs().
  • Сохранение с использованием массива байтов, показанного в примере кода.
  • Компиляция EPPlus из последнего исходного кода, предоставленного на Codeplex.

Вещи, которые работают:

  • Создание нового файла с использованием следующего кода:

using (package = new ExcelPackage(string.Format(System.AppDomain.CurrentDomain.BaseDirectory.ToString() + @"results\results" + System.DateTime.Now.ToString().Replace(" ", "").Replace("/", "_").Replace(":", "-") + ".xlsx"))
{
    ExcelWorksheet worksheet = package.Workbook.Worksheets.Add("Test");
    worksheet.Cells[A1].Value = "Test";
    package.Save();
}

Примечания:

For whatever reason, the files saved still appear corrupt and can't be recovered. I'm currently using Microsoft Office 2010. The file formats I'm using are .xltx and .xlsx.


person DanteTheEgregore    schedule 11.10.2013    source источник
comment
Я отредактировал ваш заголовок. См. Должны ли вопросы включать «теги» в свои заголовки?, если нет единого мнения, не следует.   -  person John Saunders    schedule 11.10.2013


Ответы (3)


Короткий ответ:

Библиотека EPPlus не поддерживает создание файла из существующего шаблона xltx Excel.

Вместо этого используйте предварительно отформатированный файл xlsx.

Длинный ответ:

Dim excelFile As New FileInfo(filename)
Dim reportTemplate As New FileInfo(templatePath)
Dim xlFile As ExcelPackage = New ExcelPackage(excelFile, reportTemplate)

' Do Stuff

xlFile.Save()

При создании экземпляра нового объекта ExcelPackage с использованием EPPlus вы должны иметь возможность предоставить шаблон в качестве второго параметра (см. фрагмент кода выше), однако при предоставлении ему файла xltx я продолжал получать поврежденный выходной файл, такой же, как пользователь выше . В конце концов я обнаружил, что предоставление обычного файла xlsx в качестве шаблона, а не фактического файла шаблона, похоже, работает.

Это пакет с открытым исходным кодом, поэтому я решил быстро просмотреть исходный код.

Похоже, что конструкторы ExcelPackage, принимающие параметр "template", вызывают метод CreateFromTemplate(). В комментариях к методу CreateFromTemplate() говорится, что он ожидает, что в качестве шаблона будет использоваться существующий файл xlsx, а не фактический файл шаблона.

Поэтому, хотя можно предположить, что параметр «шаблон» относится к реальному файлу шаблона xltx, похоже, что EPPlus не поддерживает это.

person eXceLon    schedule 08.08.2014

Столкнулся с похожей проблемой, это сработало, просто вернув мне шаблон

public ExcelPackage getSheet(string templatePath){
FileInfo template = new FileInfo(templatePath);
ExcelPackage p = new ExcelPackage(template, true);
ExcelWorksheet ws = p.Workbook.Worksheets[1]; //position of the worksheet
ws.Name = bookName;
p.Save();
ExcelPackage pck = new ExcelPackage(new System.IO.MemoryStream(), p.Stream);
return pck;

Затем вы звоните с этим

string path = Server.MapPath(@"../../../Ex/template.xlsx")
try
{
    OfficeOpenXml.ExcelPackage pck = getSheet(path);
    Response.Clear();
    Response.ContentType = "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet";
    Response.AddHeader("content-disposition", String.Format(System.Globalization.CultureInfo.InvariantCulture, "attachment; filename={0}", fileName + ".xlsx"));
    Response.BinaryWrite(pck.GetAsByteArray());
    Response.End();
}
catch { }
person Tonto    schedule 16.12.2014

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

person Cjconry    schedule 17.10.2013