web-dev-qa-db-fra.com

Exporter les données de requête SQL vers Excel

J'ai une requête qui renvoie un très grand ensemble de données. Je ne peux pas le copier et le coller dans Excel comme je le fais habituellement. J'ai fait des recherches sur la façon d'exporter directement vers une feuille Excel. J'exécute SQL SERVER 2008 sur un serveur exécutant Microsoft Server 2003. J'essaie d'utiliser le fournisseur de données Microsoft.Jet.OLEDB.4.0 et Excel 2007. J'ai reconstitué un petit morceau de code qui ressemble à ceci 'ai vu dans des exemples.

INSERT INTO OPENDATASOURCE('Microsoft.Jet.OLEDB.4.0',
'Data Source=C:\Working\Book1.xlsx;Extended Properties=Excel 12.0;HDR=YES')
SELECT productid, price FROM dbo.product

Cependant, cela ne fonctionne pas, je reçois un message d'erreur disant 

"Syntaxe incorrecte près du mot clé 'SELECT'".

Quelqu'un a-t-il des idées sur la manière de procéder ou peut-être sur une meilleure approche?

23
JBone

Je ne sais pas si c'est ce que vous cherchez, mais vous pouvez exporter les résultats au format Excel comme ceci:

Dans le volet de résultats, cliquez sur la cellule supérieure gauche pour mettre en surbrillance tous les enregistrements, puis cliquez avec le bouton droit de la souris sur la cellule supérieure gauche et cliquez sur «Enregistrer les résultats sous». Le format CSV est l’une des options d’exportation.

Vous pouvez aussi essayer ceci:

INSERT INTO OPENROWSET 
   ('Microsoft.Jet.OLEDB.4.0', 
   'Excel 8.0;Database=c:\Test.xls;','SELECT productid, price FROM dbo.product')

Enfin, vous pouvez envisager d’utiliser SSIS (DTS remplacé) pour les exportations de données. Voici un lien vers un tutoriel:

http://www.accelebrate.com/sql_training/ssis_2008_tutorial.htm

45
James Johnson

Si vous souhaitez simplement exporter vers Excel, vous pouvez utiliser l'assistant d'exportation de données. Cliquez avec le bouton droit sur la base de données, Tâches-> Exporter des données. 

15
brian

J'avais un problème similaire, mais avec une torsion: les solutions répertoriées ci-dessus fonctionnaient lorsque le jeu de résultats provenait d'une requête, mais dans ma situation, j'avais plusieurs requêtes de sélection individuelles pour lesquelles j'avais besoin que les résultats soient exportés vers Excel. Vous trouverez ci-dessous un exemple illustrant bien que je puisse créer une clause name in ...

select a,b from Table_A where name = 'x'
select a,b from Table_A where name = 'y'
select a,b from Table_A where name = 'z'

L'assistant me permettait d'exporter le résultat d'une requête vers Excel, mais pas tous les résultats de requêtes différentes dans ce cas. 

Lors de mes recherches, j'ai découvert que nous pouvions désactiver les résultats en grille et activer les résultats en texte. Donc, appuyez sur Ctrl + T, puis exécutez toutes les instructions. Cela devrait afficher les résultats sous forme de fichier texte dans la fenêtre de sortie. Vous pouvez manipuler le texte dans un format délimité par des tabulations pour pouvoir l'importer dans Excel. 

Vous pouvez également appuyer sur Ctrl + Maj + F pour exporter les résultats dans un fichier. Il est exporté sous forme de fichier .rpt pouvant être ouvert à l'aide d'un éditeur de texte et manipulé pour une importation Excel.

J'espère que cela aidera les autres personnes ayant un problème similaire.

1
Prashanth

Pour ceux qui viennent ici et qui cherchent comment faire cela en C #, j’ai essayé la méthode suivante et j’ai eu du succès dans dotnet core 2.0.3 et entity framework core 2.0.3

Commencez par créer votre classe de modèle.

public class User
{  
    public string Name { get; set; }  
    public int Address { get; set; }  
    public int Zip { get; set; }  
    public string Gender { get; set; }  
} 

Ensuite, installez EPPlus Nuget package . (J'ai utilisé la version 4.0.5, fonctionnera probablement pour d'autres versions également.)

Install-Package EPPlus -Version 4.0.5

La classe create ExcelExportHelper, qui contiendra la logique permettant de convertir un jeu de données en lignes Excel. Cette classe n'a pas de dépendances avec votre classe de modèle ou votre jeu de données. 

