如何将DataTable导出到多个Excel文件?

时间:2018-07-03 12:59:39

标签: excel vb.net datatable

我在VB.NET中有一个数据表,其中包含以下数据:

DataTable data

现在,我想使用VB.NET将数据导出到Excel,但是我需要在最后一列中为每个不同的ID提供一个Excel文件。我尝试这样做,但是我总是得到1个包含所有数据的Excel文件,而不是8个不同的文件。你能帮忙吗?

3 个答案:

答案 0 :(得分:1)

您可以使用EPPlus,甚至可以从DataTable导出它。 ws.Cells["A1"].LoadFromDataTable(dataTable, true);

您使用LINQ获得表:

Dim allTableList As List(Of DataTable) = yourTable.AsEnumerable().
    GroupBy(Function(row) row.Field(Of Int32)("Dossiersort")).
    Select(Function(rowGrp) rowGrp.CopyToDataTable()).
    ToList()

答案 1 :(得分:1)

您可以遵循的步骤:

  • 在数据表中获取所需的数据。
  • 找到不同的ID,并将其添加到数组中。
  • 遍历此数组。
  • 在每次迭代中, 在工作簿中添加工作表,或者在特定位置创建一个全新的工作簿并使用第一张工作表。 (根据您的要求)
  • 使用在迭代过程中找到的ID过滤数据表。
  • 将过滤后的数据写到工作表中。
  • 重复所有不同的ID。

答案 2 :(得分:0)

我在为自己构建的“日常琐事”应用程序中执行了类似的操作。我正在写DataTable来分隔文本文件,但是基本前提应该是相同的。与@NeverHopeless提出的类似,我设置了一个单独的方法来实际生成所需的文件,以便可以遍历DataTable,并针对每个唯一的ID执行此方法。以下内容显然非常简化,需要进行修改以满足您的要求,但是基本元素都应该存在:

Dim MyData As DataTable = GetMyData()
Dim tempdossier As String = Now.ToString("yyyyMMddHHmmssffffzz")

For Each Row As DataRow In MyData.Rows
    If Not IsDBNull(Row("dossiersoort")) AndAlso Not String.IsNullOrEmpty(Row("dossiersoort").ToString) Then
        If Row("dossiersoort").ToString <> tempdossier then
            Dim dossierrows() As DataRow

            dossierrows = MyData.Select("dossiersoort = '" & Row("dossiersoort").ToString & "'")
            CreateExcelFile(dossierrows)
        End If

        tempdossier = Row("dossiersoort").ToString
    Else
        tempdossier = Now.ToString("yyyyMMddHHmmssffffzz")
    End If
Next Row

tempdossier变量仅用于防止其创建重复文件。我将“时间戳”值(取到十分之一秒)用作在空数据情况下获取唯一值的一种可靠方法。

CreateExcelFile方法将基本上创建一个空的Excel文件,然后循环遍历数组中的DataRows(只能是具有相同dossiersoort值的数组)以填充文件。在您的OP中,听起来您已经知道如何实际创建/填充文件,所以我不再赘述。您可以使用For...Next值(Integer或类似值)通过简单的For dossier As Integer = 0 To dossierrows.GetUpperBound(0)循环轻松遍历数组。

此方法可以是返回Function值的Boolean或可以确保正确创建Excel文件的File.IO对象,也可以是带有{验证发生在将执行返回给调用方法之后。