簡體   English   中英

SpreadsheetLight C#-按名稱將Excel表加載到DataTable中

[英]SpreadsheetLight C# - Load Excel Table by Name into DataTable

我對SpreadsheetLight非常滿意。 但是我不禁以為自己已經忽略了一些東西。 在Excel中,您可以“將格式設置為表格”,然后在選擇表格時出現“表格工具-設計”選項卡。 您可以更改表名,這很棒。

但是,我一直在努力尋找使用SpreadsheetLight來加載Excel文件然后在工作表上獲取表的簡單方法。

除了求助之外,沒有別的辦法嗎?

using SpreadsheetLight;

~~~~~~~
~~~~~~~
~~~~~~~

public DataTable LoadExcelFileTable(string FullFileName)
{
    //Load Excel File, get Table Names, compare, Load matching table name into DataTable and return.
    string tableName = "Table1";

    SLDocument sl = new SLDocument(FullFileName);
    sl.SelectWorksheet(SLDocument.DefaultFirstSheetName);


    DataTable excelTableDT = GetExcelTablesOfSelectedWorksheet(sl);

    //Using table dt can extract data....


    return null;  //Placeholder for now
}

private DataTable GetExcelTablesOfSelectedWorksheet(SLDocument sl)
{
    string sci = "StartColumnIndex";
    string sri = "StartRowIndex";
    string eci = "EndColumnIndex";
    string eri = "EndRowIndex";

    DataTable excelTableDT = new DataTable();
    excelTableDT.Columns.Add("DisplayName");
    excelTableDT.Columns.Add(sci, typeof(int)); // 1 == A, 2 == B
    excelTableDT.Columns.Add(sri, typeof(int));    // 1 == 1, 2 == 2
    excelTableDT.Columns.Add(eci, typeof(int));   // 1 == A, 2 == B
    excelTableDT.Columns.Add(eri, typeof(int));      // 1 == 1, 2 == 2

    //Appears it's not made public, we cannot normally access tables and then by name determine start and end cells.
    //Reflection to the rescue
    FieldInfo slwsFieldInfo = typeof(SLDocument).GetField("slws", BindingFlags.Instance | BindingFlags.NonPublic | BindingFlags.Public);
    if (slwsFieldInfo != null)
    {
        var b = slwsFieldInfo.GetValue(sl);
        if (b != null)
        {
            var TablesPropInfo = b.GetType().GetProperty("Tables", BindingFlags.Instance | BindingFlags.NonPublic | BindingFlags.Public);
            if (TablesPropInfo != null)
            {
                var oTables = TablesPropInfo.GetValue(b);
                if (oTables != null && oTables is List<SLTable> Tables)
                {
                    if (Tables != null)
                    {
                        foreach (SLTable slTable in Tables)
                        {
                            //Get the info we need
                            string DisplayName = slTable.DisplayName;
                            int StartColumnIndex = Reflection_TryGetIntPropertyValue(slTable, sci);
                            int StartRowIndex = Reflection_TryGetIntPropertyValue(slTable, sri);
                            int EndColumnIndex = Reflection_TryGetIntPropertyValue(slTable, eci);
                            int EndRowIndex = Reflection_TryGetIntPropertyValue(slTable, eri);
                            //Add to DataTable
                            excelTableDT.Rows.Add(new object[] { DisplayName, StartColumnIndex, StartRowIndex, EndColumnIndex, EndRowIndex });
                        }
                    }
                }
            }
        }
    }
    return excelTableDT;
}

private int Reflection_TryGetIntPropertyValue(object o, string propertyName)
{
    int x = -1;

    try
    {
        var propInfo = o.GetType().GetProperty(propertyName, BindingFlags.Instance | BindingFlags.NonPublic | BindingFlags.Public);
        if (propInfo != null)
        {
            object val = propInfo.GetValue(o);
            if (val != null && val is int yay)
            {
                x = yay;
            }
        }
    }
    catch { }

    return x;
}

經過一些深入的研究,我學習了如何使用Microsoft“ DocumentFormat.OpenXml”在所有電子表格上獲取表格,這是SpreadsheetLight在幕后使用的。 在這一點上,我很樂意使用這種方法進行反射。

using DocumentFormat.OpenXml.Packaging;
using DocumentFormat.OpenXml.Spreadsheet;

~~~~~~
~~~~~~
~~~~~~

private DataTable GetExcelTablesFromWorksheets(string FullFileName)
{
    DataTable excelTablesDT = new DataTable();
    excelTablesDT.Columns.Add("Spreadsheet");
    excelTablesDT.Columns.Add("TableName");
    excelTablesDT.Columns.Add("CellRange");
    excelTablesDT.Columns.Add("HasHeader", typeof(bool));

    using (SpreadsheetDocument sd = SpreadsheetDocument.Open(FullFileName, false))
    {
        if(sd != null && sd.WorkbookPart != null)
        {
            IEnumerable<Sheet> sheets = sd.WorkbookPart.Workbook.Sheets.Elements<Sheet>();
            IEnumerable<WorksheetPart> wsps = sd.WorkbookPart.WorksheetParts;
            if (wsps != null)
            {
                foreach (WorksheetPart wsp in wsps)
                {
                    if (wsp != null)
                    {
                        IEnumerable<TableDefinitionPart> tdps = wsp.TableDefinitionParts;
                        if (tdps != null)
                        {
                            foreach (TableDefinitionPart tdp in tdps)
                            {
                                if (tdp != null)
                                {
                                    Table t = tdp.Table;
                                    if (t != null)
                                    {
                                        string Spreadsheet = "";
                                        string SpreadsheetId = sd.WorkbookPart.GetIdOfPart(wsp);
                                        Sheet currentSheet = sheets.FirstOrDefault(s => s.Id.HasValue && s.Id.Value.Equals(SpreadsheetId, StringComparison.OrdinalIgnoreCase));
                                        if(currentSheet != null)
                                        {
                                            Spreadsheet = currentSheet.Name;
                                        }
                                        string TableName = t.DisplayName;
                                        string CellRange = t.Reference.HasValue ? t.Reference.Value : "";
                                        bool hasHeader = !(t.HeaderRowCount != null && t.HeaderRowCount.HasValue && t.HeaderRowCount.Value == 0);
                                        //Add to DataTable
                                        excelTablesDT.Rows.Add(new object[] { Spreadsheet, TableName, CellRange, hasHeader });
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }
    }

    return excelTablesDT;
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM