首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >SpreadsheetLight C# -将Excel表按名称加载到DataTable中

SpreadsheetLight C# -将Excel表按名称加载到DataTable中
EN

Stack Overflow用户
提问于 2018-06-05 22:02:15
回答 1查看 3.1K关注 0票数 0

我对SpreadsheetLight很满意。然而,我不禁认为我忽略了一些东西。在Excel中,您可以“格式化为表格”,然后当选择表时,会出现“Tools Design”选项卡。您可以更改表名,这是很好的。

然而,我很难找到一种直接使用SpreadsheetLight加载excel文件,然后在工作表上获取表的方法。

除了反省,没有别的办法了吗?

代码语言:javascript
复制
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;
}
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-06-06 14:54:06

在深入研究之后,我学会了如何使用微软的"DocumentFormat.OpenXml“( SpreadsheetLight在幕后使用的)来获取所有电子表格上的表格。在这一点上,我很乐意使用这种过度反射的方法。

代码语言:javascript
复制
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;
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/50709566

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档