Импорт данных таблицы Excel в таблицу данных без использования oledb - PullRequest
0 голосов
/ 15 сентября 2010

В моем приложении для Windows (C #) я хочу импортировать таблицу Excel, чтобы показать свои данные в DatatGridView я не хочу использовать oledb

любая справка

Ответы [ 3 ]

2 голосов
/ 15 сентября 2010
    using Excel = Microsoft.Office.Interop.Excel;

Вам, очевидно, нужно будет добавить ссылку на ваш проект, и тогда все будет просто:)

    private void ProcessExcel(string filepath)
    {

            Excel.ApplicationClass ExcelObj = new Excel.ApplicationClass();

            Excel.Workbook theWorkbook = ExcelObj.Workbooks.Open(filepath, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing);

            Excel.Sheets sheets = theWorkbook.Worksheets;

            Excel.Worksheet worksheet = (Excel.Worksheet)sheets.get_Item(1);

            Excel.Range range = worksheet.UsedRange;

            System.Array myvalues = (System.Array)range.Cells.Value2;

            int vertical = myvalues.GetLength(0);
            int horizontal = myvalues.GetLength(1);



            string[] headers = new string[horizontal];
            string[] data = new string[horizontal];


            DataTable ResultsHeader = New DataTable();
            DataSet ds = New DataSet();


            for (int x = 1; x <= vertical; x++)
            {
                    Utils.inicializarArrays(datos);
                    for (int y = 1; y <= horizontal; y++)
                    {
                        if (x == 1)
                        {
                            headers[y - 1] = myvalues.GetValue(x, y).ToString();
                        }
                        else
                        {
                            string auxdata = "";
                            if (myvalues.GetValue(x, y) != null)
                                auxdata = myvalues.GetValue(x, y).ToString();
                            data[y - 1] = auxdata;
                        }

                    }
                    if(x == 1) //headers
                    {
                            for(int w = 0; w < horizontal; w++)
                            {
                                    ResultsHeader.Columns.Add(New DataColumn(headers[w], GetType(string)));
                            }
                            ds.Tables.Add(ResultsHeader);
                    }
                    else
                    {
                            DataRow dataRow = ds.Tables[0].NewRow();
                            for(int w = 0; w < horizontal; w++)
                            {
                                    dataRow(headers[w]) = data[w]
                            }
                            ds.Tables[0].Rows.Add(dataRow);
                    }
            }
            DataView myDataView = new DataView();
            myDataView.Table = ds.Tables[0];
            MydataGrid.CurrentPageIndex = 0;
            MydataGrid.DataSource = myDataView;
            MydataGrid.DataBind();
    }
0 голосов
/ 26 марта 2018

Эти коды выше не работают. Этот код работает для меня (.NET Framework 4.7.1)

private void processExcel(string filename)
{
    Excel.Application xlApp;
    Excel.Workbook xlWorkBook;
    Excel.Worksheet xlWorkSheet;

    var missing = System.Reflection.Missing.Value;

    xlApp = new Excel.Application();
    xlWorkBook = xlApp.Workbooks.Open(filename, false, true, missing, missing, missing, true, Excel.XlPlatform.xlWindows, '\t', false, false, 0, false, true, 0);
    xlWorkSheet = (Excel.Worksheet)xlWorkBook.Worksheets.get_Item(1);

    Excel.Range xlRange = xlWorkSheet.UsedRange;
    Array myValues = (Array)xlRange.Cells.Value2;

    int vertical = myValues.GetLength(0);
    int horizontal = myValues.GetLength(1);

    DataTable dt = new DataTable();

    // must start with index = 1
    // get header information
    try
    {
        for (int i = 1; i <= horizontal; i++)
        {
            dt.Columns.Add(new DataColumn(Convert.ToString(myValues.GetValue(1, i))));
        }
    }
    catch (Exception ex)
    {
        MessageBox.Show(ex.ToString());
    }


    // Get the row information
    for (int a = 2; a <= vertical; a++)
    {
        object[] rows = new object[horizontal];
        for (int b = 1; b <= horizontal; b++)
        {
            rows[b - 1] = myValues.GetValue(a, b);
        }
        DataRow row = dt.NewRow();
        row.ItemArray = rows;
        dt.Rows.Add(row);
    }

    // assign table to default data grid view
    dataGridView1.DataSource = dt;

    xlWorkBook.Close(true, missing, missing);
    xlApp.Quit();

    releaseObject(xlWorkSheet);
    releaseObject(xlWorkBook);
    releaseObject(xlApp);
}