public class ExcelExportHelper
    {
        public static string ExcelContentType
        {
            get
            { return "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet"; }
        }

        public static DataTable ListToDataTable<T>(List<T> data)
        {
            PropertyDescriptorCollection properties = TypeDescriptor.GetProperties(typeof(T));
            DataTable dataTable = new DataTable();

            for (int i = 0; i < properties.Count; i++)
            {
                PropertyDescriptor property = properties[i];
                dataTable.Columns.Add(property.Name, Nullable.GetUnderlyingType(property.PropertyType) ?? property.PropertyType);
            }

            object[] values = new object[properties.Count];
            foreach (T item in data)
            {
                for (int i = 0; i < values.Length; i++)
                {
                    values[i] = properties[i].GetValue(item);
                }

                dataTable.Rows.Add(values);
            }
            return dataTable;
        }

        public static byte[] ExportExcel(DataTable dataTable, string heading = "", bool showSrNo = false, params string[] columnsToTake)
        {

            byte[] result = null;
            using (ExcelPackage package = new ExcelPackage())
            {
                ExcelWorksheet workSheet = package.Workbook.Worksheets.Add(String.Format("{0} Data", heading));
                int startRowFrom = String.IsNullOrEmpty(heading) ? 1 : 3;

                if (showSrNo)
                {
                    DataColumn dataColumn = dataTable.Columns.Add("#", typeof(int));
                    dataColumn.SetOrdinal(0);
                    int index = 1;
                    foreach (DataRow item in dataTable.Rows)
                    {
                        item[0] = index;
                        index++;
                    }
                }


                // add the content into the Excel file  
                workSheet.Cells["A" + startRowFrom].LoadFromDataTable(dataTable, true);

                // autofit width of cells with small content  
                int columnIndex = 1;
                foreach (DataColumn column in dataTable.Columns)
                {
                    int maxLength;
                    ExcelRange columnCells = workSheet.Cells[workSheet.Dimension.Start.Row, columnIndex, workSheet.Dimension.End.Row, columnIndex];
                    try
                    {
                        maxLength = columnCells.Max(cell => cell.Value.ToString().Count());
                    }
                    catch (Exception) //nishanc
                    {
                        maxLength = columnCells.Max(cell => (cell.Value +"").ToString().Length);
                    }

                    //workSheet.Column(columnIndex).AutoFit();
                    if (maxLength < 150)
                    {
                        //workSheet.Column(columnIndex).AutoFit();
                    }


                    columnIndex++;
                }

                // format header - bold, yellow on black  
                using (ExcelRange r = workSheet.Cells[startRowFrom, 1, startRowFrom, dataTable.Columns.Count])
                {
                    r.Style.Font.Color.SetColor(System.Drawing.Color.White);
                    r.Style.Font.Bold = true;
                    r.Style.Fill.PatternType = OfficeOpenXml.Style.ExcelFillStyle.Solid;
                    r.Style.Fill.BackgroundColor.SetColor(Color.Brown);
                }

                // format cells - add borders  
                using (ExcelRange r = workSheet.Cells[startRowFrom + 1, 1, startRowFrom + dataTable.Rows.Count, dataTable.Columns.Count])
                {
                    r.Style.Border.Top.Style = ExcelBorderStyle.Thin;
                    r.Style.Border.Bottom.Style = ExcelBorderStyle.Thin;
                    r.Style.Border.Left.Style = ExcelBorderStyle.Thin;
                    r.Style.Border.Right.Style = ExcelBorderStyle.Thin;

                    r.Style.Border.Top.Color.SetColor(System.Drawing.Color.Black);
                    r.Style.Border.Bottom.Color.SetColor(System.Drawing.Color.Black);
                    r.Style.Border.Left.Color.SetColor(System.Drawing.Color.Black);
                    r.Style.Border.Right.Color.SetColor(System.Drawing.Color.Black);
                }

                // removed ignored columns  
                for (int i = dataTable.Columns.Count - 1; i >= 0; i--)
                {
                    if (i == 0 && showSrNo)
                    {
                        continue;
                    }
                    if (!columnsToTake.Contains(dataTable.Columns[i].ColumnName))
                    {
                        workSheet.DeleteColumn(i + 1);
                    }
                }

                if (!String.IsNullOrEmpty(heading))
                {
                    workSheet.Cells["A1"].Value = heading;
                   // workSheet.Cells["A1"].Style.Font.Size = 20;

                    workSheet.InsertColumn(1, 1);
                    workSheet.InsertRow(1, 1);
                    workSheet.Column(1).Width = 10;
                }

                result = package.GetAsByteArray();
            }

            return result;
        }

        public static byte[] ExportExcel<T>(List<T> data, string Heading = "", bool showSlno = false, params string[] ColumnsToTake)
        {
            return ExportExcel(ListToDataTable<T>(data), Heading, showSlno, ColumnsToTake);
        }
    }

Maintenant, ajoutez cette méthode où vous voulez générer le fichier Excel, probablement pour une méthode dans le contrôleur. Vous pouvez également transmettre des paramètres pour votre procédure stockée. Notez que le type de retour de la méthode est FileContentResult. Quelle que soit la requête que vous exécutez, l’important est que vous devez avoir les résultats dans List.

[HttpPost]
public async Task<FileContentResult> Create([Bind("Id,StartDate,EndDate")] GetReport getReport)
{
    DateTime startDate = getReport.StartDate;
    DateTime endDate = getReport.EndDate;

    // call the stored procedure and store dataset in a List.
    List<User> users = _context.Reports.FromSql("exec dbo.SP_GetEmpReport @start={0}, @end={1}", startDate, endDate).ToList();
    //set custome column names
    string[] columns = { "Name", "Address", "Zip", "Gender"};
    byte[] filecontent = ExcelExportHelper.ExportExcel(users, "Users", true, columns);
    // set file name.
    return File(filecontent, ExcelExportHelper.ExcelContentType, "Report.xlsx"); 
}

Plus de détails peuvent être trouvés ici

0
Nishan Chathuranga