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

2024-03-25

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

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

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

我怎样才能实现这个目标?

谷歌搜索后,我最终得到了以下结果,但我不知道如何使其与单元格范围一起工作

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

请帮助我实现这一目标。


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

我更喜欢创建一个将列作为属性的自定义对象列表,而不是数据表,但这只是我。

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() 不适用于我的 Excel) 并迭代它,填充数据表。range[1,1]在此示例中将是 A3 的内容。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

将 Excel 单元格范围转换为 DataTable C# 的相关文章

随机推荐