using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Text;
using System.Xml;
using System.Xml.Linq;
using ActValue.OpenXml.OpenXmlParts;
using DocumentFormat.OpenXml.Packaging;
namespace ActValue.OpenXml.Excel
{
///
/// It fills data into cells.
///
public class ExcelFiller : IDisposable
{
internal static XNamespace ns_s = XNamespace.Get("http://schemas.openxmlformats.org/spreadsheetml/2006/main");
internal static XNamespace ns_r = XNamespace.Get("http://schemas.openxmlformats.org/officeDocument/2006/relationships");
internal static XNamespace ns_c = XNamespace.Get("http://schemas.openxmlformats.org/drawingml/2006/chart");
///
/// Create an empty document ready to be written to disk.
///
private SpreadsheetDocument myWorkbook;
///
///
///
///
///
public ExcelFiller(String originalDocumentPath, String destinationDocumentPath)
{
//Make a copy of the template file
File.Copy(originalDocumentPath, destinationDocumentPath, true);
//Open up the copied template workbook
myWorkbook = SpreadsheetDocument.Open(destinationDocumentPath, true);
}
///
///
///
///
///
public ExcelFillerSheet FillASheet(String sheetName)
{
return new ExcelFillerSheet(myWorkbook, sheetName, this);
}
#region IDisposable Members
public void Dispose()
{
myWorkbook.Close();
myWorkbook.Dispose();
}
#endregion
}
///
/// Inner classes used for filling data.
///
public class ExcelFillerSheet
{
private XElement XmlData { get; set; }
private XElement XmlWorkBook { get; set; }
private SpreadsheetDocument document { get; set; }
private ExcelFiller Filler { get; set; }
private String SheetName { get; set; }
private WorksheetPart WorksheetPart { get; set; }
///
/// constructor, grab a reference and fills data
///
///
///
///
public ExcelFillerSheet(SpreadsheetDocument document, String sheetName, ExcelFiller filler)
{
SheetName = sheetName;
this.document = document;
Filler = filler;
WorkbookPart workbookPart = document.WorkbookPart;
using (XmlReader xmlr = XmlReader.Create(workbookPart.GetStream()))
XmlWorkBook = XElement.Load(xmlr);
WorksheetPart = GetWorksheetByName(sheetName);
using (XmlReader xmlr = XmlReader.Create(this.WorksheetPart.GetStream()))
XmlData = XElement.Load(xmlr);
values = new List>();
InnerCloseRow();
}
private WorksheetPart GetWorksheetByName(String name)
{
XElement relNode = (from XElement e in XmlWorkBook.Descendants(ExcelFiller.ns_s + "sheet")
where e.Attribute("name").Value == name
select e).Single();
WorkbookPart workbookPart = document.WorkbookPart;
WorksheetPart retvalue = (WorksheetPart)workbookPart.GetPartById(
relNode.Attribute(ExcelFiller.ns_r + "id").Value);
return retvalue;
}
private void InnerCloseRow()
{
currentList = new List