C#在从byte []使用OpenXml打开Excel文件时遇到问题

问题描述

使用OpenXml库保存和打开文件时出现问题。这是我的代码

    public static void SaveExcel(List<Dictionary<string,object>> listData,List<string> entityTypes,string appName)
    {
        using (var ms = new MemoryStream())
        using (var excel = SpreadsheetDocument.Create(ms,SpreadsheetDocumentType.Workbook))
        {
            
            var workBookPart = excel.AddWorkbookPart();
            workBookPart.Workbook = new Workbook();
            var workSheetPart = workBookPart.AddNewPart<WorksheetPart>();
            var workSheetData = new SheetData();
            workSheetPart.Worksheet = new Worksheet(workSheetData);
            var sheets = workBookPart.Workbook.AppendChild(new Sheets());
            var index = 1;
            foreach (var entityType in entityTypes)
            {
                
                var sheet = new Sheet
                {
                    Id = excel.WorkbookPart.GetIdOfPart(workSheetPart),SheetId = 1U,Name = entityType
                };
                sheets.AppendChild(sheet);
            }

            workBookPart.Workbook.Save(ms);
            File.WriteallBytes("D:/nothing123.xlsx",ms.ToArray());
        }
    }

我很确定我做对了,尽管在打开文件时遇到此错误

Excel无法打开文件'nothing123.xlsx',因为文件格式或文件扩展名无效。确认文件未损坏,并且文件扩展名与文件格式匹配。

您知道我的代码怎么了吗?

解决方法

我不知道这是否与标记有关,但是我决定使用ClosedXml库,因为它比OpenXml更容易使用。我可以轻松创建一个DataTable并从DataTable中创建一个Excel文件,这非常方便。这是我的快速示例代码:

样本数据表

public DataTable getData() {    
        DataTable dt = new DataTable();   
        dt.TableName = "SheetName1";  
        dt.Columns.Add("FirstName");  
        dt.Columns.Add("LastName");     
        var row = dt.NewRow();
        row["FirstName"] = "Alvin";
        row["LastName"] = "Quezon"; 
        dt.Rows.Add(row);
        return dt;  
} 

将代码采样到Excel到字节数组

public static byte[] GetExcelBytes(DataTable dataTable)
    {
        using (var ms = new MemoryStream())
        using (var workBook = new XLWorkbook())
        {
            workBook.Worksheets.Add(dataTable);
            workBook.SaveAs(ms);
            return ms.ToArray();
        }
    }

打开文件并以极好的代码使用率我没有任何问题。

希望这会帮助将来希望使用此功能的任何人。