将Excel单元格范围转换为DataTable C# [英] Convert Excel cell range into DataTable C#

查看:60
本文介绍了将Excel单元格范围转换为DataTable C#的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我想在不使用OLEDB的情况下将Excel工作表的选定单元格范围读取到DataTable中.而且我也不想使用第三方工具.

I want to read a selected cell range of Excel sheet into a DataTable without using OLEDB. And I don't want to use 3rd party tools either.

这是我到目前为止所做的:

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();
    }
}

我该如何实现?

在谷歌搜索之后,我最终得到了关注,但我不知道如何使它与像元范围一起工作

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.

推荐答案

它并不完美,您可能需要调整一些参数,我没有检查它是否获得正确的区域,这就是您的工作.但是,按照您的要求,它会从Excel工作表中获取数据表.

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.

我宁愿创建一个以列为属性的自定义对象列表,而不是DataTable,但这仅是我.

I'd prefer creating an custom object list with the columns as properties, rather than a DataTable, but thats only me.

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;
}

这样称呼它:

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

更快的方法是使用Value2,例如: var range = xlWorksheet.Range ["A3","B4"].Value2; (get_Range()与我的擅长)并对其进行迭代,填充DataTable.在此示例中, range [1,1] 将是A3的内容.

The faster way would be using Value2, example: var range = xlWorksheet.Range["A3", "B4"].Value2; (get_Range() doesn't work with my excel) and iterate over it, filling the DataTable. range[1,1] would be the content of A3 in this example.

这篇关于将Excel单元格范围转换为DataTable C#的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