diff --git a/ClosedXML/Excel/XLWorkbook.cs b/ClosedXML/Excel/XLWorkbook.cs index 7a549f1..b204272 100644 --- a/ClosedXML/Excel/XLWorkbook.cs +++ b/ClosedXML/Excel/XLWorkbook.cs @@ -154,6 +154,11 @@ /// public static XLCellSetValueBehavior CellSetValueBehavior { get; set; } + public static XLWorkbook OpenFromTemplate(String path) + { + return new XLWorkbook(path, true); + } + #endregion Static internal readonly List UnsupportedSheets = @@ -664,6 +669,12 @@ { } + internal XLWorkbook(String file, Boolean asTemplate) + : this(XLEventTracking.Enabled) + { + LoadSheetsFromTemplate(file); + } + public XLWorkbook(XLEventTracking eventTracking) { EventTracking = eventTracking; diff --git a/ClosedXML/Excel/XLWorkbook_Load.cs b/ClosedXML/Excel/XLWorkbook_Load.cs index a23ab4e..743d60b 100644 --- a/ClosedXML/Excel/XLWorkbook_Load.cs +++ b/ClosedXML/Excel/XLWorkbook_Load.cs @@ -55,11 +55,17 @@ LoadSpreadsheetDocument(dSpreadsheet); } + private void LoadSheetsFromTemplate(String fileName) + { + using (var dSpreadsheet = SpreadsheetDocument.CreateFromTemplate(fileName)) + LoadSpreadsheetDocument(dSpreadsheet); + } + private void LoadSpreadsheetDocument(SpreadsheetDocument dSpreadsheet) { ShapeIdManager = new XLIdManager(); SetProperties(dSpreadsheet); - //var sharedStrings = dSpreadsheet.WorkbookPart.SharedStringTablePart.SharedStringTable.Elements(); + SharedStringItem[] sharedStrings = null; if (dSpreadsheet.WorkbookPart.GetPartsOfType().Count() > 0) { @@ -2399,4 +2405,4 @@ return false; } } -} \ No newline at end of file +} diff --git a/ClosedXML/Excel/XLWorkbook_Save.cs b/ClosedXML/Excel/XLWorkbook_Save.cs index 6c86a8a..5a00d0d 100644 --- a/ClosedXML/Excel/XLWorkbook_Save.cs +++ b/ClosedXML/Excel/XLWorkbook_Save.cs @@ -87,7 +87,7 @@ } } - private bool Validate(SpreadsheetDocument package) + private Boolean Validate(SpreadsheetDocument package) { var backupCulture = Thread.CurrentThread.CurrentCulture; diff --git a/ClosedXML_Tests/ClosedXML_Tests.csproj b/ClosedXML_Tests/ClosedXML_Tests.csproj index 487ea3a..18441ef 100644 --- a/ClosedXML_Tests/ClosedXML_Tests.csproj +++ b/ClosedXML_Tests/ClosedXML_Tests.csproj @@ -91,6 +91,7 @@ + diff --git a/ClosedXML_Tests/Excel/Loading/LoadingTests.cs b/ClosedXML_Tests/Excel/Loading/LoadingTests.cs index 218ae90..1aeba43 100644 --- a/ClosedXML_Tests/Excel/Loading/LoadingTests.cs +++ b/ClosedXML_Tests/Excel/Loading/LoadingTests.cs @@ -1,6 +1,8 @@ using ClosedXML.Excel; using ClosedXML.Excel.Drawings; +using ClosedXML_Tests.Utils; using NUnit.Framework; +using System; using System.Collections.Generic; using System.IO; using System.Linq; @@ -178,5 +180,26 @@ wb.SaveAs(ms, true); } } + + [Test] + public void CanLoadFromTemplate() + { + using (var tf1 = new TemporaryFile()) + using (var tf2 = new TemporaryFile()) + { + using (var stream = TestHelper.GetStreamFromResource(TestHelper.GetResourcePath(@"Misc\AllShapes.xlsx"))) + using (var wb = new XLWorkbook(stream)) + { + // Save as temporary file + wb.SaveAs(tf1.Path); + } + + var workbook = XLWorkbook.OpenFromTemplate(tf1.Path); + Assert.True(workbook.Worksheets.Any()); + Assert.Throws(() => workbook.Save()); + + workbook.SaveAs(tf2.Path); + } + } } } diff --git a/ClosedXML_Tests/OleDb/OleDbTests.cs b/ClosedXML_Tests/OleDb/OleDbTests.cs index e502614..2aa897c 100644 --- a/ClosedXML_Tests/OleDb/OleDbTests.cs +++ b/ClosedXML_Tests/OleDb/OleDbTests.cs @@ -1,4 +1,5 @@ using ClosedXML.Excel; +using ClosedXML_Tests.Utils; using NUnit.Framework; using System; using System.Collections.Generic; @@ -16,7 +17,7 @@ [Test] public void TestOleDbValues() { - using (var tf = new TestFile(CreateTestFile())) + using (var tf = new TemporaryFile(CreateTestFile())) { Console.Write("Using temporary file\t{0}", tf.Path); var connectionString = string.Format(@"Provider=Microsoft.ACE.OLEDB.12.0;Data Source={0};Extended Properties='Excel 12.0 Xml;HDR=YES;IMEX=1';", tf.Path); @@ -115,32 +116,5 @@ return path; } } - - internal class TestFile : IDisposable - { - internal TestFile(string path) - : this(path, false) - { } - - internal TestFile(string path, bool preserve) - { - this.Path = path; - this.Preserve = preserve; - } - - public string Path { get; private set; } - public bool Preserve { get; private set; } - - public void Dispose() - { - if (!Preserve) - File.Delete(Path); - } - - public override string ToString() - { - return this.Path; - } - } } } diff --git a/ClosedXML_Tests/Utils/TemporaryFile.cs b/ClosedXML_Tests/Utils/TemporaryFile.cs new file mode 100644 index 0000000..6d95b1f --- /dev/null +++ b/ClosedXML_Tests/Utils/TemporaryFile.cs @@ -0,0 +1,37 @@ +using System; +using System.IO; + +namespace ClosedXML_Tests.Utils +{ + internal class TemporaryFile : IDisposable + { + internal TemporaryFile() + : this(System.IO.Path.ChangeExtension(System.IO.Path.GetTempFileName(), "xlsx")) + { } + + internal TemporaryFile(string path) + : this(path, false) + { } + + internal TemporaryFile(String path, bool preserve) + { + this.Path = path; + this.Preserve = preserve; + } + + + public string Path { get; private set; } + public bool Preserve { get; private set; } + + public void Dispose() + { + if (!Preserve) + File.Delete(Path); + } + + public override string ToString() + { + return this.Path; + } + } +}