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

namespace EPPlusSamples
{
    class Sample16
    {
        public static void RunSample16(DirectoryInfo outputDir)
        {
            using (var package = new ExcelPackage())
            {
                var dataTable = new DataTable("test");
                dataTable.Columns.Add("col1");
                dataTable.Columns.Add("col2");
                dataTable.Columns.Add("col3");
                dataTable.Columns.Add("col4");
                dataTable.Rows.Add("qwe11", "qwe12", "qwe13", "qwe14");
                dataTable.Rows.Add("qwe21", "qwe22", "qwe23", "qwe24");
                ExcelWorksheet worksheet = package.Workbook.Worksheets.Add(dataTable.TableName);
                worksheet.Cells["A1"].LoadFromDataTable(dataTable, true, TableStyles.None);
                worksheet.Protection.AllowSelectLockedCells = false;
                worksheet.Protection.AllowSelectUnlockedCells = true;
                worksheet.Protection.AllowSort = true;
                worksheet.Protection.AllowFormatColumns = true;
                worksheet.Protection.AllowAutoFilter = true;
                worksheet.Protection.AllowEditObject = true;
                worksheet.Protection.IsProtected = true;
                var r1=worksheet.ProtectedRanges.Add("Range1", new ExcelAddress(1, 1, worksheet.Dimension.End.Row, 4));
                worksheet.ProtectedRanges.Remove(r1);
                var r2 = worksheet.ProtectedRanges.Add("Range2", new ExcelAddress("F3:T12,F15:T30"));
                r2.SetPassword("EPPlus");

                worksheet.Column(1).Width = 30;
                worksheet.Column(2).Width = 30;
                worksheet.Column(3).Width = 100;
                worksheet.Column(4).Width = 100;
                worksheet.Cells[1, 4, worksheet.Dimension.End.Row, 4].Style.Locked = false;
                worksheet.Cells[1, 3, worksheet.Dimension.End.Row, 4].Style.WrapText = true;

                using (var fs = new FileStream(Path.Combine(outputDir.ToString(), "sample16.xlsx"), FileMode.Create))
                    package.SaveAs(fs);
            }

            using (var fs = new FileStream(Path.Combine(outputDir.ToString(), "sample16.xlsx"), FileMode.Open, FileAccess.Read))
            using (var package = new ExcelPackage(fs))
            {
                foreach (var worksheet1 in package.Workbook.Worksheets)
                {
                    var prCollection = worksheet1.ProtectedRanges;
                    if (prCollection.Count != 1)
                        throw new InvalidOperationException("Expected 1 element");
                }
            }
        }
    }
}
