From Excel to DataTable in C# with Open XML

前端 未结 7 2194
暖寄归人
暖寄归人 2020-11-29 00:29

I\'m using Visual Studio 2008 and I need create a DataTable from a Excel Sheet using the Open XML SDK 2.0. I need to create it with the DataTable columns with t

7条回答
  •  庸人自扰
    2020-11-29 00:53

    First Add ExcelUtility.cs to your project :

    ExcelUtility.cs

    using System.Data;
    using System.Linq;
    using DocumentFormat.OpenXml.Packaging;
    using DocumentFormat.OpenXml.Spreadsheet;
    
    namespace Core_Excel.Utilities
    {
        static class ExcelUtility
        {
            public static DataTable Read(string path)
            {
                var dt = new DataTable();
    
                using (var ssDoc = SpreadsheetDocument.Open(path, false))
                {
                    var sheets = ssDoc.WorkbookPart.Workbook.GetFirstChild().Elements();
                    var relationshipId = sheets.First().Id.Value;
                    var worksheetPart = (WorksheetPart) ssDoc.WorkbookPart.GetPartById(relationshipId);
                    var workSheet = worksheetPart.Worksheet;
                    var sheetData = workSheet.GetFirstChild();
                    var rows = sheetData.Descendants().ToList();
    
                    foreach (var row in rows) //this will also include your header row...
                    {
                        var tempRow = dt.NewRow();
    
                        var colCount = row.Descendants().Count();
                        foreach (var cell in row.Descendants())
                        {
                            var index = GetIndex(cell.CellReference);
    
                            // Add Columns
                            for (var i = dt.Columns.Count; i <= index; i++)
                                dt.Columns.Add();
    
                            tempRow[index] = GetCellValue(ssDoc, cell);
                        }
    
                        dt.Rows.Add(tempRow);
                    }
                }
    
                var m = dt.Rows[0][9];
    
                return dt;
            }
    
            private static string GetCellValue(SpreadsheetDocument document, Cell cell)
            {
                var stringTablePart = document.WorkbookPart.SharedStringTablePart;
                var value = cell.CellValue.InnerXml;
    
                if (cell.DataType != null && cell.DataType.Value == CellValues.SharedString)
                    return stringTablePart.SharedStringTable.ChildElements[int.Parse(value)].InnerText;
    
                return value;
            }
    
            public static int GetIndex(string name)
            {
                if (string.IsNullOrWhiteSpace(name))
                    return -1;
    
                int index = 0;
                foreach (var ch in name)
                {
                    if (char.IsLetter(ch))
                    {
                        int value = ch - 'A' + 1;
                        index = value + index * 26;
                    }
                    else
                        break;
                }
    
                return index - 1;
            }
        }
    }
    

    Usage :

    var path = "D:\\Documents\\test.xlsx";
    var dt = ExcelUtility.Read(path);
    

    then enjoy it!

提交回复
热议问题