如何将VB.net与Excel工作表一起使用来对数据进行计数和sorting

就像标题所说,我一直在使用VB.NET在Excel上做各种事情,有点新。 如果我有一张Excel表格,其中包含员工和事物等各种数据,我如何select2列并对其进行sorting,以便每个人将每件商品的销售数量分配到一个消息框或列表框中?

例如,我正在寻找的输出是类似的

Staff Sold how many NAME1 - PRODUCT1 - AMOUNTSOLDBYNAME1 NAME1 - PRODUCT2 - AMOUNTSOLDBYNAME1 NAME1 - PRODUCT3 - AMOUNTSOLDBYNAME1 NAME1 - PRODUCT4 - AMOUNTSOLDBYNAME1 NAME2 - PRODUCT1 - AMOUNTSOLDBYNAME2 NAME2 - PRODUCT2 - AMOUNTSOLDBYNAME2 and so on... 

我得到的最远的是每个员工中有多less人在1列,但我想进一步在这个并获得2列,并计算每个人销售的每个产品,但不清楚如何去做。

 Private Sub getexcelfile_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button3.Click Dim excelfile As New OpenFileDialog() excelfile.ShowDialog() If (excelfile.ShowDialog() = DialogResult.Cancel) Then Return Else Dim file As String = excelfile.FileName Dim xlApp As Excel.Application Dim xlWorkBook As Excel.Workbook Dim xlWorkSheet As Excel.Worksheet xlApp = New Excel.Application xlWorkBook = xlApp.Workbooks.Open(file) xlWorkSheet = xlWorkBook.Worksheets("PSSalesFullConnectionReport") Dim col As String = "N" For row As Integer = 1 To xlWorkSheet.UsedRange.Rows.Count - 1 Dim elemValue As String = xlWorkSheet.Range(col & row).Text ListBox1.Items.Add(elemValue) Next MessageBox.Show(ReturnDuplicateListBoxItems(ListBox1)) ListBox1.Items.Clear() End If End Sub Public Shared Function ReturnDuplicateListBoxItems(ByVal lBox As System.Windows.Forms.ListBox) As String Dim strReturn As New System.Text.StringBuilder Dim lItems As New Dictionary(Of String, Integer) Dim intCount As Integer = 0 Dim strCurrentItem As String = String.Empty Try For Each nItem As String In lBox.Items If Not (lItems.ContainsKey(nItem)) Then strCurrentItem = nItem For Each sItem As String In lBox.Items If sItem.Equals(strCurrentItem) Then intCount += 1 End If Next lItems.Add(nItem, intCount) intCount = 0 strCurrentItem = String.Empty End If Next For i As Integer = 0 To lItems.Count - 1 strReturn.AppendLine(lItems.Keys(i).ToString & " - " & lItems.Values(i).ToString) Next Catch ex As Exception Return strReturn.ToString End Try Return strReturn.ToString End Function 

任何关于这方面的指导将帮助我很多

答案略有延迟,但这里是从Interop创build数据透视表的相关代码(对不起,这是C#),然后使用该数据透视表来总结结果。 这很好,因为一旦数据透视表完成,你就知道你已经sorting了所有唯一的条目。 然后,您可以迭代数据透视表来获得所需的结果。 在某些情况下,这可能比构build.NET方面的所有逻辑更容易,因为Excel非常擅长聚合数据。 缺点是你必须创build数据透视表。

这是完整的代码来创build虚拟数据,并总结尽可能通用。

 //up above is a namespace usage that defines: //using Excel = Microsoft.Office.Interop.Excel; private void button1_Click(object sender, EventArgs e) { Excel.Application xl_app = new Excel.Application(); Excel.Workbook wkbk = xl_app.Workbooks.Add(); Excel.Worksheet sht = wkbk.Worksheets[1]; xl_app.Visible = true; //create some dummy data... not using an array.. I know Random rnd = new Random(); int rows = 100; for (int i = 0; i < rows; i++) { sht.Cells[2 + i, 1].Value = "NAME" + rnd.Next(5); sht.Cells[2 + i, 2].Value = "PROD" + rnd.Next(5); sht.Cells[2 + i, 3].Value = rnd.Next(10); } sht.Cells[1, 1].Value = "STAFF"; sht.Cells[1, 2].Value = "SOLD"; sht.Cells[1, 3].Value = "HOW MANY"; //create the pivot table Excel.PivotCache pc = wkbk.PivotCaches().Add( Excel.XlPivotTableSourceType.xlDatabase, sht.get_Range("A1").CurrentRegion); Excel.PivotTable pt = sht.PivotTables().Add(pc, sht.get_Range("F1")); pt.PivotFields("STAFF").Orientation = Excel.XlPivotFieldOrientation.xlRowField; pt.PivotFields("SOLD").Orientation = Excel.XlPivotFieldOrientation.xlRowField; pt.AddDataField(pt.PivotFields("HOW MANY"), Type.Missing, Excel.XlConsolidationFunction.xlSum); //formatting here ensures it is a table with no extra values foreach (Excel.PivotField pf in pt.PivotFields()) { pf.Subtotals[1] = false; } pt.ColumnGrand = false; pt.RowGrand = false; pt.RowAxisLayout(Excel.XlLayoutRowType.xlTabularRow); pt.RepeatAllLabels(Excel.XlPivotFieldRepeatLabels.xlRepeatLabels); //now we need to go through the Pivot Table to get data Excel.Range rng_start = sht.get_Range("F3"); foreach (Excel.Range rng_cell in sht.get_Range( rng_start, rng_start.get_End(Excel.XlDirection.xlDown))) { Console.WriteLine("{0} - {1} - {2}", rng_cell.Value, rng_cell.get_Offset(0, 1).Value, rng_cell.get_Offset(0, 2).Value); } } 

由此产生的Workbook图片在侧面的枢轴表:

在这里输入图像说明

控制台输出包括具有结果的行。 显示的是最后几行:

 ... NAME4 - PROD0 - 7 NAME4 - PROD1 - 11 NAME4 - PROD2 - 10 NAME4 - PROD3 - 17 NAME4 - PROD4 - 23