Вывод SQL-запроса C # в Excel, не включая добавленные поля в вывод - PullRequest
0 голосов
/ 10 октября 2018

У меня есть небольшой код нажатия кнопки, который выводит SQL-запрос в Excel.

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

Код:

 private void button4_Click(object sender, EventArgs e)
        {
            string SQLQuery = "SELECT * FROM Services";
            SqlConnection conn = new SqlConnection("CONNECTION STRING");
            DataSet ds = new DataSet();
            SqlDataAdapter da = new SqlDataAdapter(SQLQuery, conn);
            da.Fill(ds);
            Microsoft.Office.Interop.Excel.Application ExcelApp = new Microsoft.Office.Interop.Excel.Application();
            Workbook ExcelWorkBook = null;
            Worksheet ExcelWorkSheet = null;
            ExcelApp.Visible = true;
            ExcelApp.WindowState = XlWindowState.xlMinimized;
            ExcelApp.WindowState = XlWindowState.xlMaximized;
            ExcelWorkBook = ExcelApp.Workbooks.Add(XlWBATemplate.xlWBATWorksheet);
            List<string> SheetNames = new List<string>();
            SheetNames.Add("Services Details");
            ExcelApp.ActiveWindow.Activate();
            try
            {
                for (int i = 1; i < ds.Tables.Count; i++)
                    ExcelWorkBook.Worksheets.Add();
                for (int i = 0; i < ds.Tables.Count; i++)
                {
                    int r = 1;
                    ExcelWorkSheet = ExcelWorkBook.Worksheets[i + 1];
                    ExcelWorkSheet.Name = "Services";
                    for (int col = 1; col < ds.Tables[i].Columns.Count; col++)
                        ExcelWorkSheet.Cells[r, col] = ds.Tables[i].Columns[col - 1].ColumnName;
                    r++;
                    for (int row = 0; row < ds.Tables[i].Rows.Count; row++)
                    {
                        for (int col = 1; col < ds.Tables[i].Columns.Count; col++)
                            ExcelWorkSheet.Cells[r, col] = ds.Tables[i].Rows[row][col - 1].ToString();
                        r++;
                    }
                    ExcelWorkSheet.Rows[1].EntireRow.Font.Bold = true;
                    ExcelApp.Columns.AutoFit();
                }
                ExcelApp.Quit();
                Marshal.ReleaseComObject(ExcelWorkSheet);
                Marshal.ReleaseComObject(ExcelWorkBook);
                Marshal.ReleaseComObject(ExcelApp);
            }
            catch (Exception exHandle)
            {
                Console.WriteLine("Exception: " + exHandle.Message);
                Console.ReadLine();
            }
        }

Я также попытался явно запросить новое поле SELECT ABC FROM Services, и ничего не выводится.

В новом есть значенияполя.

Если я выполню тот же запрос в окне предварительного просмотра редактора запросов Azure, я получу правильные результаты.

EDIT

Хорошо, поэтому я изменил запросна SELECT *,1 FROM Services и затем я получаю все поля (за исключением нового поля «1»). Как я могу изменить цикл, чтобы получить все поля?

РЕДАКТИРОВАТЬ 2 РЕШЕНИЕ С помощью EPPlus

Просто чтобы обновить любого, кто смотрит на это в будущем, я использовал NuGet Package Manager (Project> Manage NuGet Packages) и* Январь Каллман установил EPPlus.

Затем я добавил:

using OfficeOpenXml;
using OfficeOpenXml.Style;
using System.Data.SqlClient;
using System.IO;

