Convert Excel Range to ADO.NET DataSet or DataTable, etc

后端 未结 5 1494
深忆病人
深忆病人 2020-12-19 11:39

I have an Excel spreadsheet that will sit out on a network share drive. It needs to be accessed by my Winforms C# 3.0 application (many users could be using the app and hit

相关标签:
5条回答
  • 2020-12-19 12:17

    I made method which can take alredy filtered data from Excel Taking filtered data in Range format

            Worksheet sheet = null;
            sheet = (Worksheet)context.cDocumentExcel.Sheets[requiredSheetName];
    
            DataTable dt = new DataTable();
            sheet.Activate();
            sheet.UsedRange.Select();
            List<Range> ranges = new List<Range>();
            Range usedrange = sheet.UsedRange;
    
            foreach (var oneRange in usedrange.SpecialCells(XlCellType.xlCellTypeVisible))
            {
                ranges.Add(oneRange);
            }
    
    
            dt = (_makeTableFromRange(ranges));
    

    Converting from Range to DataTable

     private static DataTable _makeTableFromRange(List<Range> ranges)
        {
            var table = new DataTable();
    
    
            foreach (var range in ranges)
            {
                while (table.Columns.Count < range.Column)
                {
                    table.Columns.Add();
                }
    
                while (table.Rows.Count < range.Row)
                {
                    table.Rows.Add();
                }
    
                table.Rows[range.Row - 1][range.Column - 1] = range.Value2;
            }
    
    
            //clean from empty rows
            var filteredRows = table.Rows.Cast<DataRow>().
                            Where(row => !row.ItemArray.All(field => field is System.DBNull ||
                                                                     string.Compare((field as string).Trim(), string.Empty) ==
                                                                     0));
            table = filteredRows.CopyToDataTable();
            return table;
        }
    
    0 讨论(0)
  • 2020-12-19 12:23

    This method does not work well when the same column in the excel spread sheet contains both text and numbers. For instance, if Range("A3")=Hello and Range("A7")=5 then it reads only Hello and the value for Range("A7") is DBNULL

    private void Form1_Load(object sender, EventArgs e)
    {   
       try
       {        
            DataTable sheetTable = loadSingleSheet(@"C:\excelFile.xls", "Sheet1$");
            dataGridView1.DataSource = sheetTable;
       }
       catch (Exception Ex)
       {
            MessageBox.Show(Ex.Message, "");
       }  
    }        
    
    private OleDbConnection returnConnection(string fileName)
    {
        return new OleDbConnection("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" + fileName + "; Jet OLEDB:Engine Type=5;Extended Properties=\"Excel 8.0;\"");
    }
    
    private DataTable loadSingleSheet(string fileName, string sheetName)
    {           
        DataTable sheetData = new DataTable();
        using (OleDbConnection conn = this.returnConnection(fileName))
        {
           conn.Open();
           // retrieve the data using data adapter
           OleDbDataAdapter sheetAdapter = new OleDbDataAdapter("select * from [" + sheetName + "]", conn);
            sheetAdapter.Fill(sheetData);
        }                        
        return sheetData;
    
    0 讨论(0)
  • 2020-12-19 12:27

    I don't know about a built-in function, but it shouldn't be difficult to write it yourself. Pseudocode:

    DataTable MakeTableFromRange(Range range)
    {
       table = new DataTable
       for every column in range
       {
          add new column to table
       }
       for every row in range
       {
          add new datarow to table
          for every column in range
          {
             table.cells[column, row].value = range[column, row].value
          }
       }
       return table
    }
    
    0 讨论(0)
  • 2020-12-19 12:32

    I don't know what type of data you have.But for an excel data like shown in this link http://www.freeimagehosting.net/image.php?f8d4ef4173.png, you can use the following code to load into data table.

        private void Form1_Load(object sender, EventArgs e)
        {   
           try
           {        
                DataTable sheetTable = loadSingleSheet(@"C:\excelFile.xls", "Sheet1$");
                dataGridView1.DataSource = sheetTable;
           }
           catch (Exception Ex)
           {
                MessageBox.Show(Ex.Message, "");
           }  
        }        
    
        private OleDbConnection returnConnection(string fileName)
        {
            return new OleDbConnection("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" + fileName + "; Jet OLEDB:Engine Type=5;Extended Properties=\"Excel 8.0;\"");
        }
    
        private DataTable loadSingleSheet(string fileName, string sheetName)
        {           
            DataTable sheetData = new DataTable();
            using (OleDbConnection conn = this.returnConnection(fileName))
            {
               conn.Open();
               // retrieve the data using data adapter
               OleDbDataAdapter sheetAdapter = new OleDbDataAdapter("select * from [" + sheetName + "]", conn);
                sheetAdapter.Fill(sheetData);
            }                        
            return sheetData;
        }
    
    0 讨论(0)
  • 2020-12-19 12:33

    It's worth to take a look at NPOI when it comes to read/write Excel 2003 XLS files. NPOI is a life saver.

    I think you'll have to iterate your range and create DataRows to put in your DataTable.

    This question on StackOverflow provides more resources:

    Create Excel (.XLS and .XLSX) file from C#

    0 讨论(0)
提交回复
热议问题