using System; using System.Collections.Generic; using System.Data; using System.IO; using System.IO.Compression; using System.Linq; namespace FastExcel { public partial class FastExcel { /// /// Write data to a sheet /// /// A dataset public void Write(Worksheet worksheet) { Write(worksheet, null, null); } /// /// Write data to a sheet /// /// A dataset /// The number of the sheet starting at 1 /// How many rows in the template sheet you would like to keep public void Write(Worksheet worksheet, int sheetNumber, int existingHeadingRows = 0) { Write(worksheet, sheetNumber, null, existingHeadingRows); } /// /// Write data to a sheet /// /// A dataset /// The display name of the sheet /// How many rows in the template sheet you would like to keep public void Write(Worksheet worksheet, string sheetName, int existingHeadingRows = 0) { Write(worksheet, null, sheetName, existingHeadingRows); } /// /// Write a list of objects to a sheet /// /// Row Object /// IEnumerable list of objects /// The number of the sheet starting at 1 /// How many rows in the template sheet you would like to keep public void Write(IEnumerable rows, int sheetNumber, int existingHeadingRows = 0) { var worksheet = new Worksheet(); worksheet.PopulateRows(rows); Write(worksheet, sheetNumber, null, existingHeadingRows); } /// /// Write a list of objects to a sheet /// /// Row Object /// IEnumerable list of objects /// The display name of the sheet /// How many rows in the template sheet you would like to keep public void Write(IEnumerable rows, string sheetName, int existingHeadingRows = 0) { var worksheet = new Worksheet(); worksheet.PopulateRows(rows, existingHeadingRows); Write(worksheet, null, sheetName, existingHeadingRows); } /// /// Write a list of objects to a sheet /// /// Row Object /// IEnumerable list of objects /// The number of the sheet starting at 1 /// Use property names from object list as headings public void Write(IEnumerable objectList, int sheetNumber, bool usePropertiesAsHeadings) { var worksheet = new Worksheet(); worksheet.PopulateRows(objectList, 0, usePropertiesAsHeadings); Write(worksheet, sheetNumber, null, 0); } /// /// Write a list of objects to a sheet /// /// Row Object /// IEnumerable list of objects /// The display name of the sheet /// Use property names from object list as headings public void Write(IEnumerable rows, string sheetName, bool usePropertiesAsHeadings) { var worksheet = new Worksheet(); worksheet.PopulateRows(rows, 0,usePropertiesAsHeadings); Write(worksheet, null, sheetName, 0); } /// /// Write a excel from datatable /// public void Write(DataTable table, string sheetName) { var worksheet = new Worksheet(); worksheet.PopulateRowsFromDataTable(table, 0); Write(worksheet, null, sheetName, 0); } private void Write(Worksheet worksheet, int? sheetNumber = null, string sheetName = null, int existingHeadingRows = 0) { CheckFiles(); try { if (!UpdateExisting) { TemplateFileStream.CopyTo(ExcelFileStream); } } catch (Exception ex) { throw new Exception("Could not copy template to output file path", ex); } PrepareArchive(); // Open worksheet worksheet.GetWorksheetProperties(this, sheetNumber, sheetName); worksheet.ExistingHeadingRows = existingHeadingRows; if (Archive.Mode != ZipArchiveMode.Update) { throw new Exception("FastExcel is in ReadOnly mode so cannot perform a write"); } // Check if ExistingHeadingRows will be overridden by the dataset if (worksheet.ExistingHeadingRows != 0 && worksheet.Rows.Where(r => r.RowNumber <= worksheet.ExistingHeadingRows).Any()) { throw new Exception("Existing Heading Rows was specified but some or all will be overridden by data rows. Check DataSet.Row.RowNumber against ExistingHeadingRows"); } using (Stream stream = Archive.GetEntry(worksheet.FileName).Open()) { // Open worksheet and read the data at the top and bottom of the sheet var streamReader = new StreamReader(stream); worksheet.ReadHeadersAndFooters(streamReader, ref worksheet); //Set the stream to the start stream.Position = 0; // Open the stream so we can override all content of the sheet var streamWriter = new StreamWriter(stream); // TODO instead of saving the headers then writing them back get position where the headers finish then write from there streamWriter.Write(worksheet.Headers); if (!worksheet.Template) { worksheet.Headers = null; } SharedStrings.ReadWriteMode = true; // Add Rows foreach (var row in worksheet.Rows) { streamWriter.Write(row.ToXmlString(SharedStrings)); } SharedStrings.ReadWriteMode = false; //Add Footers streamWriter.Write(worksheet.Footers); if (!worksheet.Template) { worksheet.Footers = null; } streamWriter.Flush(); stream.SetLength(stream.Position); } } } }