打开下载的excel文件后出现文件格式错误

时间:2016-05-03 13:11:02

标签: c# asp.net-mvc excel

在我的应用程序中,我试图从mvc中的字节数组内容下载excel文件。下载文件后,当我打开下载的文件时,我收到错误。

  

"您尝试打开的文件' XXXX.xls'是一种不同的格式   比文件扩展名指定的。验证文件不是   在打开文件之前损坏并来自受信任的来源。你呢   想立即打开文件?"

点击上面的错误后我收到了另一个错误

  

Excel在' XXXX.xls'中找到了不可读的内容。你想要_____吗   恢复本工作簿的内容?如果您相信这个来源   工作簿,单击是。

再次当我在上面的错误消息中单击是时,我再次收到第一条错误消息。

  

"您尝试打开的文件' XXXX.xls'是一种不同的格式   比文件扩展名指定的。验证文件不是   在打开文件之前损坏并来自受信任的来源。你呢   想立即打开文件?"

在上面的错误消息中单击是后,excel会打开一个修复弹出窗口,显示其中的消息。消息是

  

修复记录:来自/xl/styles.xml部分的格式(样式)

这是我的控制器代码

 [HttpPost, FileDownload]
        public FileContentResult GetReport(DateTime StartDate, DateTime EndDate, int ReportType)
        {
            var reportData = new Model().GetReport(StartDate, EndDate, ReportType);

            string fileName = "Report " + (TimeZoneUtil.ConvertUtcDateTimeToESTDateTime(DateTime.UtcNow).ToString("yyyy:MM:dd:hh:mm:ss")) + ".xls";

            return File(reportData, MimeMapping.GetMimeMapping(fileName), fileName);

        }

我使用jQuery File Download Plugin在视图中调用此方法,我的代码是

  var dataToSend = { "StartDate": $("#dtpreportstartdate").val(), "EndDate": $("#dtpreportenddate").val(), "ReportType": value };
                        $.fileDownload(GetBaseUrl() + "Dashboard/GetReport",
                        {
                            preparingMessageHtml: "success message",
                            failMessageHtml: "Error message",
                            httpMethod: "POST",
                            data: dataToSend
                        });

以下是获取Excel内容的方法

 public byte[] CreateReportFile(List<BGClass> BGRows)
            {
                MemoryStream ms = new MemoryStream();
                SpreadsheetDocument xl = SpreadsheetDocument.Create(ms, SpreadsheetDocumentType.Workbook);
                WorkbookPart wbp = xl.AddWorkbookPart();
                WorksheetPart wsp = wbp.AddNewPart<WorksheetPart>();
                Workbook wb = new Workbook();
                FileVersion fv = new FileVersion();
                fv.ApplicationName = "Microsoft Office Excel";
                Worksheet ws = new Worksheet();
                SheetData sd = new SheetData();
                AddStyleSheet(ref xl);


                Row headerRow = new Row();
                Cell CreatedDateHeaderCell = new Cell() { StyleIndex = Convert.ToUInt32(1) };
                CreatedDateHeaderCell.DataType = CellValues.String;
                CreatedDateHeaderCell.CellValue = new CellValue("Created Date");
                headerRow.Append(CreatedDateHeaderCell);

                Cell BackgroundNameHeaderCell = new Cell() { StyleIndex = Convert.ToUInt32(1) };
                BackgroundNameHeaderCell.DataType = CellValues.String;
                BackgroundNameHeaderCell.CellValue = new CellValue("Bg Name");
                headerRow.Append(BackgroundNameHeaderCell);

                sd.Append(headerRow);

                foreach (BGClass reportRow in BGRows)
                {
                    Row dataRow = new Row();

                    Cell CreatedDateDataCell = new Cell();
                    CreatedDateDataCell.DataType = CellValues.String;
                    CreatedDateDataCell.CellValue = new CellValue(TimeZoneHelper.ConvertUtcDateTimeToESTDateTime(reportRow.CreatedDate).ToString());
                    dataRow.Append(CreatedDateDataCell);

                    Cell BackgroundNameDataCell = new Cell();
                    BackgroundNameDataCell.DataType = CellValues.String;
                    BackgroundNameDataCell.CellValue = new CellValue(reportRow.BackgroundName);
                    dataRow.Append(BackgroundNameDataCell);

                }

                ws.Append(sd);
                wsp.Worksheet = ws;
                wsp.Worksheet.Save();
                Sheets sheets = new Sheets();
                Sheet sheet = new Sheet();
                sheet.Name = "Report";
                sheet.SheetId = 1;
                sheet.Id = wbp.GetIdOfPart(wsp);
                sheets.Append(sheet);
                wb.Append(fv);
                wb.Append(sheets);

                xl.WorkbookPart.Workbook = wb;
                xl.WorkbookPart.Workbook.Save();
                xl.Close();

                return ms.ToArray();
            }

代码有什么问题?为什么我在打开文件时出现excel错误? 我尝试了很多博客来改变MIME类型,但对我来说没什么用。 有什么想法吗?

3 个答案:

答案 0 :(得分:2)

您正在使用SpreadsheetDocument.Create()from the OpenXML SDK

这表示您正在编写XLSX文件,但是您使用XLS扩展名和MIME类型来提供文件。

将文件扩展名更改为.xlsx,表示XML格式。

答案 1 :(得分:1)

我可以提出一些建议吗?

为什么不使用免费的C#库,比如我的(下面的链接),您可以将List<>变量传递给它,它将为您创建一个完美的.xlsx文件。

CodeProject: Export to Excel, in C#

一行代码,这个问题就消失了:

public void CreateReportFile(List<BGClass> BGRows)
{
    CreateExcelFile.CreateExcelDocument(BGRows, "SomeFilename.xlsx");
}

所有C#源代码均免费提供。

答案 2 :(得分:0)

我做了一些研究后解决了这个问题。我正在使用函数AddStyleSheet(ref xl);将样式应用于excel中的标题行。在该方法中出现问题我在将样式应用于单元格时缺少一些参数。

我的旧方法是

private WorkbookStylesPart AddStyleSheet(ref SpreadsheetDocument spreadsheet)
        {
            WorkbookStylesPart stylesheet = spreadsheet.WorkbookPart.AddNewPart<WorkbookStylesPart>();
            Stylesheet workbookstylesheet = new Stylesheet();

            Font fontBold = new Font(new FontName() { Val = "Arial" }); // Default font
            Font defaultFont = new Font(new FontName() { Val = "Arial" }); // Bold font

            Bold bold = new Bold();
            defaultFont.Append(bold);

            Fonts fonts = new Fonts();      // <APENDING Fonts>
            fonts.Append(fontBold);
            fonts.Append(defaultFont);

            //// <Fills>
            //Fill fill0 = new Fill();        // Default fill
            //Fills fills = new Fills();      // <APENDING Fills>
            //fills.Append(fill0);

            // <Borders>
            //Border border0 = new Border();     // Defualt border
            //Borders borders = new Borders();    // <APENDING Borders>
            //borders.Append(border0);

            // <CellFormats>
            CellFormat cellformat0 = new CellFormat() { FontId = 0, FillId = 0, BorderId = 0 }; // Default style : Mandatory | Style ID =0
            CellFormat cellformat1 = new CellFormat() { FontId = 1 };  // Style with Bold text ; Style ID = 1

            // <APENDING CellFormats>
            CellFormats cellformats = new CellFormats();
            cellformats.Append(cellformat0);
            cellformats.Append(cellformat1);

            // Append FONTS, FILLS , BORDERS & CellFormats to stylesheet <Preserve the ORDER>
            workbookstylesheet.Append(fonts);
            //workbookstylesheet.Append(fills);
            //workbookstylesheet.Append(borders);
            workbookstylesheet.Append(cellformats);

            // Finalize
            stylesheet.Stylesheet = workbookstylesheet;
            stylesheet.Stylesheet.Save();

            return stylesheet;
        }

在这个功能中,我评论了填充和边框部分,因为我不需要它。但如果您在应用样式索引时不使用它,它将为您提供无法访问的内容&#34;错误,我正面临着。

所以我改变了方法并将Fill和border部分添加到样式中。这是我更新的方法。

 private WorkbookStylesPart AddStyleSheet(ref SpreadsheetDocument spreadsheet)
    {
        WorkbookStylesPart stylesheet = spreadsheet.WorkbookPart.AddNewPart<WorkbookStylesPart>();
        Stylesheet workbookstylesheet = new Stylesheet(
            new Fonts(
                new Font(                                                               // Index 0 – The default font.
                    new FontSize() { Val = 11 },
                    new Color() { Rgb = new HexBinaryValue() { Value = "000000" } },
                    new FontName() { Val = "Arial" }),
                new Font(                                                               // Index 1 – The bold font.
                    new Bold(),
                    new FontSize() { Val = 11 },
                    new Color() { Rgb = new HexBinaryValue() { Value = "000000" } },
                    new FontName() { Val = "Arial" })
            ),
            new Fills(
                new Fill(                                                           // Index 0 – The default fill.
                    new PatternFill() { PatternType = PatternValues.None })
            ),
            new Borders(
                new Border(                                                         // Index 0 – The default border.
                    new LeftBorder(),
                    new RightBorder(),
                    new TopBorder(),
                    new BottomBorder(),
                    new DiagonalBorder())
            ),
            new CellFormats(
                new CellFormat() { FontId = 0, FillId = 0, BorderId = 0 },                          // Index 0 – The default cell style.  If a cell does not have a style index applied it will use this style combination instead
                new CellFormat() { FontId = 1, FillId = 0, BorderId = 0 }                           // Index 1 – Bold 
            )
        );


        stylesheet.Stylesheet = workbookstylesheet;
        stylesheet.Stylesheet.Save();

        return stylesheet;
    }

用于参考链接 https://blogs.msdn.microsoft.com/chrisquon/2009/11/30/stylizing-your-excel-worksheets-with-open-xml-2-0/