从Excel工作表添加列到WinForms

时间:2017-09-07 07:30:49

标签: c# excel winforms excel-interop

我在我的智慧结束,试图解决这个问题!

我有两个(看似相关的)问题:

问题1 - 我有一张包含一张工作表的Excel表格。我在Form1中有一个浏览按钮,用于浏览Excel工作表。这一切都运作良好。当我单击“确定”按钮时,它会打开Form2,这也是正确的。在Form2_Load事件中,我编写了代码来处理我需要使用Excel工作表执行的逻辑(这是问题#2)。当我在“浏览”窗口中单击“确定”时,它还会打开Excel工作表,这是我不想要的。这是整个事情的代码:

Excel.Application xlAppl = new Excel.Application();

xlAppl.Visible = true;

Excel.Workbook myWorkbook = xlAppl.Workbooks.Open(Form1.globalClass.GlobalVar); //Gets the path to the excel sheet

Excel.Worksheet myWorkSheet = (Excel.Worksheet)myWorkbook.Worksheets[1]; 
Excel.Range range = (Excel.Range)myWorkSheet.Columns[1];

if(myWorkSheet != null) //This is the logic for problem#2 so please discard this for now.

我基本上不想打开Excel表格。你能看出问题所在吗?

第2期 - 浏览Excel工作表后,我希望能够在Form2中的listBox中导入Excel工作表中的第一列。这是我尝试过的:

if(myWorkSheet != null)
{
    int rowCount = myWorkSheet.UsedRange.Rows.Count; //Will count the number of rows of cells with data in the first column

    listBox_CaseNumbers.BeginUpdate();

    for (int i = 1; i <= rowCount; i++)
    {
        try
        {

            //I am not able to get the logic here!

        }

        catch (Exception ex)
        {
             MessageBox.Show(ex.Message + "\n" + ex.StackTrace);
        }
    }
}

如果您需要我提供更多信息,请与我们联系。

2 个答案:

答案 0 :(得分:1)

第一个问题很简单。如果您不想看Excel表格,请不要设置xlApp.Visible = true。

但实际上有一种更简单的方法可以在不加载Excel的情况下做你想做的事情。我从您的问题中了解到,您要做的就是从电子表格中提取数据?在这种情况下使用OleDbDataAdapter,如下所示:

string xlConnStr = @"Provider=Microsoft.ACE.OLEDB.12.0; Data Source=YourXLFilePathAndName;Extended Properties='Excel 8.0;HDR=No;IMEX=1';";

var xlConn = new OleDbConnection(xlConnStr);
var da = new OleDbDataAdapter("SELECT * FROM [Sheet1$]", xlConn);
var xlDT = new DataTable();
da.Fill(xlDT);

现在您将拥有一个包含行和列的DataTable。假设您的电子表格只有一列中的数据,那么DataTable也只有一列。要获取值,只需遍历行。

有一点需要注意:如果您的数据有列标题,那么您需要在连接字符串中设置HDR = Yes。

答案 1 :(得分:0)

第1期 Excel工作表将始终打开。你可以显示它xlAppl.Visible = true;或不是xlAppl.Visible = false; 最后,您需要关闭工作簿Excel:xlAppl.Quit();

第2期 listBox_CaseNumbers.Items.Add(myWorkSheet.Cells [i,indexColumn] .Value);