private void releaseObject(object obj)
{
    try
    {
        System.Runtime.InteropServices.Marshal.ReleaseComObject(obj);
        obj = null;
    }
    catch (Exception ex)
    {
        obj = null;
        MessageBox.Show("Unable to release the Object " + ex.ToString());
    }
    finally
    {
        GC.Collect();
    }
}
0 голосов
/ 18 мая 2011

Я опаздываю на вечеринку, но мне есть что добавить!Я попробовал код Хуана, и он не компилировался из коробки.Я немного изменил его после исследования интернета в течение нескольких часов и заставил его делать именно то, о чем просил оригинальный постер (поскольку мне нужно было сделать то же самое).Мне пришлось собрать воедино код из других источников, и, к сожалению, я не отслеживал, какие фрагменты я попробовал и изменил, поэтому я не могу много комментировать.

Следующий код работает в Visual Studio2008 с .NET 3.5.Кроме того, форматирование теряется, когда данные помещаются в массив (например, даты становятся двойными, что требует преобразования с DateTime.FromOADate() для их возврата обратно).Проблема в том, что вы не можете определить, является ли значение действительным двойным числом или датой с точки зрения кодирования, но если вы заранее знаете, что столбец будет датой, отформатируйте его, вставив данные встол.

private void processExcel(string filename)
{
    Excel.Application xlApp;
    Excel.Workbook xlWorkBook;
    Excel.Worksheet xlWorkSheet;

    var missing = System.Reflection.Missing.Value;

    xlApp = new Excel.ApplicationClass();
    xlWorkBook = xlApp.Workbooks.Open(filename, false, true, missing, missing, missing, true, Excel.XlPlatform.xlWindows, '\t', false, false, 0, false, true, 0);
    xlWorkSheet = (Excel.Worksheet)xlWorkBook.Worksheets.get_Item(1);

    Excel.Range xlRange = xlWorkSheet.UsedRange;
    Array myValues = (Array)xlRange.Cells.Value2;

    int vertical = myValues.GetLength(0);
    int horizontal = myValues.GetLength(1);

    DataTable dt = new DataTable();

    // must start with index = 1
    // get header information
    for (int i = 1; i <= horizontal; i++)
    {
        dt.Columns.Add(new DataColumn(myValues.GetValue(1,i).ToString()));
    }

    // Get the row information
    for (int a = 2; a <= vertical; a++)
    {
        object[] poop = new object[horizontal];
        for (int b = 1; b <= horizontal; b++)
        {
            poop[b - 1] = myValues.GetValue(a, b);
        }
        DataRow row = dt.NewRow();
        row.ItemArray = poop;
        dt.Rows.Add(row);
    }

    // assign table to default data grid view
    dataGridView1.DataSource = dt;

    xlWorkBook.Close(true, missing, missing);
    xlApp.Quit();

    releaseObject(xlWorkSheet);
    releaseObject(xlWorkBook);
    releaseObject(xlApp);
}

private void releaseObject(object obj)
{
    try
    {
        System.Runtime.InteropServices.Marshal.ReleaseComObject(obj);
        obj = null;
    }
    catch (Exception ex)
    {
        obj = null;
        MessageBox.Show("Unable to release the Object " + ex.ToString());
    }
    finally
    {
        GC.Collect();
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...