0

次の問題があります。

ASP.Net GridView を Excel ファイルに直接エクスポートしています。

このメソッドで画像をヘッダーとして設定しています:

private static void insertPageHeaderFooter(ExcelInterfaceSoftArtisans excel,DateTime generatedDateTime)
    {
        StringBuilder builderFooterLeft = new StringBuilder();
        builderFooterLeft.Append("&08Comfone AG                  Tel: +41 31 341 10 10");
        builderFooterLeft.Append("\r");
        builderFooterLeft.Append("&08Nussbaumstrasse 25     Fax: +41 31 341 10 11");
        builderFooterLeft.Append("\r");
        builderFooterLeft.Append("&08CH-3000 Bern 22           www.comfone.com");

        StringBuilder builderFooterRight = new StringBuilder();
        String sDateTime = generatedDateTime.ToString(CultureInfoHandler.ShortDateShortTimeFormat);
        builderFooterRight.Append("&08&F");
        builderFooterRight.Append("\r");
        builderFooterRight.Append(string.Format("&08 {0}", sDateTime));
        builderFooterRight.Append("\r"); //new line
        builderFooterRight.Append("&08Page &P of &N");

        excel.SetHeader("&G", 0.6, HeaderFooterSection.Section.Left, false);
        excel.SetFooter(builderFooterLeft.ToString(), HeaderFooterSection.Section.Left, false);
        excel.SetFooter(builderFooterRight.ToString(), HeaderFooterSection.Section.Right, false);
    }

protected void SetHeader(string sText, double dImageSizeFactor, HeaderFooterSection.Section section, Worksheet sheet)
    {
       string headerAbsolutePath = HttpContext.Current.Server.MapPath("~/Resources/Mandates/CHECF.png");                                    
        Stream imageStream = new FileStream(headerAbsolutePath, FileMode.Open, FileAccess.Read);
        Size imageSize = Image.FromStream(imageStream).Size;
        imageStream = new FileStream(headerAbsolutePath, FileMode.Open, FileAccess.Read);
        HeaderFooterSection header = sheet.PageSetup.GetHeader(section);
        header.SetContent(sText, imageStream);
        header.SetContent(sText);
        header.GetPicture().Height = (int)(imageSize.Height * dImageSizeFactor);
        header.GetPicture().Width = (int)(imageSize.Width * dImageSizeFactor);

        imageStream.Close();
    }

最後の行でわかるように、ストリームを閉じます。

今、私はこの方法でExcelファイルを保存したいと思います:

HttpContext.Current.Response.ClearContent();
                HttpContext.Current.Response.Clear();
                HttpContext.Current.Response.ClearHeaders();
                excel.SaveWorkbook(sFileName, HttpContext.Current.Response, false);
/// <summary>
    /// Saves the current Workbook under the given filename
    /// </summary>
    /// <param name="filename"></param>
    /// <param name="response"></param>
    /// <param name="openInBrowser"></param>
    public void SaveWorkbook(string filename, HttpResponse response, bool openInBrowser)
    {
        if (book != null)
        {
            application.Save(book, response, filename, openInBrowser);
        }
    }

しかし、SetHeader メソッドでストリームを閉じると、次のエラーが発生します。

    Error Message: Cannot access a closed file.


 Stack Trace:   at System.IO.__Error.FileNotOpen() 
at System.IO.FileStream.Seek(Int64 offset, SeekOrigin origin)

SetHeader メソッドでストリームを閉じないと、ファイルは正しく保存されます。

このバグに気づいていますか?Excel ファイルを保存するためにストリームを開く必要があるのはどうしてですか? それを修正するにはどうすればよいですか?

問題をよりよく特定できるように、私が使用しているクラス全体を添付します。

この問題に関する迅速な回答と解決策をありがとうございます。

4

2 に答える 2

2

[免責事項: 私は OfficeWriter の製品所有者です]

この問題はバグとして確認されており、OfficeWriter 開発チームに提出されています。

それまでの間、画像ストリームの代わりに画像のファイル パスを取得するオーバーロードを使用するという、Sam の提案された回避策をお勧めします。

以下は、HeaderFooterSection.SetContent() のファイル パス オーバーロードを使用して Excel ファイルのヘッダーに画像を挿入する方法の一般的なコード スニペットです。

//Open the workbook and get a handle on the worksheet that will contain the
//image in the header
ExcelApplication xla = new ExcelApplication();
Workbook wb = xla.Open(Page.MapPath("\\template.xlsx"));
Worksheet ws = wb.Worksheets["Sheet1"];

//Set the header
HeaderFooterSection header = ws.PageSetup.GetHeader(HeaderFooterSection.Section.Left);
header.SetContent("&G", Page.MapPath("\\images\\image1.png"));

SetContent() オーバーロードに関する追加のリファレンスと、 ExcelWriter を使用してブックのヘッダーとフッターをフォーマットする方法については、ドキュメントを参照してください。

于 2013-05-02T11:24:30.650 に答える