programing

SQL 쿼리 데이터를 Excel로 내보내기

showcode 2023. 4. 15. 09:42
반응형

SQL 쿼리 데이터를 Excel로 내보내기

매우 큰 데이터 세트를 반환하는 쿼리가 있습니다.평소처럼 복사해서 엑셀에 붙여넣을 수 없습니다.엑셀 시트로 직접 수출하는 방법에 대해 조사를 하고 있습니다.Microsoft Server 2003을 실행하는 서버에서 SQL SERVER 2008을 실행하고 있습니다.Microsoft 를 사용하려고 합니다.Jet.OLEDB.4.0 데이터 프로바이더 및 Excel 2007.예를 들어 본 코드의 작은 조각을 조합했습니다.

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

그러나 이것은 동작하지 않고, 다음과 같은 에러 메세지가 표시됩니다.

키워드 'SELECT' 근처에 잘못된 구문이 있습니다.

이 방법이나 더 나은 접근법에 대해 알고 있는 사람이 있습니까?

이것이 당신이 원하는 것인지 모르겠지만, 다음과 같이 결과를 Excel로 내보낼 수 있습니다.

결과 영역에서 왼쪽 위 셀을 눌러 모든 레코드를 강조 표시한 후 왼쪽 위 셀을 마우스 오른쪽 버튼으로 누르고 "다른 이름으로 결과 저장"을 누르십시오.내보내기 옵션 중 하나는 CSV입니다.

이것도 시도해 보세요.

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

마지막으로 데이터 내보내기에 SSIS(대체된 DTS)를 사용하는 방법을 검토할 수 있습니다.다음은 튜토리얼 링크입니다.

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

== 업데이트 #1 ==

결과를 컬럼 헤더가 있는 CSV 파일로 저장하려면 다음 절차를 수행합니다.

  1. [툴(Tools)]-> [옵션(Options)]으로 이동합니다.
  2. 쿼리 결과 -> SQL Server -> 그리드에 대한 결과
  3. "결과 복사 또는 저장 시 열 머리글 포함" 선택
  4. [확인] 을 클릭합니다.
  5. 새 설정은 기존 [Query]탭에는 영향을 주지 않습니다.새 설정을 열거나 SSMS를 재시작해야 합니다.

Excel로 내보내야 하는 경우 데이터 내보내기 마법사를 사용할 수 있습니다.데이터베이스 오른쪽 버튼 [태스크]-> [데이터 내보내기]을 클릭합니다.

비슷한 문제가 있었습니다만, 반전이 있었습니다.상기의 솔루션은, 결과 세트가 1개의 쿼리에서 나왔을 때에 동작했습니다만, 제 상황에서는, 결과를 Excel로 export 할 필요가 있는 개별 선택 쿼리가 복수 있었습니다.를 들어 하겠습니다.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'

마법사에서 하나의 쿼리에서 결과를 Excel로 내보낼 수 있었지만 이 경우 다른 쿼리에서 모든 결과를 내보내는 것은 아니었습니다.

조사해보니 결과를 그리드로 비활성화하고 결과를 텍스트로 활성화할 수 있더군요.따라서 Ctrl + T를 누른 다음 모든 문을 실행합니다.출력창에 결과가 텍스트파일로 표시됩니다.텍스트를 탭으로 구분된 형식으로 조작하여 Excel로 가져올 수 있습니다.

Ctrl + Shift + F를 눌러 결과를 파일로 내보낼 수도 있습니다. 텍스트 편집기를 사용하여 열고 Excel 가져오기를 위해 조작할 수 있는 .rpt 파일로 내보냅니다.

이것이 비슷한 문제를 안고 있는 다른 사람들에게 도움이 되기를 바랍니다.

C#에서 이 작업을 수행하는 방법을 찾고 계신 분들을 위해 다음과 같은 방법을 시도하여 성공하였습니다.dotnet core 2.0.3 ★★★★★★★★★★★★★★★★★」entity framework core 2.0.3

먼저 모델 클래스를 만듭니다.

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

그런 다음 EPplus Nuget 패키지를 설치합니다.(버전 4.0.5를 사용했는데 다른 버전에서도 사용할 수 있을 것 같습니다.)

Install-Package EPPlus -Version 4.0.5

.ExcelExportHelper클래스 - 데이터 집합을 Excel 행으로 변환하는 논리를 포함합니다.클래스는 모델 클래스 또는 데이터 집합과 종속성이 없습니다.

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);
        }
    }

이 메서드를 Excel 파일을 생성하는 장소에 추가합니다(컨트롤러 내의 메서드일 가능성이 있습니다).저장 프로시저의 파라미터도 전달할 수 있습니다.메서드의 반환 유형은 입니다.어떤 쿼리를 실행하든 중요한 것은 에서 결과를 얻을있어야 한다는 것입니다.

[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"); 
}

자세한 내용은 여기를 참조하십시오.

매우 큰 데이터 세트를 Excel에 복사 붙여넣기를 피하기 위해 SQL 데이터를 Excel로 내보내려는 것입니다.

SQL 데이터를 Excel로 내보내고 SQL 데이터베이스를 사용하여 내보내기를 자동으로 업데이트하는 방법에 관심이 있을 수 있습니다.MySQL, Microsoft SQL Server, PostgreSQL).

SQL에서 Excel로 데이터를 내보내려면 다음 두 단계를 수행해야 합니다.

  • 순서 1: SQL 데이터베이스(Microsoft SQL Server, MySQL, PostgreSQL...)에 Excel을 연결합니다.
  • 순서 2: SQL 데이터를 Excel로 Import합니다.

그 결과 SQL 데이터베이스에서 Excel로 데이터를 쿼리하는 테이블 목록이 나타납니다.

순서 1: Excel을 외부 데이터 소스인 SQL 데이터베이스에 연결합니다.

  1. ODBC 설치
  2. 드라이버의 인스톨
  3. 일반적인 에러 회피
  4. DSN 작성

순서 2: SQL 데이터를 Excel로 Import합니다.

  1. 피벗 테이블이 필요한 곳을 클릭합니다.
  2. [삽입]을 클릭합니다.
  3. [피벗 테이블]
  4. 외부 데이터 원본 사용을 클릭한 다음 연결 선택을 클릭합니다.
  5. 시스템 DSN 탭을 클릭합니다.
  6. ODBC Manager에서 생성된 DSN 선택
  7. 요청된 사용자 이름과 비밀번호를 입력합니다.
  8. 일반적인 에러 회피
  9. [ Access the Microsoft Query ]대화 상자
  10. 화살표를 클릭하여 데이터베이스 내의 테이블 목록을 표시합니다.
  11. SQL 데이터베이스의 데이터를 Excel로 쿼리할 테이블을 선택합니다.
  12. 선택을 마치면 Return Data(데이터 반환)를 클릭합니다.

내보내기를 자동으로 업데이트하려면 다음 두 가지 추가 단계가 있습니다.

  1. 외부 SQL 데이터 원본이 있는 피벗 테이블 생성
  2. GETPIVOTDATA 기능으로 Excel에서 SQL 데이터 업데이트 자동화

Excel을 SQL에 연결하는 것부터 자동으로 업데이트되는 것까지 모든 프로세스에 대한 단계별 튜토리얼을 만들었습니다.자세한 설명과 스크린샷이 도움이 될 수 있습니다.

언급URL : https://stackoverflow.com/questions/7389637/export-sql-query-data-to-excel

반응형