【问题标题】:Creating an excel file with EPPlus, but it is always read-only使用 EPPlus 创建一个 excel 文件,但它始终是只读的
【发布时间】:2013-08-05 13:55:08
【问题描述】:

我正在使用 EPPlus 创建/发送一个文件,如下所示:

using (ExcelPackage package = new ExcelPackage())
{

    ExcelWorksheet worksheet = package.Workbook.Worksheets.Add("Sheet");
    ... //create file here

    Response.Clear();
    Response.ContentType = "application/xlsx";
    Response.AddHeader("content-disposition", "attachment; filename=" + filename + ".xlsx");
    Response.BinaryWrite(package.GetAsByteArray());
    Response.End();
}

一切正常,除了文件总是以只读方式返回,我不知道为什么。在“包”对象中,有一个带有 IsReadOnly 字段的文件对象,但该文件对象为空。我预计我没有正确创建 xcel 文件,但这是我弄清楚如何很好地创建文件的唯一方法。最初我使用的是内存流,但是这样做时,当 excel 文件大于 50 行时遇到了问题。

编辑/更新:所以我通过单击“下载为 Excel 文件”按钮来启动代码块。代码运行,创建文件,并提示用户“您已选择打开:thisismyexcelfile.xlsx,这是一个:XLSX 文件(此处大小)来自:mywebsite。firefox 应该如何处理此文件?”选择“使用 OpenOffice Calc 打开”后,电子表格将打开并正确显示,但它是只读的。

编辑/更新:我使用 OpenOffice 检查了文件属性。在属性/安全下有一个“只读打开文件”复选框,但它已被取消选中并禁用。

【问题讨论】:

  • 您说文件“以只读方式返回”是什么意思?你能更准确地描述一下这个场景吗?
  • 问题更新更明确。
  • 你确定不是 MS Office 做的吗?这是从网上下载的任何文件的默认设置。它使它们成为只读并发出安全警告。
  • 我实际上没有 MS Office,但我确实认为是 OpenOffice 做的。有没有办法可以防止这种情况发生,还是我只需要假设用户知道如何解决这个问题?
  • 其实我认为当你选择直接打开文件时,是浏览器将文件设为只读。如果您将其明确保存在某处,则不会发生。所以无论如何,问题不在于你的代码。

标签: c# .net epplus


【解决方案1】:

我找到了这个例子,我看到了 3 个主要区别

  1. Response.ContentType 设置为 application/vnd.openxmlformats
  2. 使用 Response.WriteFileResponse.BinaryWrite
  3. 在本例中,文件被保存到服务器,作为响应发送,然后被删除

    void ExportToExcel(Event evt)
    {
        var fileInfo = new FileInfo(Path.GetTempPath() + "\\" +  
                                DateTime.Now.Ticks + ".xlsx");
    
        using (var xls = new ExcelPackage(fileInfo))
        {
            var sheet = xls.Workbook.Worksheets.Add(evt.Title);
    
            sheet.Cell(1, 1).Value = "First name";
            sheet.Cell(1, 2).Value = "Last name";
            sheet.Cell(1, 3).Value = "E-mail";
            sheet.Cell(1, 4).Value = "Phone";
            sheet.Cell(1, 5).Value = "Registered";
            sheet.Cell(1, 6).Value = "Live Meeting";
    
            var i = 1;
            foreach(var attendee in evt.Attendees)
            {
                i++;
    
                var profile = attendee.Profile;
                sheet.Cell(i, 1).Value = profile.FirstName;
                sheet.Cell(i, 2).Value = profile.LastName;
                sheet.Cell(i, 3).Value = profile.Email;
               sheet.Cell(i, 4).Value = profile.Phone;
                sheet.Cell(i, 5).Value = att.Created.ToString();
                sheet.Cell(i, 6).Value = att.LiveMeeting.ToString();
            }
    
            xls.Save(); 
        }
    
        Response.Clear();
        Response.ContentType = "application/vnd.openxmlformats";
        Response.AddHeader("Content-Disposition", 
                       "attachment; filename=" + fileInfo.Name);
        Response.WriteFile(fileInfo.FullName);
        Response.Flush();
    
        if (fileInfo.Exists)
            fileInfo.Delete(); 
    }
    

【讨论】:

【解决方案2】:

从 cmets 中,我能够验证将文件保存到磁盘上的某个位置并直接打开它并没有以只读方式打开文件,这意味着问题不在于代码,而是浏览器处理从 Internet 下载的文件。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-06-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-05-30
    • 2016-03-08
    相关资源
    最近更新 更多