7

問題

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 に「TEST」を含み、その他の編集を行わない基本的なテンプレートを作成します。
  • を使用して保存し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();
}

ノート:

何らかの理由で、保存されたファイルは破損しているように見え、復元できません。現在、Microsoft Office 2010を使用しています。私が使用しているファイル形式は.xltx、 と.xlsx.

4

3 に答える 3

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()

EPPlus を使用して新しい ExcelPackage オブジェクトをインスタンス化する場合、テンプレートを 2 番目のパラメーターとして提供できるはずですが (上記のコード スニペットを参照)、xltx ファイルを提供すると、上記のユーザーと同じように破損した出力ファイルを取得し続けました。 . 最終的に、実際のテンプレート ファイルではなく、通常の xlsx ファイルをテンプレートとして指定すると機能するように見えることがわかりました。

これはオープンソースのパッケージなので、ソースをざっと見てみることにしました。

「テンプレート」パラメーターを受け入れる ExcelPackage コンストラクターのように見え、CreateFromTemplate() メソッドを呼び出します。CreateFromTemplate() メソッドのコメントには、実際のテンプレート ファイルではなく、 既存の xlsxファイルをテンプレートとして使用する必要があることが示されています。

そのため、'template' パラメータが実際の xltx テンプレート ファイルを参照していると思われるかもしれませんが、EPPlus はそれをサポートしていないようです。

于 2014-08-08T18:10:36.737 に答える
1

同様の問題が直面しましたが、これはテンプレートを返すだけで機能しました

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 { }
于 2014-12-16T05:45:04.843 に答える
0

データを書き込んだ後、ファイルを明示的に閉じます。応答を閉じる Web 要求の応答で EPPlus を使用すると、その問題が解消されることを私は知っています。

于 2013-10-17T17:23:07.743 に答える