简体   繁体   English

将 Excel 单元格范围转换为 DataTable C#

[英]Convert Excel cell range into DataTable C#

I want to read a selected cell range of Excel sheet into a DataTable without using OLEDB.我想在不使用 OLEDB 的情况下将 Excel 表的选定单元格范围读入 DataTable。 And I don't want to use 3rd party tools either.而且我也不想使用 3rd 方工具。

Here is what I have done so far:这是我到目前为止所做的:

public void converter() 
{
    xlApp = new Microsoft.Office.Interop.Excel.Application();
    xlWorkbook = xlApp.Workbooks.Open(path);
    Microsoft.Office.Interop.Excel.Sheets sheets = xlWorkbook.Worksheets;
    xlWorksheet = xlWorkbook.Sheets[3];
    for (int i = 1; i <= 10; i++)
    {
        range = xlWorksheet.get_Range("A2", "I8");
        System.Array myvalues = (System.Array)range.Cells.Value;
        //string[] strArray = ConvertToStringArray(myvalues);
        //List<string> lst = myvalues.OfType<string>().ToList();
    }
}

How can I achieve this?我怎样才能做到这一点?

After Googling, I ended up with following but I do not know how to make it work with cell range谷歌搜索后,我最终得到了关注,但我不知道如何使它与单元格范围一起工作

public System.Data.DataTable READExcel(string path)
{
    Microsoft.Office.Interop.Excel.Application objXL = null;
    Microsoft.Office.Interop.Excel.Workbook objWB = null;
    objXL = new Microsoft.Office.Interop.Excel.Application();
    objWB = objXL.Workbooks.Open(path);
    Microsoft.Office.Interop.Excel.Worksheet objSHT = objWB.Worksheets[5];
    
    int rows = objSHT.UsedRange.Rows.Count;
    int cols = objSHT.UsedRange.Columns.Count;
    System.Data.DataTable dt = new System.Data.DataTable();
    int noofrow = 1;
    
    for (int c = 1; c <= cols; c++)
    {
        string colname = objSHT.Cells[1, c].Text;
        dt.Columns.Add(colname);
        noofrow = 2;
    }
    
    for (int r = noofrow; r <= rows; r++)
    {
        DataRow dr = dt.NewRow();
        for (int c = 1; c <= cols; c++)
        {
            dr[c - 1] = objSHT.Cells[r, c].Text;
        }
        dt.Rows.Add(dr);
    }
    
    objWB.Close();
    objXL.Quit();
    return dt;
}

Kindly help me achieve this.请帮助我实现这一目标。

It's not perfect and you might need to tweek some parameters, I didn't check if it gets the correct area, thats your work.它并不完美,你可能需要调整一些参数,我没有检查它是否得到正确的区域,那是你的工作。 But it gets a DataTable out of an Excel Worksheet, as you asked.但正如你所问的,它从 Excel 工作表中得到了一个数据表。

I'd prefer creating an custom object list with the columns as properties, rather than a DataTable, but thats only me.我更喜欢创建一个以列作为属性的自定义 object 列表,而不是 DataTable,但这只是我。

public System.Data.DataTable READExcel(string path,int row,int col, int rowamount, int colamount, int worksheetindex)
{
    Microsoft.Office.Interop.Excel.Application objXL = null;
    Microsoft.Office.Interop.Excel.Workbook objWB = null;
    objXL = new Microsoft.Office.Interop.Excel.Application();
    objWB = objXL.Workbooks.Open(path);
    Microsoft.Office.Interop.Excel.Worksheet objSHT = objWB.Worksheets[worksheetindex];

    int rows = objSHT.UsedRange.Rows.Count;
    int cols = objSHT.UsedRange.Columns.Count;
    System.Data.DataTable dt = new System.Data.DataTable();
            
    // Change that for other column names
    for (int c = col; c <= col + colamount; c++)
    {
        dt.Columns.Add(objSHT.Cells[row, c].Text);
    }        
    // read the content
    for (int r = row; r <= row+rowamount; r++)
    {
        DataRow dr = dt.NewRow();
        for (int c = col; c <= col+colamount; c++)
        {
            dr[c - 1] = objSHT.Cells[r, c].Text;
        }
        dt.Rows.Add(dr);
    }

    objWB.Close();
    objXL.Quit();
    return dt;
}

Call it like that:像这样称呼它:

// A2 -> row:2,col:1 till F6 row:2+4, col1+5
READExcel(@"path", 2, 1, 4, 5, 3);

The faster way would be using Value2, example: var range = xlWorksheet.Range["A3", "B4"].Value2;更快的方法是使用 Value2,例如: var range = xlWorksheet.Range["A3", "B4"].Value2; (get_Range() doesn't work with my excel) and iterate over it, filling the DataTable. (get_Range() 不适用于我的 excel)并对其进行迭代,填充 DataTable。 range[1,1] would be the content of A3 in this example. range[1,1]在本例中将是 A3 的内容。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM