Member 12736337 Ответов: 4

Как загрузить табличные данные базы данных SQL в лист excel с помощью C#?


if (txtbatch.Text != "" && txtp.Text == "1")
    {
        DataColumnCollection dcc = dt.Columns;
        Microsoft.Office.Interop.Excel.ApplicationClass ExcelApp = new Microsoft.Office.Interop.Excel.ApplicationClass();
        ExcelApp.Application.Workbooks.Add(Type.Missing);
        for (int i = 1; i < dt.Rows.Count + 1; i++)
        {
            for (int j = 1; j < dt.Columns.Count + 1; j++)
            {
                if (i == 1)
                {
                    ExcelApp.Cells[i, j] = dcc[j - 1].ToString();
                }
                else { ExcelApp.Cells[i, j] = dt.Rows[i - 1][j - 1].ToString();
                }

            }
        }
        ExcelApp.ActiveWorkbook.SaveCopyAs("D:\\Export\\StudentRegistation.xls");
        ExcelApp.ActiveWorkbook.Saved = true;
        ExcelApp.Quit();
        lbl2.Visible = true;
        lbl2.Text = "Students Registation File Pilot1 Successfuly Downloaded...!";
    }
    else
    {
        lbl2.Text = "No Record found...!";
    }
}


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

Используя этот код я не могу получить первую запись в листе excel остальную часть записи которую я получаю я не могу понять может ли кто нибудь мне помочь

4 Ответов

Рейтинг:
2

Kraule

Лучше использовать:

для (int i = 0; i < dt.строк.Граф; i++)
{
для столбцов (int j = 0; j < dt.Count; j++)
{
................

}
}

или посмотреть здесь: База знаний Mikes - экспорт в Excel[^]


Рейтинг:
1

Vincent Maverick Durano

Цитата:
Используя этот код я не могу получить первую запись в листе excel


Вы не получаете первую запись, потому что ваш цикл начинается с 1, как показано ниже:

for (int j = 1; j < dt.Columns.Count + 1; j++)


и тогда у вас есть следующий код внутри него:

ExcelApp.Cells[i, j] = dcc[j - 1].ToString();


Имейте в виду, что индекс Cells начинается с 0 поэтому я думаю, что это вызывает проблему, почему вы не видите первую запись. Попробуйте вместо этого что-нибудь вроде этого:
if (i == 1)
                {
                    ExcelApp.Cells[i-1, j-1] = dcc[j - 1].ToString();
                }
                else { ExcelApp.Cells[i-1, j-1] = dt.Rows[i - 1][j - 1].ToString();
                }


Или вы можете изменить свой цикл, чтобы он начинался с 0 вместо 1, так что ваш код теперь будет выглядеть примерно так:
for (int i = 0; i < dt.Rows.Count; i++)
        {
            for (int j = 0; j < dt.Columns.Count; j++)
            {
                if (i == 0)
                {
                    ExcelApp.Cells[i, j] = dcc[j].ToString();
                }
                else { ExcelApp.Cells[i, j] = dt.Rows[i][j].ToString();
                }

            }
        }


Если вы все еще получаете неожиданные результаты, я бы посоветовал вам отладить свой код, установить точку останова для вашего кода for-loop, а затем войти в него, чтобы выяснить, какие данные транспортируются.


Рейтинг:
0

RickZeeland

Вы могли бы использовать EPPlus библиотека, для этого не нужны никакие зависимости, кроме .NET:
GitHub - JanKallman/EPPlus: создание расширенных электронных таблиц Excel с использованием .NET[^]


Рейтинг:
0

Richard Deeming

Вы отметили этот вопрос как ASP.NET, что означает, что ваш код имеет несколько проблем.

Во-первых, вы не можете использовать Office Interop из ASP.NET:

В настоящее время корпорация Майкрософт не рекомендует и не поддерживает автоматизацию приложений Microsoft Office из любого автоматического, неинтерактивного клиентского приложения или компонента (включая ASP, ASP.NET, DCOM и NT Services), поскольку Office может демонстрировать нестабильное поведение и/или взаимоблокировку при запуске Office в этой среде.

Существуют различные способы создания электронных таблиц Excel на сервере без использования Office interop. Например:


Во-вторых, ваш код сохраняет файл Excel на сервере Так оно и есть НЕ загрузка файла на клиент. Может быть появиться чтобы работать, когда вы тестируете его в Visual Studio, но это только потому, что клиент и сервер являются одним и тем же компьютером в данном конкретном случае. Как только вы развернете свой код на реальном сервере, вы получите множество файлов, хранящихся на сервере, и множество сбитых с толку пользователей, которые не могут найти файл, который, как говорит ваш код, только что был загружен.

Чтобы отправить файл клиенту, вам нужно записать его в ответ вместе с правильным content-type заголовок. После этого пользователь сможет выбрать, что делать с файлом.

NB: Вы не можете отправить какой-либо другой контент в ответе.

NB: Вы не можете контролировать, где и даже если пользователь сохраняет файл.