在 Visual Studio 2010 中将 Excel 数据导入 DataGridView

     2023-05-07     63

关键词:

【中文标题】在 Visual Studio 2010 中将 Excel 数据导入 DataGridView【英文标题】:Import Excel data to DataGridView in Visual Studio 2010 【发布时间】:2013-07-10 10:43:43 【问题描述】:

请使用以下代码帮助修复将数据从 Excel 文档导入到DataGridView 控件:

private void button5_Click(object sender, EventArgs e)

    Excel.Application app = new Microsoft.Office.Interop.Excel.Application();
    Excel.Workbook workbook =app.Workbooks.Open(@"C:\Users\Admin\Desktop\Dropbox\Vandit's Folder\Internship\test.xlsx");
    Excel.Worksheet worksheet = workbook.ActiveSheet;

    rcount = worksheet.UsedRange.Rows.Count;

    int i = 0;

    for(;i<rcount;i++)
    
        dataGridView1.Rows[i].Cells["Column1"].Value = worksheet.Cells[i + 1, 1].Value;
        dataGridView1.Rows[i].Cells["Column2"].Value = worksheet.Cells[i + 1, 2].Value;
    

当我运行这段代码时,我总是得到一个异常提示

"Index was out of range. Must be non-negative and less than the size of the collection."
"Parameter name: index."

【问题讨论】:

看,rowcountdataGridView1 为 0。因此,当调用 dataGridView1.Rows[i].Cells["Column1"].Value 时,未找到 Rows[0] 并引发异常。代码在这里所做的是修改数据网格中单元格的现有值,这些值尚不存在。所以请不要修改插入数据到数据网格中。 【参考方案1】:

假设dataGridView1 有 2 列,

private void button5_Click(object sender, EventArgs e)

    Excel.Application app = new Microsoft.Office.Interop.Excel.Application();
    Excel.Workbook workbook =app.Workbooks.Open(@"C:\Users\Admin\Desktop\Dropbox\Vandit's Folder\Internship\test.xlsx");
    Excel.Worksheet worksheet = workbook.ActiveSheet;

    rcount = worksheet.UsedRange.Rows.Count;

    int i = 0;        

    for(;i<rcount;i++)
    
        //dataGridView1.Rows[i].Cells["Column1"].Value = worksheet.Cells[i + 1, 1].Value;
        //dataGridView1.Rows[i].Cells["Column2"].Value = worksheet.Cells[i + 1, 2].Value;
        dataGridView1.Rows.Add(worksheet.Cells[i + 1, 1].Value, worksheet.Cells[i + 1, 2].Value);
    

假设dataGridView1 有 0 列,

private void button5_Click(object sender, EventArgs e)

    Excel.Application app = new Microsoft.Office.Interop.Excel.Application();
    Excel.Workbook workbook =app.Workbooks.Open(@"C:\Users\Admin\Desktop\Dropbox\Vandit's Folder\Internship\test.xlsx");
    Excel.Worksheet worksheet = workbook.ActiveSheet;

    rcount = worksheet.UsedRange.Rows.Count;

    int i = 0;

    //Initializing Columns
    dataGridView1.ColumnCount = worksheet.UsedRange.Columns.Count;
    for(int x=0;x<dataGridView1.ColumnCount;x++)
    
            dataGridView1.Columns[x].Name = "Column "+x.ToString();
    

    for(;i<rcount;i++)
    
        //dataGridView1.Rows[i].Cells["Column1"].Value = worksheet.Cells[i + 1, 1].Value;
        //dataGridView1.Rows[i].Cells["Column2"].Value = worksheet.Cells[i + 1, 2].Value;
        dataGridView1.Rows.Add(worksheet.Cells[i + 1, 1].Value, worksheet.Cells[i + 1, 2].Value);
    

【讨论】:

我很高兴...谢谢它的工作,因为我忘了提到我手动编写了更改并且没有测试它们。 :)【参考方案2】:

你可以像下面这样添加行

for(int i=0;i<rcount;i++)

 dataGridView1.Rows.Add(orksheet.Cells[i + 1, 1].Value,  worksheet.Cells[i + 1, 2].Value);

您正在做的是设置gridview 现有行的值。如果gridview没有索引给出的行那么你会得到异常

但如果没有这些,您可以使用 Ado.net 并从 excel 中读取数据并将其绑定到 gridview。从KB article查看下面的示例代码

// Create connection string variable. Modify the "Data Source"
// parameter as appropriate for your environment.
String sConnectionString = "Provider=Microsoft.Jet.OLEDB.4.0;" +
    "Data Source=" + Server.MapPath("../ExcelData.xls") + ";" +
    "Extended Properties=Excel 8.0;";

// Create connection object by using the preceding connection string.
OleDbConnection objConn = new OleDbConnection(sConnectionString);

// Open connection with the database.
objConn.Open();

// The code to follow uses a SQL SELECT command to display the data from the worksheet.

// Create new OleDbCommand to return data from worksheet.
OleDbCommand objCmdSelect =new OleDbCommand("SELECT * FROM myRange1", objConn);

// Create new OleDbDataAdapter that is used to build a DataSet
// based on the preceding SQL SELECT statement.
OleDbDataAdapter objAdapter1 = new OleDbDataAdapter();

// Pass the Select command to the adapter.
objAdapter1.SelectCommand = objCmdSelect;

// Create new DataSet to hold information from the worksheet.
DataSet objDataset1 = new DataSet();

// Fill the DataSet with the information from the worksheet.
objAdapter1.Fill(objDataset1, "XLData");

// Bind data to DataGrid control.
DataGrid1.DataSource = objDataset1.Tables[0].DefaultView;
DataGrid1.DataBind();

// Clean up objects.
objConn.Close();

【讨论】:

【参考方案3】:

此错误意味着引发错误的索引在gridview中不存在或您的excel文件中缺少列。

datagridView 中的索引数必须等于您为 datagridview 发送的字段数。

【讨论】:

【参考方案4】:

试试下面的代码

 DialogResult dialogResult = MessageBox.Show("Sure", "Some  Title",MessageBoxButtons.YesNo);

if (dialogResult == DialogResult.Yes)



    dt = dsSource.Tables[Index];

    dt.Reset();
    Excel.Workbook workbook;
    Excel.Worksheet NwSheet;
    Excel.Range ShtRange;
    Microsoft.Office.Interop.Excel.Application ExcelObj = new                 Microsoft.Office.Interop.Excel.Application();
    OpenFileDialog filedlgExcel = new OpenFileDialog();
    filedlgExcel.Title = "Select file";
    filedlgExcel.InitialDirectory = @"c:\";
    //filedlgExcel.FileName = textBox1.Text;
    filedlgExcel.Filter = "Excel Sheet(*.xlsx)|*.xlsx|All Files(*.*)|*.*";
    filedlgExcel.FilterIndex = 1;
    filedlgExcel.RestoreDirectory = true;
    if (filedlgExcel.ShowDialog() == DialogResult.OK)
    

        workbook = ExcelObj.Workbooks.Open(filedlgExcel.FileName, Missing.Value, Missing.Value,
             Missing.Value, Missing.Value, Missing.Value, Missing.Value, Missing.Value, Missing.Value,
             Missing.Value, Missing.Value, Missing.Value, Missing.Value, Missing.Value, Missing.Value);

        NwSheet = (Excel.Worksheet)workbook.Sheets.get_Item(1);
        ShtRange = NwSheet.UsedRange;
        for (int Cnum = 1; Cnum <= ShtRange.Columns.Count; Cnum++)
        
            dt.Columns.Add(new DataColumn((ShtRange.Cells[1, Cnum] as Excel.Range).Value2.ToString()));
        
        dt.AcceptChanges();
        string[] columnNames = new String[dt.Columns.Count];
        for (int i = 0; i < dt.Columns.Count; i++)
        
            columnNames[0] = dt.Columns[i].ColumnName;
        
        //string[] columnNames = (from dc in dt.Columns.Cast<DataColumn>() select dc.ColumnName).ToArray();


        for (int Rnum = 2; Rnum <= ShtRange.Rows.Count; Rnum++)
        
            DataRow dr = dt.NewRow();
            for (int Cnum = 1; Cnum <= ShtRange.Columns.Count; Cnum++)
            
                if ((ShtRange.Cells[Rnum, Cnum] as Excel.Range).Value2 != null)
                
                    dr[Cnum - 1] = (ShtRange.Cells[Rnum, Cnum] as Excel.Range).Value2.ToString();
                
            
            dt.Rows.Add(dr);
            dt.AcceptChanges();
        
        workbook.Close(true, Missing.Value, Missing.Value);
        ExcelObj.Quit();

        dataGridView1.DataSource = dt;  

