0

帮我写代码,因为我现在不知道如何完成这个简单的任务。如何从excel文件中选择10个随机行?

        string filepath = @"C:\1.xlsx";
        OleDbConnection conn = new OleDbConnection();
        conn.ConnectionString = @"Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" + filepath + @";Extended Properties=""Excel 12.0 Xml;HDR=YES;IMEX=1;TypeGuessRows=0;ImportMixedTypes=Text""";
        OleDbCommand command = new OleDbCommand("SELECT * FROM [Sheet1$]", conn);
        DataSet ds = new DataSet();
        OleDbDataAdapter adapter = new OleDbDataAdapter(command);
        adapter.Fill(ds);
        showdata.DataSource = ds.Tables[0];
4

2 回答 2

0

如果您在 Windows 窗体上创建名为 的 DataGridView,请RandomExcelRows创建一个名为的按钮button1并将以下代码放入Click事件处理程序中button1

private void button1_Click(object sender, EventArgs e)
{
    Excel.Range[] rows = RandomRows(10, @"C:\test\whatever.xlsx");

    DataTable dt = new DataTable();

    bool ColumnsCreated = false;

    foreach(Excel.Range row in rows)
    {
        object[,] values = row.Value;

        int columnCount = values.Length;

        if(!ColumnsCreated)
        {
            for(int i = 0; i < columnCount; i++)
            {
                DataColumn dc = new DataColumn(String.Format("Column {0}", i));
                dt.Columns.Add(dc);
                ColumnsCreated = true;
            }
        }

        DataRow dr = dt.NewRow();

        for (int i = 0; i < columnCount; i++)
        {
            dr[String.Format("Column {0}", i)] = values[1,i+1];
        }

        dt.Rows.Add(dr);
    }

    RandomExcelRows.DataSource = dt;
}

然后在下面创建一个名为RandomRows的方法,其中包含以下内容:

private Excel.Range[] RandomRows(int randomRowsToGet, string worksheetLocation, int worksheetNumber = 1, int lowestRow = 0, int highestRow = 99)
{
    Excel.Range[] rows = new Excel.Range[randomRowsToGet];

    Excel.Application excel = new Excel.Application();
    Excel.Workbook workbook = excel.Workbooks.Open(worksheetLocation);
    Excel.Worksheet worksheet = workbook.Worksheets[worksheetNumber];

    List<int> rowNumbers = new List<int>();

    bool allUniqueNumbers = false;

    Random random = new Random();

    while (!allUniqueNumbers)
    {
        int nextNumber = random.Next(lowestRow, highestRow);

        if (!rowNumbers.Contains(nextNumber))
            rowNumbers.Add(nextNumber);

        if (rowNumbers.Count == randomRowsToGet)
            allUniqueNumbers = true;
    }

    for (int i = 0; i < randomRowsToGet; i++)
    {
        rows[i] = worksheet.UsedRange.Rows[rowNumbers[i]];
    }

    Marshal.ReleaseComObject(excel);

    return rows;
}

该程序将从您指定的电子表格中获取随机数量的行(此数量由您指定)并将这些行放入您的 DataGridView。

它非常粗糙,需要重构,但它是您需要的基础。您还可以从文本框中获取包含文件位置的字符串,而不是对其进行硬编码,您想要的行数以及其他参数(例如最小行数和最大行数)也是如此。

同样,您可以使用OpenFileDialog来允许您的用户浏览到您的 excel 文件等。

于 2012-09-20T15:01:38.430 回答
0

这是我的解决方案:

        string filepath = @"C:\1.xlsx";
        OleDbConnection conn = new OleDbConnection();
        conn.ConnectionString = @"Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" + filepath + @";Extended Properties=""Excel 12.0 Xml;HDR=YES;IMEX=1;TypeGuessRows=0;ImportMixedTypes=Text""";
        OleDbCommand command = new OleDbCommand("SELECT * FROM [Sheet1$]", conn);
        DataSet ds = new DataSet();
        OleDbDataAdapter adapter = new OleDbDataAdapter(command);
        adapter.Fill(ds);
        // above code block is yours as is.
        // below part is for sorting.

        DataTable data = ds.Tables[0];
        data.Columns.Add(new DataColumn("Guid"));
        for (int i = 0; i < data.Rows.Count; i++)
        {
            data.Rows[i].SetField("Guid", Guid.NewGuid());
        }
        DataView dv = data.DefaultView;
        dv.Sort = "Guid desc";            
        showdata.DataSource = dv.ToTable();
于 2015-05-22T23:07:46.113 回答