将SQL导出到Excel

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了将SQL导出到Excel相关的知识,希望对你有一定的参考价值。

如何将我的数据从SQL Server 2008导出到Excel 2010或更高版本?

我试过SQL方式:

sp_configure 'show advanced options', 0;
GO
RECONFIGURE;
GO
sp_configure 'Ad Hoc Distributed Queries', 0;
GO
RECONFIGURE;
GO
INSERT INTO OPENROWSET('Microsoft.Jet.OLEDB.4.0', 
'Excel 8.0;Database=C:\testing.xls;Extended Properties=EXCEL 12.0;HDR=YES', 
'SELECT NO_ORDRE, Date FROM [Sheet1$]') 
SELECT [NO_ORDRE], GETDATE() FROM ORDRE
GO

不幸的是我收到错误:OLE DB提供程序'Microsoft.Jet.OLEDB.4.0'不能用于分布式查询,因为提供程序配置为在STA模式下运行。

然后我尝试了C#方式:

 public class ExportToExcel
    
        private Excel.Application app;

        private Excel.Workbook workbook;
        private Excel.Worksheet previousWorksheet;
       // private Excel.Range workSheet_range;
        private string folder;

        public ExportToExcel(string folder)
        

            this.folder = folder;
            this.app = null;
            this.workbook = null;
            this.previousWorksheet = null;
           // this.workSheet_range = null;

            createDoc();
        

        private void createDoc()
        
            try
            
                app = new Excel.Application();
                app.Visible = false;
                workbook = app.Workbooks.Add(1);
            
            catch (Exception excThrown)
            
                throw new Exception(excThrown.Message);
            
            finally
            
            
        

        public void shutDown()
        
            try
            
                workbook = null;
                app.Quit();
            
            catch (Exception excThrown)
            
                throw new Exception(excThrown.Message);
            
            finally
            
            
        

        public void ExportTable(string query, string sheetName)
        
            SqlDataReader myReader = null;
            try
            
                using (var connectionWrapper = new Connexion())
                
                    var connectedConnection = connectionWrapper.GetConnected();
                    Excel.Worksheet worksheet = (Excel.Worksheet)workbook.Sheets.Add(Missing.Value, Missing.Value, 1, Excel.XlSheetType.xlWorksheet);

                    worksheet.Name = sheetName;
                    previousWorksheet = worksheet;

                    SqlCommand myCommand = new SqlCommand(query, connectionWrapper.conn);

                    myReader = myCommand.ExecuteReader();

                    int columnCount = myReader.FieldCount;

                    for (int n = 0; n < columnCount; n++)
                    
                        //Console.Write(myReader.GetName(n) + "\t");
                        createHeaders(worksheet, 1, n + 1, myReader.GetName(n));
                    

                    int rowCounter = 2;
                    while (myReader.Read())
                    
                        for (int n = 0; n < columnCount; n++)
                        
                            //Console.WriteLine();
                            //Console.Write(myReader[myReader.GetName(n)].ToString() + "\t");
                            addData(worksheet, rowCounter, n + 1, myReader[myReader.GetName(n)].ToString());
                        
                        rowCounter++;
                    

                
            

            catch (Exception e)
            
                Console.WriteLine(e.ToString());

            
            finally
            
                if (myReader != null && !myReader.IsClosed)
                
                    myReader.Close();
                   
                myReader = null;
            

        

        public void createHeaders(Excel.Worksheet worksheet, int row, int col, string htext)
        
            worksheet.Cells[row, col] = htext;
        

        public void addData(Excel.Worksheet worksheet, int row, int col, string data)
        
            worksheet.Cells[row, col] = data;
        

        public void SaveWorkbook()
        

            String folderPath = "C:\\My Files\\" + this.folder;

            if (!System.IO.Directory.Exists(folderPath))
            
                System.IO.Directory.CreateDirectory(folderPath);
            

            string fileNameBase = "db";
            String fileName = fileNameBase;
            string ext = ".xlsx";
            int counter = 1;

            while (System.IO.File.Exists(folderPath + fileName + ext))
            
                fileName = fileNameBase + counter;
                counter++;
            

            fileName = fileName + ext;

            string filePath = folderPath + fileName;

            try
            
                workbook.SaveAs(filePath, Excel.XlFileFormat.xlWorkbookDefault, Missing.Value, Missing.Value, Missing.Value, Missing.Value, Excel.XlSaveAsAccessMode.xlNoChange, Missing.Value, Missing.Value, Missing.Value, Missing.Value, Missing.Value);

            
            catch (Exception e)
            
                Console.WriteLine(e.ToString());

            
        



    

