Gå til indholdet

Intro til ClosedXML

ClosedXML er et .NET-bibliotek, der gør det lettere at arbejde med Excel-filer. Det er baseret på Open XML SDK, men tilbyder en mere brugervenlig og effektiv API til at læse, skrive og manipulere Excel (.xlsx, .xlsm) filer.

Med ClosedXML kan du generere nye Excel-filer, læse data fra eksisterende filer, manipulere celler og rækker, formatere data, og meget mere, alt sammen gennem en højniveau API, der er nem at bruge. Det betyder, at du ikke behøver at bekymre dig om de lavniveau detaljer i Excel-filformatet eller Open XML SDK.

Når du starter med ClosedXML, begynder du typisk med at oprette et XLWorkbook objekt, som repræsenterer en Excel-arbejdsbog. Med dette objekt kan du derefter oprette nye regneark, tilføje data til cellerne, og gemme arbejdsbogen til en fil.

using ClosedXML.Excel;

var workbook = new XLWorkbook();
var worksheet = workbook.Worksheets.Add("Sample Sheet");
worksheet.Cell("A1").Value = "Hello, World!";
workbook.SaveAs("HelloWorld.xlsx");

ClosedXML understøtter mange af de funktioner, du forventer fra Excel, herunder formatering (f.eks. skrifttype, farver, grænser), formler, autofilter, række- og kolonnestørrelser, celleformater (f.eks. dato, valuta, decimal) og meget mere. Det gør det til et kraftfuldt værktøj til at generere rapporter, analysere data, og automatisere andre opgaver, der involverer Excel-filer.

Selvom ClosedXML er meget kraftfuldt og fleksibelt, er det vigtigt at bemærke, at det ikke understøtter alle funktioner i Excel. For eksempel understøtter det ikke makroer, diagrammer, billeder eller andre ikke-tekstlige elementer. For avancerede eller specialiserede behov, kan det være nødvendigt at bruge Open XML SDK direkte, eller overveje andre biblioteker som EPPlus eller NPOI.

Eksempel

Denne kode danner et ark med data og gemmer i c:\temp\data.xlsx.

using ClosedXML.Excel;
using System;

namespace ExcelDemo
{
    class Program
    {
        static void Main(string[] args)
        {
            using (var workbook = new XLWorkbook())
            {
                Random rnd = new Random();
                int rows = 10;
                var ws = workbook.Worksheets.Add("Sheet1");
                ws.Cell(1, 1).Value = "Nr";
                ws.Cell(1, 2).Value = "Navn";
                ws.Cell(1, 3).Value = "Løn";
                for (int row = 2; row < rows+1; row++)
                {
                    ws.Cell(row, 1).Value = row - 1;
                    ws.Cell(row, 2).Value = Convert.ToChar(row + 63);
                    ws.Cell(row, 3).Value = rnd.Next(10000, 100000);
                }

                var rngTable = ws.Range("A1:C" + rows);
                var rngHeaders = rngTable.Range("A1:C1");
                rngHeaders.Style.Alignment.Horizontal = XLAlignmentHorizontalValues.Center;
                rngHeaders.Style.Font.Bold = true;
                rngTable.Range("C2:C" + rows).Style.NumberFormat.Format = "#,##0.00";
                ws.Columns(1, 3).AdjustToContents();

                workbook.SaveAs(@"c:\temp\data.xlsx");
            }
        }
    }
}

Du kan overveje at skabe rapporter med ClosedXml.Reports i stedet for at gøre det manuelt.

Her er koden til at læse data fra tidligere:

using ClosedXML.Excel;
using System;
using System.Collections.Generic;

namespace ExcelDemo
{
    class Program
    {
        static void Main(string[] args)
        {

            using (FileStream fileStream = new FileStream(@"c:\temp\data.xlsx",
                FileMode.Open, FileAccess.Read, FileShare.ReadWrite))
            {
                var wb = new XLWorkbook(fileStream);
                var ws = wb.Worksheet("Sheet1");
                List<MineData> lst = new List<MineData>();
                for (int i = 2; i < 100; i++)
                {
                    if (!ws.Cell(i, 1).IsEmpty())
                    {
                        lst.Add(new MineData
                        {
                            Nr = ws.Cell(i, 1).GetValue<int>(),
                            Navn = ws.Cell(i, 2).GetValue<string>(),
                            Løn = ws.Cell(i, 3).GetValue<double>()
                        });
                    }
                }

                // gør noget med lst
                lst.ForEach(i => Console.WriteLine(i.Navn));

            }
        }
    }

    class MineData {
        public int Nr { get; set; }
        public string Navn { get; set; }
        public double Løn { get; set; }
    }
}

Serialisering med data fra Excel

Hvis du gerne vil kunne serialisere og deserialisere data fra Excel så prøv youngcm2/CsvHelper.Excel.

ExcelDataReader

Som alternativ kan ExcelDataReader også bruges til at læse fra Excel - super hurtigt og nemt. Se ExcelDataReader/ExcelDataReader.

Opgaver