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

正如你在最后一行看到的,我关闭了 Stream。

现在,我想以这种方式保存我的 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的产品负责人]

此问题已被确认为 bug,并已提交给 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 回答
1

此问题已在 OfficeWriter 的最新 8.5.1 版本中得到解决。请参阅更改日志

于 2013-07-08T16:03:01.590 回答