.xlsx使用模板创建和保存EPPlus是不可读/损坏的

Dan*_*ore 7 c# excel 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;
            }
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

我试过的事情:

  • 更改模板中各种单元格的值.
  • 保存从模板创建的Excel文档,而不向其写入任何新数据.
  • 使用包含"TEST"的单元格A1,A2和A3创建基本模板,而不是其他编辑,而不是我打算使用的更复杂的模板.
  • 保存使用Package.SaveAs().
  • 使用示例代码中看到的Byte数组进行保存.
  • 从Codeplex上提供的最新源编译EPPlus.

有用的东西:

  • 使用以下代码创建新文件:

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();
}
Run Code Online (Sandbox Code Playgroud)

笔记:

无论出于何种原因,保存的文件仍然显示已损坏且无法恢复.我目前正在使用Microsoft Office 2010.我正在使用的文件格式是.xltx.xlsx.

小智 10

简答:

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()
Run Code Online (Sandbox Code Playgroud)

当使用EPPlus实例化一个新的ExcelPackage对象时,你应该能够提供一个模板作为第二个参数(参见上面的代码片段),但是当它提供一个xltx文件时,我一直得到一个与上面的用户相同的损坏的输出文件.我最终发现提供一个常规的xlsx文件作为模板,而不是一个实际的模板文件,似乎工作.

这是一个开源软件包,所以我决定快速查看源代码.

它看起来像ExcelPackage构造函数接受"template"参数,调用CreateFromTemplate()方法.对CreateFromTemplate()方法的注释声明它希望现有的xlsx文件用作模板,而不是实际的模板文件.

因此,虽然可以假设'template'参数引用实际的xltx模板文件,但似乎EPPlus不支持该模板.


小智 0

将数据写入文件后显式关闭该文件。我知道当您在网络请求的响应中使用 EPPlus 时,关闭响应可以消除该问题。