不幸的是我收到错误:由于以下错误,检索CLSID为00024500-0000-0000-C000-000000000046的组件的COM类工厂失败:80070005访问被拒绝。 (来自HRESULT的异常:0x80070005(E_ACCESSDENIED))。

知道如何将SQL导出到Excel?

答案

您最好的选择可能是将其写入CSV。 Excel将自身注册为CSV文件的文件处理程序,因此默认情况下它将在excel中打开。

例如:

private void SQLToCSV(string query, string Filename)


    SqlConnection conn = new SqlConnection(connection);
    conn.Open();
    SqlCommand cmd = new SqlCommand(query, conn);
    SqlDataReader dr = cmd.ExecuteReader();

    using (System.IO.StreamWriter fs = new System.IO.StreamWriter(Filename))
    
        // Loop through the fields and add headers
        for (int i = 0; i < dr.FieldCount; i++)
        
            string name = dr.GetName(i);
            if (name.Contains(","))
                name = "\"" + name + "\"";

            fs.Write(name + ",");
        
        fs.WriteLine();

        // Loop through the rows and output the data
        while (dr.Read())
        
            for (int i = 0; i < dr.FieldCount; i++)
            
                string value = dr[i].ToString();
                if (value.Contains(","))
                    value = "\"" + value + "\"";

                fs.Write(value + ",");
            
            fs.WriteLine();
        

        fs.Close();
    

另一答案

C#SQL到Excel

从数据库中调用SP

public DataTable GetDrugUtilizationReport_IndividualGenerateFile(long pharmacyId, DateTime from, DateTime to, long DrugNameId, int sortBy)

    var parameters = new Dictionary<string, object>
        
             "PharmacyId", pharmacyId ,
             "DateFrom", from ,
             "DateTo", to ,
             "DrugNameId", DrugNameId ,
             "SortBy", sortBy 
        ;

    return ExecuteQuery("RPT_DrugUtilizationReportByIndividualGenerateFile", CommandType.StoredProcedure, parameters);

在C#代码中使用

private void OnCreateFileCommand(object obj)


    string path, parameterLabel;
    path = ConfigurationManager.AppSettings["VSSPORTEXELExportPath"];
    parameterLabel = FromDate.ToString("yyyy-MM-dd") + "_" + ToDate.ToString("yyyy-MM-dd");

    try
    
        path =
            ExcelUtlity.ExportDataToExcel(
                dataTable:
                    context.GetDrugUtilizationReport_IndividualGenerateFile(GlobalVar.Pharminfo.pharminfo_PK,
                        FromDate, ToDate, SelectedDrug != null ? SelectedDrug.drugnameid_PK : 0,
                        sortBy: SortBy + 1),
                directoryPath: path,
                fileName_withoutExt: "DrugUtilizationReport" + "__" + parameterLabel,
                skipComplexObjects: true,
                skipInheritedProps: true);

        DXMessageBox.Show("Data exported successfully at \"" + path + "\".", GlobalVar.MessageTitle,
            MessageBoxButton.OK, MessageBoxImage.Information);
    
    catch (Exception ex)
    
        string errorMessage = ExceptionHelper.ProcessException(ex);
        DXMessageBox.Show(errorMessage, GlobalVar.MessageTitle, MessageBoxButton.OK, MessageBoxImage.Error);
    


Excel实用程序

public static string ExportDataToExcel(DataTable dataTable, string directoryPath, string fileName_withoutExt, bool skipComplexObjects, bool skipInheritedProps, string[] skipProps = null)

    if (directoryPath[directoryPath.Length - 1] == '\\') // no need to check for >0 length. let it throw an exection for that
        directoryPath = directoryPath + "\\";

    using (var spreadSheet = new SpreadsheetControl())
    
        // Create new excel document and import the datatable to the worksheet
        spreadSheet.CreateNewDocument();
        spreadSheet.BeginUpdate();
        var worksheet = spreadSheet.Document.Worksheets.ActiveWorksheet;
        worksheet.Import(source: dataTable, addHeader: true, firstRowIndex: 0, firstColumnIndex: 0);

        // applying style on header
        Range range = worksheet.Range["A1:" + worksheet.Columns[worksheet.Columns.LastUsedIndex].Heading+"1"];
        Formatting rangeFormatting = range.BeginUpdateFormatting();
        rangeFormatting.Fill.BackgroundColor = System.Drawing.Color.LightSteelBlue;
        rangeFormatting.Font.FontStyle = SpreadsheetFontStyle.Bold;
        range.AutoFitColumns();
        range.EndUpdateFormatting(rangeFormatting);

        spreadSheet.EndUpdate();
        fileName_withoutExt += ".xlsx";
        Directory.CreateDirectory(directoryPath); // if directory already exists, CreateDirectory will do nothing
        spreadSheet.SaveDocument(directoryPath + fileName_withoutExt, DocumentFormat.OpenXml);

        return directoryPath + fileName_withoutExt;
    