И использовал следующий код на кнопке:

    private void button4_Click(object sender, EventArgs e)
    {
        string SQLQuery = "SELECT * FROM Services";
        SqlConnection conn = new SqlConnection("CONNECTION STRING");
        DataSet ds = new DataSet();
        SqlDataAdapter da = new SqlDataAdapter(SQLQuery, conn);
        DataTable dt = new DataTable();
        da.Fill(dt);
        using (var p = new ExcelPackage())
        {
            var ws = p.Workbook.Worksheets.Add("Service");
            ws.Cells["A1"].LoadFromDataTable(dt, true);
            int totalRows = ws.Dimension.End.Row;
            int totalCols = ws.Dimension.End.Column;
            var headerCells = ws.Cells[1, 1, 1, totalCols];
            var headerFont = headerCells.Style.Font;
            headerFont.Bold = true;
            var allCells = ws.Cells[1, 1, totalRows, totalCols];
            allCells.AutoFitColumns();
            p.SaveAs(new FileInfo(@"d:\excel\Service" + DateTime.Now.ToFileTime() + ".xlsx"));
        }
    }

Это мгновенный выводв файл и благодаря @ Caius Jard

Ответы [ 2 ]

0 голосов
/ 13 октября 2018

Сначала я добавлю комментарий об использовании EPPlus.Я думаю, что у него даже есть метод для преобразования таблицы данных в лист, так что этот обработчик события щелчка можно свести к примерно 4 строкам кода.Посмотрите на этот вопрос SO - Экспорт DataTable, чтобы преуспеть с EPPlus

Во-вторых, я думаю, что ваша настоящая проблема - простая ошибка "один на один"

Вы сказали(мой перефразировать)

если я использую запрос, который возвращает один столбец, например select abc from services, ничего не выводится

Вот как вы выводите столбец:

for(int col = 1; col < table.Columns.Count; col++)

Ваша таблица имеет один столбец.Сравнение для запуска цикла выглядит следующим образом: is 1 less than 1?

False

Цикл не запускается

Если в вашей таблице 10 столбцов, цикл будет выполняться 9 раз.Последний столбец никогда не будет выведен.У вас есть запрос с новым столбцом в конце, вы ожидаете его увидеть, его нет, потому что ваш c # не выводит его, а не потому, что в данных столбца есть что-то странное ...

С точки зрения того, что с этим делать, измените сравнение, которое вы делаете в части «следует запустить цикл»:

for(int col = 1; col <= table.Columns.Count; col++)

Или измените способ индексации (индекс на 0 вместо индекса на1):

for(int col = 0; col < table.Columns.Count; col++)
  excel[row, col+1] = table[row][col]; //excel is 1 based, c# is 0 based

Относительно этих понятий «но данные не изменились, и код не изменился, и наблюдается нечто иное» - это почти никогда не происходит.Гораздо более вероятно, что человек в уравнении ошибочно что-то запутал.Возможно, первый парень, который написал код, столкнулся с той же проблемой и просто продублировал последний столбец в SQL, чтобы обойти его, затем вы / кто-то другой увидел это и, хотя "это выглядит неправильно, я просто уберу это ..."Через несколько месяцев вы ищете и собираетесь: «Раньше это работало, я уверен, что оно работало ...»

:)

А если серьезно;использовать EPPlus;) это восхитительно, просто, создает файлы xlsx напрямую (они являются просто файлами xml внутри zip, переименованы в xlsx) и является очень простым.Excel COM - большая головная боль, и вам не нужно будет создавать кошмар технической поддержки для себя.С EPPlus (используйте менеджер пакетов nuget для добавления ссылки на EPPlus) ваш код будет выглядеть примерно так:

using(SqlDataAdapter da = new SqlDataAdapter("SELECT * FROM services", "PUT YOUR CONN STRING IN A CONFIG FILE")){
    DataTable dt = new DataTable();
    da.Fill(dt);
    using (ExcelPackage ep = new ExcelPackage(newFile))
    {
      ExcelWorksheet ws = ep.Workbook.Worksheets.Add("Sheetname");
      ws.Cells["A1"].LoadFromDataTable(dt, true);
      ep.SaveAs(new FileInfo("YOUR SAVE PATH HERE"));
    }
}
0 голосов
/ 12 октября 2018

Является ли «Услуги» таблицей или представлением?Возможно, вы видите результаты из устаревшей схемы (кэшированной до внесения изменений).Это опасно с «select *».Попробуйте явный список полей вместо "*".

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...