Как я могу экспортировать DataTable в несколько файлов Excel? - PullRequest
0 голосов
/ 03 июля 2018

У меня есть DataTable в VB.NET со следующими данными:

DataTable data

Теперь я хочу экспортировать данные в Excel с использованием VB.NET, но мне нужен файл Excel для каждого отдельного идентификатора в последнем столбце. Я пытался сделать это, но я всегда получаю 1 файл Excel со всеми данными в нем, вместо 8 разных файлов. Вы можете помочь?

Ответы [ 3 ]

0 голосов
/ 03 июля 2018

Шаги, которые вы можете выполнить:

  • Получить необходимые данные в DataTable.
  • Найдите отдельные идентификаторы и добавьте их в массив.
  • Итерация по этому массиву.
  • На каждой итерации либо добавьте лист в рабочую книгу , либо создайте совершенно новую книгу в определенном месте и используйте первый лист. (согласно вашему требованию)
  • Отфильтруйте таблицу данных, используя идентификатор, который вы нашли во время итерации.
  • Запишите отфильтрованные данные на лист.
  • Повторите для всех идентификаторов.
0 голосов
/ 03 июля 2018

Я делаю что-то похожее в приложении "ежедневные хлопоты", которое я создал для себя. Я пишу DataTable для отдельных текстовых файлов, но основная предпосылка должна быть такой же. Подобно тому, что предлагал @NeverHopeless, я настроил отдельный метод для создания необходимых мне файлов, чтобы я мог перебирать DataTable, и для каждого уникального идентификатора я выполняю этот метод. Следующее, очевидно, очень упрощено и должно быть изменено в соответствии с вашими требованиями, но все основные элементы должны быть там:

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 предназначена только для предотвращения дублирования файлов. Я использую значение «timestamp» (вычитаемое до десятитысячной доли секунды) как несколько надежный способ получить уникальное значение в случае пустых данных.

Метод CreateExcelFile в основном создает пустой файл Excel, а затем перебирает DataRows в вашем массиве (который должен быть только с тем же значением dossiersoort), чтобы заполнить файл. Из вашего OP, похоже, вы уже знаете, как на самом деле создать / заполнить файл, поэтому я не буду вдаваться в подробности. Вы можете легко пройти через массив с помощью простого цикла For...Next, используя значение Integer (For dossier As Integer = 0 To dossierrows.GetUpperBound(0) или что-то в этом роде).

Этот метод может быть Function, возвращающим значение Boolean или File.IO, чтобы убедиться, что файл Excel действительно был создан правильно, или простым Sub с проверкой, которая происходит после того, как он возвращает выполнение в вызывающий метод.

0 голосов
/ 03 июля 2018

Вы можете использовать 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()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...