c# - 使用epplus创建.xlsm文件

标签 c# excel razor epplus xlsm

我正在尝试让网站导出 .xlsm 文件,但似乎找不到任何有帮助的内容。这是我用来测试构建 .xlsx 文件(有效)的一个简单示例。

@using OfficeOpenXml;
<html>
    <body>
        <div id="page-wrapper">
        @{
            // Change file extension to xlsm to test
            string fileExtension = "xlsm";
            ExcelPackage p = new ExcelPackage();
            p.Workbook.Worksheets.Add("Worksheet Name");
            int LatestWorksheetNumber = p.Workbook.Worksheets.Count;
            ExcelWorksheet ws = p.Workbook.Worksheets[LatestWorksheetNumber];

            ws.Cells[1, 1].Value = "Test";

            //Generate A File
            Byte[] bin = p.GetAsByteArray();
            string filename = "filename";
            try
            {
                //Download the file as an attachment
                Response.Clear();
                Response.ClearContent();
                Response.ClearHeaders();
                Response.Cookies.Clear();

                string ContentType = "";
                if (fileExtension == "xlsx")
                {
                    ContentType = "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet";
                }
                else
                {
                    ContentType = "application/vnd.ms-excel.sheet.macroEnabled.12";
                }
                Response.GetType();
                Response.ContentType = ContentType;
                Response.AddHeader("content-disposition", "attachment;  filename=" + filename + "." + fileExtension);
                Response.BinaryWrite(bin);
                Response.End();
                <p>File Created</p>
            }
            catch (Exception e)
            {
                <p>@e.Message</p>
            }

        }
    </div>
</body>
</html>

将文件扩展名更改为 .xlsm 后,会生成文件,但当我尝试在 Excel 中打开该文件时,收到一条错误消息,指出扩展名不正确。我认为我唯一需要更改的是内容类型 header ,但这显然不是问题。我还缺少什么???任何指导将不胜感激!

最佳答案

Xiaoy312解决了这个问题!在 Byte[] bin = p.GetAsByteArray(); 之前添加 p.Workbook.CreateVBAProject(); 解决了我的问题!其他一切都保持不变,但 Excel 现在实际上会打开文件!这是我为遇到相同问题的人提供的最终代码:

@using OfficeOpenXml;
<html>
    <body>
        <div id="page-wrapper">
            @{
                // Change file extension to xlsm to test
                string FileExtension = "xlsm";
                ExcelPackage p = new ExcelPackage();
                p.Workbook.Worksheets.Add("Worksheet Name");
                int LatestWorksheetNumber = p.Workbook.Worksheets.Count;
                ExcelWorksheet ws = p.Workbook.Worksheets[LatestWorksheetNumber];
            ws.Cells[1, 1].Value = "Test";

            p.Workbook.CreateVBAProject();

            //Generate A File
            Byte[] bin = p.GetAsByteArray();
            string filename = "filename";
            try
            {
                //Download the file as an attachment
                Response.Clear();
                Response.ClearContent();
                Response.ClearHeaders();
                Response.Cookies.Clear();

                string ContentType = "";
                if (FileExtension == "xlsx")
                {
                    ContentType = "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet";
                }
                else
                {
                    ContentType = "application/vnd.ms-excel.sheet.macroEnabled.12";
                }
                Response.GetType();
                Response.ContentType = ContentType;
                Response.AddHeader("content-disposition", "attachment;  filename=" + filename + "." + FileExtension);
                Response.BinaryWrite(bin);
                Response.End();
                <p>File Created</p>
            }
            catch (Exception e)
            {
                <p>@e.Message</p>
            }
        }
    </div>
</body>
</html>

关于c# - 使用epplus创建.xlsm文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41250111/

相关文章:

asp.net - 有没有办法动态包装/拦截 HtmlHelper 扩展方法。认为装饰器模式

c# - Entity Framework - 使用默认参数调用存储过程

c# - 更改某个 Controller 的 View 路径的最简单方法

c# - CoCreateInstance 失败,返回 0x80131500

excel - 在 CHAR(RANDBETWEEN(65,90)) 中跳过字母 O、I、Z

VBA 从第 x 行开始自动调整?

excel - 如何使用大型 Excel 文件的 XSSF 和 SAX(事件 API)获取命名范围、工作表名称和引用公式的列表

c# - 如何使用 LINQ 从列表列表输出由单个索引构造的整数列表?

c# - 使用 Razor 引擎避免 asp.net mvc 中的特殊字符

asp.net - 如何在 MVC 3 中设置图表系列颜色?