使用Microsoft Office DLL

public bool WriteDataTableToExcel(System.Data.DataTable dataTable, string worksheetName, string saveAsLocation, string ReporType)

    Microsoft.Office.Interop.Excel.Application excel;
    Microsoft.Office.Interop.Excel.Workbook excelworkBook;
    Microsoft.Office.Interop.Excel.Worksheet excelSheet;
    Microsoft.Office.Interop.Excel.Range excelCellrange;

    try
    
        // Start Excel and get Application object.
        excel = new Microsoft.Office.Interop.Excel.Application();

        // for making Excel visible
        excel.Visible = false;
        excel.DisplayAlerts = false;

        // Creation a new Workbook
        excelworkBook = excel.Workbooks.Add(Type.Missing);

        // Workk sheet
        excelSheet = (Microsoft.Office.Interop.Excel.Worksheet)excelworkBook.ActiveSheet;
        excelSheet.Name = worksheetName;

        excelSheet.Cells[1, 1] = ReporType;
        excelSheet.Cells[1, 2] = "Date : " + DateTime.Now.ToShortDateString();

        // loop through each row and add values to our sheet
        int rowcount = 2;

        foreach (DataRow datarow in dataTable.Rows)
        
            rowcount += 1;
            for (int i = 1; i <= dataTable.Columns.Count; i++)
            
                // on the first iteration we add the column headers
                if (rowcount == 3)
                
                    excelSheet.Cells[2, i] = dataTable.Columns[i - 1].ColumnName;
                    excelSheet.Cells.Font.Color = System.Drawing.Color.Black;
                

                excelSheet.Cells[rowcount, i] = datarow[i - 1].ToString();

                //for alternate rows
                if (rowcount > 3)
                
                    if (i == dataTable.Columns.Count)
                    
                        if (rowcount % 2 == 0)
                        
                            excelCellrange = excelSheet.Range[excelSheet.Cells[rowcount, 1], excelSheet.Cells[rowcount, dataTable.Columns.Count]];
                            FormattingExcelCells(excelCellrange, "#CCCCFF", System.Drawing.Color.Black, false);
                        

                    
                
            
        

        // now we resize the columns
        excelCellrange = excelSheet.Range[excelSheet.Cells[1, 1], excelSheet.Cells[rowcount, dataTable.Columns.Count]];
        excelCellrange.EntireColumn.AutoFit();
        Microsoft.Office.Interop.Excel.Borders border = excelCellrange.Borders;
        border.LineStyle = Microsoft.Office.Interop.Excel.XlLineStyle.xlContinuous;
        border.Weight = 2d;


        excelCellrange = excelSheet.Range[excelSheet.Cells[1, 1], excelSheet.Cells[2, dataTable.Columns.Count]];
        FormattingExcelCells(excelCellrange, "#000099", System.Drawing.Color.White, true);


        //now save the workbook and exit Excel

        excelworkBook.SaveAs(saveAsLocation); ;
        excelworkBook.Close();
        excel.Quit();

        return true;
    
    catch (Exception ex)
    
        DXMessageBox.Show(ex.Message);
        return false;
    
    finally
    
        excelSheet = null;
        excelCellrange = null;
        excelworkBook = null;
    



/// <summary>
/// FUNCTION FOR FORMATTING EXCEL CELLS
/// </summary>
/// <param name="range"></param>
/// <param name="htmlcolorCode">&l

以上是关于将SQL导出到Excel的主要内容,如果未能解决你的问题,请参考以下文章

怎样将SQL数据导出到EXCEL中

将结果集导出到 linq 到 sql 的 excel

将SQL查询数据导出到Excel并在网络外存储位置excel

如何将SQL server 2008 里的查询结果导出到 Excel 表内?

将SQL导出到Excel

将 SQL 导出到 Excel 时的科学计数法