【问题标题】:Import excel sheet data to datagrid without using oledb在不使用 oledb 的情况下将 excel 工作表数据导入数据网格
【发布时间】:2010-09-15 07:58:52
【问题描述】:

在我的基于 Windows 的应用程序中(C#) 我想导入 excel 表以在 DatatGridView 中显示其数据 我不想使用 oledb

任何帮助

【问题讨论】:

    标签: c# winforms


    【解决方案1】:
        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();
        }
    

    【讨论】:

    • 我怎样才能得到那个参考我无法找到你写的那个特定的参考
    • 我在 C:\Program Files\Microsoft Visual Studio 9.0\Visual Studio Tools for Office\PIA\Office12\Microsoft.Office.Interop.Excel.dll 下有它
    • 它工作得很好,但是我如何分隔每个单元格值并写入网格意味着如果在我的 excel 中我有列作为名称和年龄并且我想显示内容,因为它被单独放置在请问datagridview我可以有鳕鱼吗
    • 试试看,然后 xD。这有点矫枉过正,但可能会奏效。
    【解决方案2】:

    我迟到了,但我有一些值得补充的东西!我尝试了 Juan 的代码,但它没有立即编译。在研究了互联网几个小时后,我对其进行了一些修改,并让它完全按照原始海报的要求进行(因为我需要做同样的事情)。我不得不从其他来源拼凑代码,不幸的是,我没有跟踪我尝试和更改的点点滴滴,因此我无法对此发表太多评论。

    以下代码适用于带有 .NET 3.5 的 Visual Studio 2008。此外,将数据放入数组时格式会丢失(例如,日期变为双精度,需要使用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();
        }
    }
    

    【讨论】:

      【解决方案3】:

      上面的那些代码不起作用。 该代码适用于我(.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();
          }
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2018-04-20
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多