Newer
Older
ClosedXML / ClosedXML_Tests / OleDb / OleDbTests.cs
using ClosedXML.Excel;
using NUnit.Framework;
using System;
using System.Collections.Generic;
using System.Data;
using System.Data.OleDb;
using System.IO;
using System.Linq;

namespace ClosedXML_Tests.OleDb
{
    [TestFixture]
    public class OleDbTests
    {
#if !APPVEYOR
        [Test]
        public void TestOleDbValues()
        {
            using (var tf = new TestFile(CreateTestFile(), true))
            {
                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);
                using (var connection = new OleDbConnection(connectionString))
                {
                    // Install driver from https://www.microsoft.com/en-za/download/details.aspx?id=13255 if required
                    // Also check that test runner is running under correct architecture:
                    connection.Open();
                    using (var command = new OleDbCommand("select * from [Sheet1$]", connection))
                    using (var dataAdapter = new OleDbDataAdapter())
                    {
                        dataAdapter.SelectCommand = command;
                        var dt = new DataTable();
                        dataAdapter.Fill(dt);

                        Assert.AreEqual("Base", dt.Columns[0].ColumnName);
                        Assert.AreEqual("Ref", dt.Columns[1].ColumnName);

                        Assert.AreEqual(2, dt.Rows.Count);

                        Assert.AreEqual(42, dt.Rows.Cast<DataRow>().First()[0]);
                        Assert.AreEqual("42", dt.Rows.Cast<DataRow>().First()[1]);

                        Assert.AreEqual(41, dt.Rows.Cast<DataRow>().Last()[0]);
                        Assert.AreEqual("41", dt.Rows.Cast<DataRow>().Last()[1]);
                    }

                    using (var command = new OleDbCommand("select * from [Sheet2$]", connection))
                    using (var dataAdapter = new OleDbDataAdapter())
                    {
                        dataAdapter.SelectCommand = command;
                        var dt = new DataTable();
                        dataAdapter.Fill(dt);

                        Assert.AreEqual("Ref1", dt.Columns[0].ColumnName);
                        Assert.AreEqual("Ref2", dt.Columns[1].ColumnName);
                        Assert.AreEqual("Sum", dt.Columns[2].ColumnName);
                        Assert.AreEqual("SumRef", dt.Columns[3].ColumnName);

                        var expected = new Dictionary<string, string>()
                        {
                            {"Ref1", "42" },
                            {"Ref2", "41" },
                            {"Sum", "83" },
                            {"SumRef", "83" },
                        };

                        foreach (var col in dt.Columns.Cast<DataColumn>())
                            foreach (var row in dt.Rows.Cast<DataRow>())
                            {
                                Assert.AreEqual(expected[col.ColumnName], row[col]);
                            }

                        Assert.AreEqual(2, dt.Rows.Count);
                    }

                    connection.Close();
                }
            }
        }
#endif

        private string CreateTestFile()
        {
            using (var wb = new XLWorkbook())
            {
                var ws = wb.AddWorksheet("Sheet1");
                ws.Cell("A1").Value = "Base";
                ws.Cell("B1").Value = "Ref";

                ws.Cell("A2").Value = 42;
                ws.Cell("A3").Value = 41;

                ws.Cell("B2").FormulaA1 = "=A2";
                ws.Cell("B3").FormulaA1 = "=A3";

                ws = wb.AddWorksheet("Sheet2");
                ws.Cell("A1").Value = "Ref1";
                ws.Cell("B1").Value = "Ref2";
                ws.Cell("C1").Value = "Sum";
                ws.Cell("D1").Value = "SumRef";

                ws.Cell("A2").FormulaA1 = "=Sheet1!A2";
                ws.Cell("B2").FormulaA1 = "=Sheet1!A3";
                ws.Cell("C2").FormulaA1 = "=SUM(A2:B2)";
                ws.Cell("D2").FormulaA1 = "=SUM(Sheet1!A2:Sheet1!A3)";

                ws.Cell("A3").FormulaA1 = "=Sheet1!B2";
                ws.Cell("B3").FormulaA1 = "=Sheet1!B3";
                ws.Cell("C3").FormulaA1 = "=SUM(A3:B3)";
                ws.Cell("D3").FormulaA1 = "=SUM(Sheet1!B2:Sheet1!B3)";

                var path = Path.ChangeExtension(Path.GetTempFileName(), "xlsx");
                wb.SaveAs(path, true, true);

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