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);
}
}
}
}