﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.IO;
using OfficeOpenXml;

namespace GeneratePackage
{
    class Program
    {
        static ExcelPackage package;

        static void Main(string[] args)
        {
            Console.Out.WriteLine("Press enter to Start");
            Console.In.ReadLine();

            for (int ca = 0; ca < 10; ca++)
            {
                if (ca % 10 == 0)
                    Console.Out.WriteLine(ca);
                CreateDeletePackage(4,100000);
            }
            while (!Console.In.ReadLine().Equals("exit", StringComparison.OrdinalIgnoreCase))
            {
                CreateDeletePackage(1,1000);
            }
        }

        private static void CreateDeletePackage(int Sheets, int rows)
        {
            List<object> row = new List<object>();
            row.Add(1);
            row.Add("Some text");
            row.Add(12.0);
            row.Add("Some larger text that has completely no meaning.  How much wood can a wood chuck chuck if a wood chuck could chuck wood.  A wood chuck could chuck as much wood as a wood chuck could chuck wood.");

            FileInfo LocalFullFileName = new FileInfo(Path.GetTempFileName());
            LocalFullFileName.Delete();
            package = new ExcelPackage(LocalFullFileName);

            try
            {
                for (int ca = 0; ca < Sheets; ca++)
                {
                    CreateWorksheet("Sheet" + (ca+1), row, rows);
                }

                package.Save();
            }
            finally
            {
                LocalFullFileName.Refresh();
                if (LocalFullFileName.Exists)
                {
                    LocalFullFileName.Delete();
                }

                package.Dispose();
                package = null;

                GC.Collect();
            }
        }

        private static void CreateWorksheet(string sheetName, List<object> row, int numrows)
        {
            ExcelWorksheet worksheet = package.Workbook.Worksheets.Add(sheetName);
            for (int ca = 1; ca <= numrows; ca++)
            {
                AddDataRow(worksheet, ca, row);
            }
        }

        public static void AddDataRow(ExcelWorksheet worksheet, int row, IEnumerable<object> values)
        {
            int ca = 0;
            foreach (object v in values)
            {
                ca++;
                using (ExcelRange cell = worksheet.Cells[row, ca])
                {
                    object value = v;
                    cell.Value = value;
                }
            }

            worksheet.Row(row).Height = 10.2;
        }
    }
}
