问题描述
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();