【讨论】:

在 Visual Studio 2010 中将输出消息写入“输出窗口”的最简单方法?

】在VisualStudio2010中将输出消息写入“输出窗口”的最简单方法?【英文标题】:Simplestwaytowriteoutputmessageto\'outputwindow\'inVisualStudio2010?【发布时间】:2010-07-0511:45:59【问题描述】:我已经尝试过OutputDebugString函数,但大多数时候我... 查看详情

在 Visual Studio 2010 负载测试用户包中将用户数升级到 250 或更多

】在VisualStudio2010负载测试用户包中将用户数升级到250或更多【英文标题】:Upgradeusercountto250ormoreinvisualstudio2010loadtestuserpack【发布时间】:2014-08-0714:04:36【问题描述】:我有VisualStudio2010许可证版本,但我只能添加250个用户负载,... 查看详情

如何在 Visual Studio 2010 Express 中将 cpp 编译为 dll

】如何在VisualStudio2010Express中将cpp编译为dll【英文标题】:Howtocompileacpptoadllinvisualstudio2010express【发布时间】:2011-06-0906:28:05【问题描述】:我有一个cpp,它依赖于同一文件夹中的几个标题。我需要将此cpp编译为dll。我如何在Visua... 查看详情

如何在 Visual Studio Web 2010 Express 中将 XNA 内容管道添加到 Silverlight 5?

】如何在VisualStudioWeb2010Express中将XNA内容管道添加到Silverlight5?【英文标题】:HowtoaddXNAContentPipelinetoSilverlight5inVisualStudioWeb2010Express?【发布时间】:2012-05-2809:59:42【问题描述】:TheSilverlight5XNAsamples,我认为是在VisualStudioProfessional... 查看详情

无法在 Visual Studio 2015 中将 typedef 转换为 std::pair

】无法在VisualStudio2015中将typedef转换为std::pair【英文标题】:Cannotconverttypedeftostd::pairinVisualStudio2015【发布时间】:2015-11-3011:36:44【问题描述】:我尝试将一些项目从VisualStudio2010升级到2015。在2010中一切正常,但在2015中,我遇到... 查看详情

如何在 Visual Studio 2010 中使用互斥锁

】如何在VisualStudio2010中使用互斥锁【英文标题】:howtousemutexinvisualstudio2010【发布时间】:2014-06-1807:04:23【问题描述】:我将我的项目从VisualStudio2012更改为2010。但互斥锁在VisualStudio2010中不起作用。在MSDN页面中提到VC++10不支持互... 查看详情

在 Visual Studio 中将“.inc”文件添加到汇编语言项目中

】在VisualStudio中将“.inc”文件添加到汇编语言项目中【英文标题】:Addan`.inc`filetoanassemblylanguageprojectinVisualStudio【发布时间】:2013-04-2403:58:55【问题描述】:在VisualStudio2010中,如何将.inc文件添加到汇编语言项目中?在这里,我... 查看详情

如何在 Visual Studio 2010 中使用 Crystal Reports 创建报表

】如何在VisualStudio2010中使用CrystalReports创建报表【英文标题】:HowToCreateReportsUsingCrystalReportsinVisualStudio2010【发布时间】:2011-10-2014:19:23【问题描述】:我是VisualStudio2010C#的新手。我正在创建一个创建报告的应用程序。报告中将... 查看详情

如何在 Visual Studio 中将 Dll 添加到 MFC 应用程序

】如何在VisualStudio中将Dll添加到MFC应用程序【英文标题】:HowToAddaDllTOMFCApplicationinvisualStudio【发布时间】:2017-10-1807:55:46【问题描述】:我在VisualStudio2010中有一个MFCGUI应用程序项目。我想与微型电路信号发生器设备进行通信。... 查看详情

在 Visual Studio 2008 中将应用程序构建为发行版时出现问题 - C++

】在VisualStudio2008中将应用程序构建为发行版时出现问题-C++【英文标题】:ProblemsBuildingApplicationasReleaseinVisualStudio2008-C++【发布时间】:2010-12-1415:30:12【问题描述】:我在VisualStudio2008中将我的应用程序构建为Release时遇到了一点问... 查看详情

如何在 Visual Studio 中将 common/inc 文件夹添加到 CUDA 项目?

】如何在VisualStudio中将common/inc文件夹添加到CUDA项目?【英文标题】:Howtoaddcommon/incfoldertoaCUDAprojectatVisualStudio?【发布时间】:2011-12-2401:33:50【问题描述】:我想使用CUDA开发gpu计算算法。我正在使用VisualStudio2010终极版。在我安装... 查看详情

Visual Studio 中将整数显示为位数组的方式

】VisualStudio中将整数显示为位数组的方式【英文标题】:WayinVisualStudiotodisplayintegersasbitarray【发布时间】:2010-01-2211:36:35【问题描述】:VisualStudio中是否有办法通过其本机功能或插件在调试器窗口中将整数/长/字符变量显示为位... 查看详情

Visual Studio 2010 并排运行时丢失用户设置

】VisualStudio2010并排运行时丢失用户设置【英文标题】:VisualStudio2010losesusersettingswhenrunsidebyside【发布时间】:2012-02-2006:57:24【问题描述】:自从一段时间以来,我在WindowsVista下的VisualStudio2010SP1中注册了一个烦人的行为。有时我... 查看详情

为啥 Visual Studio 2010 (msbuild?) 构建速度不快?

】为啥VisualStudio2010(msbuild?)构建速度不快?【英文标题】:whydoesn\'tVisualStudio2010(msbuild?)buildfaster?为什么VisualStudio2010(msbuild?)构建速度不快?【发布时间】:2011-07-1603:15:55【问题描述】:通常在VisualStudio2010中构建包含多个项目的大... 查看详情

将 C++/MFC 从 Visual Studio.net 2002 转换为 Visual Studio 2010

】将C++/MFC从VisualStudio.net2002转换为VisualStudio2010【英文标题】:ConvertC++/MFCfromvisualstudio.net2002tovisualstudio2010【发布时间】:2010-06-0410:01:29【问题描述】:我们将在VisualStudio.NET2002中将一些用C++和MFC编写的程序转换为VisualStudio2010。预... 查看详情

MS Visual Studio 2010 如何使用 .asm 生成的文件

】MSVisualStudio2010如何使用.asm生成的文件【英文标题】:MSVisualStudio2010howtousethe.asmgeneratedfile【发布时间】:2011-10-1122:05:10【问题描述】:我想问一些我正在考虑尝试使用VisualStudio2010的事情。我通过在项目属性-->C/C++-->输出文... 查看详情

如何在 Visual Studio 2010 中打开对话框编辑器

】如何在VisualStudio2010中打开对话框编辑器【英文标题】:howtoopentheDialogeditorinvisualstudio2010【发布时间】:2012-07-0520:00:22【问题描述】:我创建了一个简单的项目,它从对话框编辑器开始向表单添加控件。我关闭了对话框编辑器... 查看详情

在 Visual Studio 中将多行代码格式化为单行

】在VisualStudio中将多行代码格式化为单行【英文标题】:FormatmultilinecodetosinglelineinVisualStudio【发布时间】:2014-08-0401:39:19【问题描述】:在VisualStudio2013中是否有键盘快捷键或快速方法可以将以下代码更改为单行?我也安装了ReSha... 查看详情