使用OpenXML读取现有文件并向其中添加一些数据行,然后将其作为字节返回以下载表单

问题描述

public static byte[] AddDataToPredifinedFormat(string path,string sheetName = "")
{
    byte[] fileBytes = null;
    var employee = new List<Employee>
                {
                    new Employee{Name = "XYZ",Number = "12345"},new Employee{Name = "ABC",Number = "12345"}
                };
    try
    {
        using (MemoryStream ms = new MemoryStream())
        {
            using (SpreadsheetDocument document = SpreadsheetDocument.Open(ms,false))
            {
                WorkbookPart wbPart = document.WorkbookPart;
                IEnumerable<Sheet> sheets = wbPart.Workbook.GetFirstChild<Sheets>().Elements<Sheet>();
                string sheetId = sheetName != "" ? sheets.Where(q => q.Name == sheetName).First().Id.Value : sheets.First().Id.Value;
                WorksheetPart wsPart = (WorksheetPart)wbPart.GetPartById(sheetId);
                SheetData sheetData = wsPart.Worksheet.GetFirstChild<SheetData>();
                foreach (var x in employee)
                {
                    Row newRow = new Row();
                    Cell cell = new Cell();
                    cell.CellValue = new CellValue(x.Name.ToString());
                    cell.StyleIndex = 0;
                    newRow.AppendChild(cell);
                    sheetData.AppendChild(newRow);
                }
                wbPart.Workbook.Save(ms);
                fileBytes = ms.ToArray();
            }
        }
    }
    catch (Exception ex)
    {
        Console.WriteLine(ex.Message);
    }
    return fileBytes;
}

读取现有文件并追加行,但是在下载文件时,Excel应用程序显示该文件已损坏。 使用OpenXML读取现有文件并向其中添加一些数据行,然后将其作为字节返回以下载表单

解决方法

您可以尝试将fileBytes = ms.ToArray();移到内部using块的外部吗?

我有与此非常相似的代码来使用OpenXML修改WordprocessingDocuments,但我不使用MemoryStream。我将File.Copy原件byte[]放入临时文件,修改,保存然后从临时文件中加载{{1}}进行流传输。

,

我认为为了返回工作表,您需要稍微重构代码。与其期望内存流直接写入阵列并下载文件不会有帮助, 我所做的是在我的代码中:

  • 编写数据以流式传输并读回。因此,您需要返回更新后的流
  • 将流数据写入ExcelPackage

类似这样的东西

using OfficeOpenXml;

Stream stream = new MemoryStream(<process and return your steam>);
  using (ExcelPackage package = new ExcelPackage(stream))
            {
                //write any more extra data to sheet
                return package.GetAsByteArray();
            }

要注意的重要位是: package.GetAsByteArray();

相关问答

依赖报错 idea导入项目后依赖报错,解决方案:https://blog....
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下...
错误1:gradle项目控制台输出为乱码 # 解决方案:https://bl...
错误还原:在查询的过程中,传入的workType为0时,该条件不起...
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct...