Sree_Ranga Ответов: 2

У меня есть 10 лакх записей в моей таблице, как экспортировать данные в excel, разделив их на 1 лакх записей в один файл excel.


У меня есть 10 лакх записей в моей таблице, как экспортировать данные в excel, разделив их на 1 лакх записей в один файл Excel.

Если у меня есть 10 лакх записей, если я экспортирую данные с помощью ASP.NET он должен генерировать 10 файлов Excel, содержащих 1 лакх записей.

Я попробовал следующий код, он способен загрузить первые 100 000 записей, после чего он больше не возвращается в цикл, есть ли способ загрузить файл excel в цикле?

Что я уже пробовал:

Я попробовал следующий код, который работает для меня, чтобы экспортировать данные в Excel.

<pre>Protected Sub ExportExcel(ByVal sender As Object, ByVal e As EventArgs)
        Dim constr As String = ConfigurationManager.ConnectionStrings("constr").ConnectionString
        Dim cmd As New SqlCommand

        If txtRows.Text <> String.Empty Then
            rows = txtRows.Text
        End If

        If txtTable.Text <> String.Empty Then
            tbl = txtTable.Text
        End If

        'Dim excelfiles As Integer = dt.Rows.Count / 100000

        If txtfltclmn.Text <> String.Empty AndAlso txtfltclmnval.Text <> String.Empty AndAlso txtTable.Text <> String.Empty Then
            cmd = New SqlCommand("SELECT TOP " & rows & " * FROM " & txtTable.Text & " WHERE " & txtfltclmn.Text & "=" & "'" & txtfltclmnval.Text & "'" & " ")
        ElseIf txtfltclmn.Text = String.Empty AndAlso txtfltclmnval.Text = String.Empty AndAlso txtTable.Text <> String.Empty Then
            cmd = New SqlCommand("SELECT TOP " & rows & " * FROM " & txtTable.Text & " ")
        ElseIf txtfltclmn.Text = String.Empty AndAlso txtfltclmnval.Text = String.Empty AndAlso txtTable.Text = String.Empty Then
            cmd = New SqlCommand("SELECT TOP " & rows & " * FROM " & tbl & " ")
        End If
        Dim con As New SqlConnection(constr)
        con.Open()
        'Using cmd As New SqlCommand("SELECT * FROM " & txtTable.Text & " WHERE " & txtfltclmn.Text & "=" & "'" & txtfltclmnval.Text & "'" & " ")
        Using sda As New SqlDataAdapter()
            cmd.Connection = con
            sda.SelectCommand = cmd
            Using dt As New DataTable()
                sda.Fill(dt)

                Dim i As Integer = 0
                i = dt.Rows.Count / 100000
                For j = 0 To i
                    Dim dtfind As DataTable = dt.AsEnumerable().Skip(j * 100000).Take(100000).CopyToDataTable()
                    If dtfind.Rows.Count > 0 Then
                        Using wb As New XLWorkbook()
                            wb.Worksheets.Add(dtfind, "TSTRAN")
                            Response.Clear()
                            Response.Buffer = True
                            Response.Charset = ""
                            Response.ContentType = "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet"
                            Response.AddHeader("content-disposition", "attachment;filename=" & tbl & "_" & j & ".xlsx")
                            Using MyMemoryStream As New MemoryStream()
                                wb.SaveAs(MyMemoryStream)
                                MyMemoryStream.WriteTo(Response.OutputStream)
                                Response.Flush()
                                Response.End()
                            End Using
                        End Using
                    End If
                    j = j + 1
                Next
            End Using
        End Using
        
        con.Close()
        'End Using
        'End Using
    End Sub

2 Ответов

Рейтинг:
2

Patrice T

cmd = New SqlCommand("SELECT TOP " & rows & " * FROM " & txtTable.Text & " WHERE " & txtfltclmn.Text & "=" & "'" & txtfltclmnval.Text & "'" & " ")

Не решение вашего вопроса, а еще одна проблема, которая у вас есть.
Никогда не создавайте SQL-запрос путем объединения строк. Рано или поздно вы сделаете это с помощью пользовательских вводов, и это откроет дверь к уязвимости под названием "SQL-инъекция", она опасна для вашей базы данных и подвержена ошибкам.
Одна кавычка в имени - и ваша программа выйдет из строя. Если пользователь вводит имя, например "Брайан О'Коннер", может привести к сбою вашего приложения, это уязвимость SQL-инъекции, и сбой-это наименьшая из проблем, вредоносный пользовательский ввод, и он продвигается к командам SQL со всеми учетными данными.
SQL-инъекция - Википедия[^]
SQL-инъекция[^]
Атаки SQL-инъекций на примере[^]
PHP: SQL-инъекция - руководство пользователя[^]
Шпаргалка по предотвращению инъекций SQL - OWASP[^]


Sree_Ranga

Спасибо за ваше предложение. Я понимаю проблему с SQL-инъекцией. Если есть какой-либо способ загрузить excel, Как разделить каждые 100 000 записей в отдельный файл Excel.

Если 1 000 000 записей должны быть загружены в 10 файлов Excel, содержащих 100 000 записей.

Пожалуйста предложите

CHill60

Я дал вам предложение в решении 1 - вам нужно "пролистать" свои результаты

Рейтинг:
2

CHill60

Техника, которую вы ищете, - это "подкачка" с использованием SQL.

Здесь есть несколько постов на CodeProject, которые объяснят это на примерах - вот стартовый поиск ... просто фильтруйте его, пока не найдете тот, к которому вы можете относиться
Поиск Кодового Проекта[^]