IronXL 사용하여 C#에서 GridView를 Excel XLSX 파일로 내보내는 방법
ASP.NET GridView에서 엑셀 파일로 데이터 내보내기
C#에서 IronXL을 설치하여 ASP.NET GridView를 Excel XLSX 파일로 내보낼 수 있습니다. WorkBook을 생성하고, GridView 행을 순회하며, 해당 위치의 워크시트에 각 셀 값을 씁니다. 그런 다음 워크북을 디스크 또는 HTTP 응답 스트림에 저장합니다. 이 접근 방법은 서버에 Microsoft Office 설치가 필요 없으며, .NET Framework, .NET Core, .NET 5부터 .NET 10 웹 애플리케이션에서 신뢰할 수 있게 작동합니다.
GridView 데이터를 엑셀로 내보내는 것은 기업 ASP.NET Web Forms 프로젝트의 표준 요구사항입니다. 사용자는 브라우저에서 테이블 데이터를 보고서, 오프라인 분석 및 보관을 위해 스프레드시트로 가져와야 합니다. 서버 측 GridView 컨트롤과 적절하게 구조화된 .xlsx 파일 간의 차이를 연결하는 것이 도전 과제입니다. 이는 웹 서버 환경에서 깨질 수 있는 Office Interop 종속성을 도입하지 않고 해야 합니다.
이 가이드는 세 가지 점진적으로 풍부해지는 내보내기 패턴으로 안내합니다: 최소 행별 내보내기, 열 자동 크기 조정이 있는 헤더 및 데이터 내보내기, 렌더링된 HTML을 완전히 우회하는 DataTable 기반 내보내기. 각 예제는 C#의 상위 수준 문장 호환 코드와IronXL API를 사용합니다.
ASP.NET 프로젝트에서 IronXL을 어떻게 설치합니까?
Visual Studio에서 패키지 관리자 콘솔을 열고 다음을 실행하세요:
Install-Package IronXL.Excel
또는 솔루션 탐색기에서 프로젝트를 마우스 오른쪽 버튼으로 클릭하고 NuGet 패키지 관리를 선택하여 IronXL을 검색하고 설치를 클릭하십시오. NuGet은 모든 전이 종속성을 자동으로 해결합니다.
패키지를 설치한 후, 다음 using 지시문을 코드 뒤 파일에 추가하십시오:
using System;
using System.Data;
using System.Web.UI;
using IronXL;
using System;
using System.Data;
using System.Web.UI;
using IronXL;
Imports System
Imports System.Data
Imports System.Web.UI
Imports IronXL
IronXL은 .NET Framework 4.6.2 이상 및 .NET Core 3.1에서 .NET 5부터 .NET 10까지 지원합니다. 서버에 Office 설치나 COM 등록이 필요하지 않습니다. 전체 API 문서는 IronXL 객체 참조에서 제공됩니다.
어떤 NuGet 패키지 ID를 사용해야 합니까?
올바른 패키지 ID는 IronXL입니다 (IronXL.Excel는 과거의 별칭입니다). 설치 후, 어셈블리 IronXL.dll이 자동으로 참조됩니다. 설치된 버전을 확인하려면 솔루션 탐색기의 패키지 노드를 확인하거나 프로젝트 디렉터리에서 dotnet list package을 실행하십시오.
IronXL은 ASP.NET Core 웹 애플리케이션에서 동작합니까?
예. 동일한 API는 ASP.NET Web Forms와 ASP.NET Core(MVC, Razor Pages) 프로젝트 모두에서 동작합니다. 코어 프로젝트에서는 서버 측 파일 경로를 빌드할 때 Server.MapPath을 IWebHostEnvironment.WebRootPath 또는 Path.Combine(Directory.GetCurrentDirectory(), "Exports")로 대체하십시오.
GridView를 엑셀 파일로 내보내는 방법은 무엇입니까?
가장 간단한 내보내기 패턴은 GridView에 렌더링된 모든 행을 순회하며 각 셀의 텍스트를 Excel 워크시트의 해당 셀로 복사합니다. ASPX 마크업에서 <asp:GridView ID="gvEmployees" runat="server" AutoGenerateColumns="true" /> 컨트롤과 <asp:Button ID="btnExport" runat="server" Text="Export to Excel" OnClick="btnExport_Click" /> 버튼을 추가하십시오. runat="server" 속성은 두 컨트롤을 코드 비하인드에서 접근 가능하게 만듭니다.
코드 비하인드는 처음 로드 시 샘플 데이터를 바인딩하고 버튼 클릭 시 내보냅니다:
using System;
using System.Data;
using System.Web.UI;
using IronXL;
public partial class GridViewExport : Page
{
protected void Page_Load(object sender, EventArgs e)
{
if (!IsPostBack)
{
BindGridView();
}
}
private void BindGridView()
{
DataTable dt = new DataTable();
dt.Columns.Add("EmployeeID", typeof(int));
dt.Columns.Add("Name", typeof(string));
dt.Columns.Add("Department", typeof(string));
dt.Columns.Add("Salary", typeof(decimal));
dt.Rows.Add(1, "John Smith", "Engineering", 75000);
dt.Rows.Add(2, "Sarah Johnson", "Marketing", 65000);
dt.Rows.Add(3, "Michael Chen", "Finance", 70000);
ViewState["EmployeeData"] = dt;
gvEmployees.DataSource = dt;
gvEmployees.DataBind();
}
protected void btnExport_Click(object sender, EventArgs e)
{
WorkBook workbook = WorkBook.Create(ExcelFileFormat.XLSX);
WorkSheet worksheet = workbook.CreateWorkSheet("Employees");
// Write header row
for (int j = 0; j < gvEmployees.HeaderRow.Cells.Count; j++)
{
worksheet.SetCellValue(0, j, gvEmployees.HeaderRow.Cells[j].Text);
}
// Write data rows
for (int i = 0; i < gvEmployees.Rows.Count; i++)
{
for (int j = 0; j < gvEmployees.Rows[i].Cells.Count; j++)
{
worksheet.SetCellValue(i + 1, j, gvEmployees.Rows[i].Cells[j].Text);
}
}
string filePath = Server.MapPath("~/Exports/EmployeeData.xlsx");
workbook.SaveAs(filePath);
}
}
using System;
using System.Data;
using System.Web.UI;
using IronXL;
public partial class GridViewExport : Page
{
protected void Page_Load(object sender, EventArgs e)
{
if (!IsPostBack)
{
BindGridView();
}
}
private void BindGridView()
{
DataTable dt = new DataTable();
dt.Columns.Add("EmployeeID", typeof(int));
dt.Columns.Add("Name", typeof(string));
dt.Columns.Add("Department", typeof(string));
dt.Columns.Add("Salary", typeof(decimal));
dt.Rows.Add(1, "John Smith", "Engineering", 75000);
dt.Rows.Add(2, "Sarah Johnson", "Marketing", 65000);
dt.Rows.Add(3, "Michael Chen", "Finance", 70000);
ViewState["EmployeeData"] = dt;
gvEmployees.DataSource = dt;
gvEmployees.DataBind();
}
protected void btnExport_Click(object sender, EventArgs e)
{
WorkBook workbook = WorkBook.Create(ExcelFileFormat.XLSX);
WorkSheet worksheet = workbook.CreateWorkSheet("Employees");
// Write header row
for (int j = 0; j < gvEmployees.HeaderRow.Cells.Count; j++)
{
worksheet.SetCellValue(0, j, gvEmployees.HeaderRow.Cells[j].Text);
}
// Write data rows
for (int i = 0; i < gvEmployees.Rows.Count; i++)
{
for (int j = 0; j < gvEmployees.Rows[i].Cells.Count; j++)
{
worksheet.SetCellValue(i + 1, j, gvEmployees.Rows[i].Cells[j].Text);
}
}
string filePath = Server.MapPath("~/Exports/EmployeeData.xlsx");
workbook.SaveAs(filePath);
}
}
Imports System
Imports System.Data
Imports System.Web.UI
Imports IronXL
Public Partial Class GridViewExport
Inherits Page
Protected Sub Page_Load(sender As Object, e As EventArgs)
If Not IsPostBack Then
BindGridView()
End If
End Sub
Private Sub BindGridView()
Dim dt As New DataTable()
dt.Columns.Add("EmployeeID", GetType(Integer))
dt.Columns.Add("Name", GetType(String))
dt.Columns.Add("Department", GetType(String))
dt.Columns.Add("Salary", GetType(Decimal))
dt.Rows.Add(1, "John Smith", "Engineering", 75000)
dt.Rows.Add(2, "Sarah Johnson", "Marketing", 65000)
dt.Rows.Add(3, "Michael Chen", "Finance", 70000)
ViewState("EmployeeData") = dt
gvEmployees.DataSource = dt
gvEmployees.DataBind()
End Sub
Protected Sub btnExport_Click(sender As Object, e As EventArgs)
Dim workbook As WorkBook = WorkBook.Create(ExcelFileFormat.XLSX)
Dim worksheet As WorkSheet = workbook.CreateWorkSheet("Employees")
' Write header row
For j As Integer = 0 To gvEmployees.HeaderRow.Cells.Count - 1
worksheet.SetCellValue(0, j, gvEmployees.HeaderRow.Cells(j).Text)
Next
' Write data rows
For i As Integer = 0 To gvEmployees.Rows.Count - 1
For j As Integer = 0 To gvEmployees.Rows(i).Cells.Count - 1
worksheet.SetCellValue(i + 1, j, gvEmployees.Rows(i).Cells(j).Text)
Next
Next
Dim filePath As String = Server.MapPath("~/Exports/EmployeeData.xlsx")
workbook.SaveAs(filePath)
End Sub
End Class
WorkBook.Create(ExcelFileFormat.XLSX) 호출은 최신 Open XML 형식을 대상으로 하는 메모리 내 워크북을 초기화합니다. CreateWorkSheet("Employees")은 첫 번째 시트를 추가합니다. 외부 루프(i)는 데이터 행을 통과하고; 내부 루프(j)는 열을 통과합니다. 행 인덱스 i + 1는 데이터 셀에 사용되며, 행 0의 헤더가 덮어쓰이지 않도록 합니다.
IronXL을 Excel Interop 대신 사용하는 이유는 무엇입니까?
Excel Interop은 서버에 Microsoft Excel의 라이선스가 있는 설치 버전을 필요로 하며, 메모리 누수를 피하기 위해 명시적으로 해제해야 하는 COM 개체를 생성합니다. IronXL은 .xlsx 파일을 Open XML 패키지로 직접 읽고 씁니다 -- COM, 오피스, Marshal.ReleaseComObject 보일러플레이트가 없습니다. 이것은 IIS, Azure App Service, Docker 및 Office가 없는 다른 서버 환경에서 신뢰성을 제공합니다.
XLSX 다운로드에 적합한 MIME 유형은 무엇입니까?
브라우저가 파일 저장 대화 상자를 띄우도록 하려면 응답 콘텐츠 유형을 application/vnd.openxmlformats-officedocument.spreadsheetml.sheet으로 설정하고, 워크북 바이트를 응답 스트림에 쓰기 전에 Content-Disposition: attachment 헤더를 추가하십시오.
열 헤더를 추가하고 열을 자동 크기 조정하려면 어떻게 해야 합니까?
기본 예제는 HeaderRow.Cells에서 추출한 헤더를 작성하지만, 실제 환경 내보내기는 데이터가 Excel에서 수동 조정 없이도 읽기 가능하도록 각 열을 자동 크기 조정해야 합니다:
protected void btnExport_Click(object sender, EventArgs e)
{
WorkBook workbook = WorkBook.Create(ExcelFileFormat.XLSX);
WorkSheet worksheet = workbook.CreateWorkSheet("Employees");
// Write column headers
int colCount = gvEmployees.HeaderRow.Cells.Count;
for (int i = 0; i < colCount; i++)
{
string header = gvEmployees.HeaderRow.Cells[i].Text;
worksheet.SetCellValue(0, i, header);
}
// Write data rows
for (int i = 0; i < gvEmployees.Rows.Count; i++)
{
for (int j = 0; j < gvEmployees.Rows[i].Cells.Count; j++)
{
worksheet.SetCellValue(i + 1, j, gvEmployees.Rows[i].Cells[j].Text);
}
}
// Auto-size each column for readability
for (int col = 0; col < colCount; col++)
{
worksheet.AutoSizeColumn(col);
}
string filePath = Server.MapPath("~/Exports/EmployeeReport.xlsx");
workbook.SaveAs(filePath);
}
protected void btnExport_Click(object sender, EventArgs e)
{
WorkBook workbook = WorkBook.Create(ExcelFileFormat.XLSX);
WorkSheet worksheet = workbook.CreateWorkSheet("Employees");
// Write column headers
int colCount = gvEmployees.HeaderRow.Cells.Count;
for (int i = 0; i < colCount; i++)
{
string header = gvEmployees.HeaderRow.Cells[i].Text;
worksheet.SetCellValue(0, i, header);
}
// Write data rows
for (int i = 0; i < gvEmployees.Rows.Count; i++)
{
for (int j = 0; j < gvEmployees.Rows[i].Cells.Count; j++)
{
worksheet.SetCellValue(i + 1, j, gvEmployees.Rows[i].Cells[j].Text);
}
}
// Auto-size each column for readability
for (int col = 0; col < colCount; col++)
{
worksheet.AutoSizeColumn(col);
}
string filePath = Server.MapPath("~/Exports/EmployeeReport.xlsx");
workbook.SaveAs(filePath);
}
Protected Sub btnExport_Click(sender As Object, e As EventArgs)
Dim workbook As WorkBook = WorkBook.Create(ExcelFileFormat.XLSX)
Dim worksheet As WorkSheet = workbook.CreateWorkSheet("Employees")
' Write column headers
Dim colCount As Integer = gvEmployees.HeaderRow.Cells.Count
For i As Integer = 0 To colCount - 1
Dim header As String = gvEmployees.HeaderRow.Cells(i).Text
worksheet.SetCellValue(0, i, header)
Next
' Write data rows
For i As Integer = 0 To gvEmployees.Rows.Count - 1
For j As Integer = 0 To gvEmployees.Rows(i).Cells.Count - 1
worksheet.SetCellValue(i + 1, j, gvEmployees.Rows(i).Cells(j).Text)
Next
Next
' Auto-size each column for readability
For col As Integer = 0 To colCount - 1
worksheet.AutoSizeColumn(col)
Next
Dim filePath As String = Server.MapPath("~/Exports/EmployeeReport.xlsx")
workbook.SaveAs(filePath)
End Sub
AutoSizeColumn(col)은 IronXL이 셀 콘텐츠 길이를 기반으로 최적 열 너비를 계산하도록 지시하며, Excel 데스크탑 응용 프로그램의 형식 > 열 너비 자동 맞춤 동작을 반영합니다. 모든 데이터를 쓴 후에 루프에서 호출하는 것이 더 효율적인데, 그때가 최종 콘텐츠가 알려지고 변동이 없기 때문입니다.
추가 스타일링 옵션 - 굵은 헤더, 배경 색상, 숫자 형식 - 을 IronXL 셀 스타일링 튜토리얼을 탐색하세요. 여러 열에 걸쳐 보고서 제목을 만들기 위해 셀 병합을 할 수도 있습니다.
헤더 셀에 굵은 형식을 적용하려면 어떻게 해야 하나요?
IStyle 객체를 사용하여 worksheet["A1"].Style에서 반환합니다 (또는 범위). 값을 쓰기 전후에 Font.Bold = true를 설정합니다 -- 스타일은 셀 콘텐츠와 분리되어 있습니다:
// Bold the entire header row (columns A through D)
var headerRange = worksheet["A1:D1"];
headerRange.Style.Font.Bold = true;
headerRange.Style.BackgroundColor = "#4472C4";
headerRange.Style.Font.FontColor = "#FFFFFF";
// Bold the entire header row (columns A through D)
var headerRange = worksheet["A1:D1"];
headerRange.Style.Font.Bold = true;
headerRange.Style.BackgroundColor = "#4472C4";
headerRange.Style.Font.FontColor = "#FFFFFF";
' Bold the entire header row (columns A through D)
Dim headerRange = worksheet("A1:D1")
headerRange.Style.Font.Bold = True
headerRange.Style.BackgroundColor = "#4472C4"
headerRange.Style.Font.FontColor = "#FFFFFF"
이 패턴은 모든 크기의 범위에 균일하게 적용됩니다. 스타일 속성의 전체 목록은 IronXL 스타일링 API 참조를 참조하세요.
데이터를 DataTable에서 직접 내보내려면 어떻게 해야 하나요?
렌더링된 GridView 행을 순회하는 것은 내보내기를 컨트롤의 현재 시각적 상태에 연결하며, 이는 페이징, 정렬 및 열 가시성 설정에 의해 영향을 받을 수 있습니다. 기본 DataTable에 저장된 ViewState에서 내보내는 것은 그리드가 어떻게 구성되었는지와 상관없이 결정적인 결과를 제공합니다:
protected void btnExport_Click(object sender, EventArgs e)
{
DataTable sourceData = ViewState["EmployeeData"] as DataTable;
if (sourceData == null)
{
Response.Write("No data available to export.");
return;
}
WorkBook workbook = WorkBook.Create(ExcelFileFormat.XLSX);
WorkSheet worksheet = workbook.CreateWorkSheet("Report");
// Column headers from DataTable schema
for (int i = 0; i < sourceData.Columns.Count; i++)
{
worksheet.SetCellValue(0, i, sourceData.Columns[i].ColumnName);
}
// Data rows from DataRow objects
for (int i = 0; i < sourceData.Rows.Count; i++)
{
for (int j = 0; j < sourceData.Columns.Count; j++)
{
worksheet.SetCellValue(i + 1, j, sourceData.Rows[i][j].ToString());
}
}
string filePath = Server.MapPath("~/Exports/DataExport.xlsx");
workbook.SaveAs(filePath);
}
protected void btnExport_Click(object sender, EventArgs e)
{
DataTable sourceData = ViewState["EmployeeData"] as DataTable;
if (sourceData == null)
{
Response.Write("No data available to export.");
return;
}
WorkBook workbook = WorkBook.Create(ExcelFileFormat.XLSX);
WorkSheet worksheet = workbook.CreateWorkSheet("Report");
// Column headers from DataTable schema
for (int i = 0; i < sourceData.Columns.Count; i++)
{
worksheet.SetCellValue(0, i, sourceData.Columns[i].ColumnName);
}
// Data rows from DataRow objects
for (int i = 0; i < sourceData.Rows.Count; i++)
{
for (int j = 0; j < sourceData.Columns.Count; j++)
{
worksheet.SetCellValue(i + 1, j, sourceData.Rows[i][j].ToString());
}
}
string filePath = Server.MapPath("~/Exports/DataExport.xlsx");
workbook.SaveAs(filePath);
}
Protected Sub btnExport_Click(sender As Object, e As EventArgs)
Dim sourceData As DataTable = TryCast(ViewState("EmployeeData"), DataTable)
If sourceData Is Nothing Then
Response.Write("No data available to export.")
Return
End If
Dim workbook As WorkBook = WorkBook.Create(ExcelFileFormat.XLSX)
Dim worksheet As WorkSheet = workbook.CreateWorkSheet("Report")
' Column headers from DataTable schema
For i As Integer = 0 To sourceData.Columns.Count - 1
worksheet.SetCellValue(0, i, sourceData.Columns(i).ColumnName)
Next
' Data rows from DataRow objects
For i As Integer = 0 To sourceData.Rows.Count - 1
For j As Integer = 0 To sourceData.Columns.Count - 1
worksheet.SetCellValue(i + 1, j, sourceData.Rows(i)(j).ToString())
Next
Next
Dim filePath As String = Server.MapPath("~/Exports/DataExport.xlsx")
workbook.SaveAs(filePath)
End Sub
열 이름은 DataTable.Columns[i].ColumnName에서 나옵니다. 이는 GridView 템플릿에 적용된 표시 이름 재정의를 반영하기보다는 원래 데이터 스키마를 반영합니다. 셀 값은 열 인덱스를 사용하여 DataRow 객체에서 검색되며, 각 값을 캐스팅하여 string SetCellValue을 만족시킵니다.
이 패턴은 GridView이 페이징을 사용할 때 특히 유용합니다 -- gvEmployees.Rows를 순회하는 것은 현재 표시된 페이지의 행만 반환하는 반면, 전체 DataTable을 읽으면 모든 레코드를 내보냅니다.
대형 DataTable 내보내기에서는 어떤 일이 발생하나요?
IronXL은 대형 Excel 데이터셋을 효율적으로 스트리밍합니다. 100,000개 행을 초과하는 내보내기의 경우 중첩 루프에서 개별 셀을 설정하는 대신 단일 워크시트 작업 내에 SetCellValue 호출을 배치하는 것을 고려하십시오. 또한 워크북을 MemoryStream에 작성하고 서버 RAM에 전체 파일을 보유하지 않도록 Response 스트림에 점진적으로 플러시할 수 있습니다.
내보내기 중 오류를 처리하려면 어떻게 해야 하나요?
실제 내보내기 핸들러는IronXL작업을 catch 블록으로 래핑하고 무언가 잘못 됐을 때 사용자에게 설명 메시지를 반환해야 합니다. 공통 실패 모드에는 누락된 ~/Exports/ 디렉터리, 파일 권한 오류, 세션 시간 초과 후 ViewState이 null 되는 경우 등이 포함됩니다:
protected void btnExport_Click(object sender, EventArgs e)
{
try
{
DataTable sourceData = ViewState["EmployeeData"] as DataTable;
if (sourceData == null)
throw new InvalidOperationException("Session data has expired. Please reload the page.");
WorkBook workbook = WorkBook.Create(ExcelFileFormat.XLSX);
WorkSheet worksheet = workbook.CreateWorkSheet("Employees");
for (int i = 0; i < sourceData.Columns.Count; i++)
worksheet.SetCellValue(0, i, sourceData.Columns[i].ColumnName);
for (int i = 0; i < sourceData.Rows.Count; i++)
for (int j = 0; j < sourceData.Columns.Count; j++)
worksheet.SetCellValue(i + 1, j, sourceData.Rows[i][j].ToString());
string filePath = Server.MapPath("~/Exports/SafeExport.xlsx");
workbook.SaveAs(filePath);
lblStatus.Text = "Export successful. File saved to server.";
}
catch (Exception ex)
{
lblStatus.Text = $"Export failed: {ex.Message}";
}
}
protected void btnExport_Click(object sender, EventArgs e)
{
try
{
DataTable sourceData = ViewState["EmployeeData"] as DataTable;
if (sourceData == null)
throw new InvalidOperationException("Session data has expired. Please reload the page.");
WorkBook workbook = WorkBook.Create(ExcelFileFormat.XLSX);
WorkSheet worksheet = workbook.CreateWorkSheet("Employees");
for (int i = 0; i < sourceData.Columns.Count; i++)
worksheet.SetCellValue(0, i, sourceData.Columns[i].ColumnName);
for (int i = 0; i < sourceData.Rows.Count; i++)
for (int j = 0; j < sourceData.Columns.Count; j++)
worksheet.SetCellValue(i + 1, j, sourceData.Rows[i][j].ToString());
string filePath = Server.MapPath("~/Exports/SafeExport.xlsx");
workbook.SaveAs(filePath);
lblStatus.Text = "Export successful. File saved to server.";
}
catch (Exception ex)
{
lblStatus.Text = $"Export failed: {ex.Message}";
}
}
Protected Sub btnExport_Click(sender As Object, e As EventArgs)
Try
Dim sourceData As DataTable = TryCast(ViewState("EmployeeData"), DataTable)
If sourceData Is Nothing Then
Throw New InvalidOperationException("Session data has expired. Please reload the page.")
End If
Dim workbook As WorkBook = WorkBook.Create(ExcelFileFormat.XLSX)
Dim worksheet As WorkSheet = workbook.CreateWorkSheet("Employees")
For i As Integer = 0 To sourceData.Columns.Count - 1
worksheet.SetCellValue(0, i, sourceData.Columns(i).ColumnName)
Next
For i As Integer = 0 To sourceData.Rows.Count - 1
For j As Integer = 0 To sourceData.Columns.Count - 1
worksheet.SetCellValue(i + 1, j, sourceData.Rows(i)(j).ToString())
Next
Next
Dim filePath As String = Server.MapPath("~/Exports/SafeExport.xlsx")
workbook.SaveAs(filePath)
lblStatus.Text = "Export successful. File saved to server."
Catch ex As Exception
lblStatus.Text = $"Export failed: {ex.Message}"
End Try
End Sub
파일을 디스크에 저장하는 대신 직접 브라우저 다운로드로 제공하는 웹 응용 프로그램의 경우 Response.BinaryWrite을 사용하거나 콘텐츠 유형 및 배포 헤더를 설정한 후 Response.OutputStream에 작성하십시오. ~/Exports/ 디렉터리가 존재하는지 확인하고, IIS 응용 프로그램 풀 ID가 그것에 대한 쓰기 권한을 가지고 있는지 확인하십시오.
XLSX 파일을 브라우저 다운로드로 전송하려면 어떻게 해야 하나요?
workbook.SaveAs(filePath)을 스트림 기반 응답으로 교체하십시오:
using System.IO;
// ... inside btnExport_Click after populating the worksheet ...
byte[] fileBytes;
using (MemoryStream ms = new MemoryStream())
{
workbook.SaveAs(ms);
fileBytes = ms.ToArray();
}
Response.Clear();
Response.ContentType = "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet";
Response.AddHeader("Content-Disposition", "attachment; filename=EmployeeData.xlsx");
Response.BinaryWrite(fileBytes);
Response.End();
using System.IO;
// ... inside btnExport_Click after populating the worksheet ...
byte[] fileBytes;
using (MemoryStream ms = new MemoryStream())
{
workbook.SaveAs(ms);
fileBytes = ms.ToArray();
}
Response.Clear();
Response.ContentType = "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet";
Response.AddHeader("Content-Disposition", "attachment; filename=EmployeeData.xlsx");
Response.BinaryWrite(fileBytes);
Response.End();
Imports System.IO
' ... inside btnExport_Click after populating the worksheet ...
Dim fileBytes As Byte()
Using ms As New MemoryStream()
workbook.SaveAs(ms)
fileBytes = ms.ToArray()
End Using
Response.Clear()
Response.ContentType = "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet"
Response.AddHeader("Content-Disposition", "attachment; filename=EmployeeData.xlsx")
Response.BinaryWrite(fileBytes)
Response.End()
이 패턴은 임시 파일을 디스크에 기록하는 것을 피합니다. MemoryStream은 서버에 할당되고 byte[]에 직렬화되어 클라이언트에게 직접 전송됩니다. Response.End() 호출은 응답을 플러시하고 바이너리 데이터 이후에 추가 페이지 마크업이 추가되지 않도록 방지합니다.
여러 시트 또는 고급 워크북을 내보내려면 어떻게 해야 하나요?
단일 WorkBook에는 여러 시트가 포함될 수 있으며, 이는 여러 GridView를 내보낼 때 또는 동일한 데이터를 다른 세분화 수준에서 내보낼 때 유용합니다. 각 탭에 대해 workbook.CreateWorkSheet(name)을 한 번 호출하십시오:
WorkBook workbook = WorkBook.Create(ExcelFileFormat.XLSX);
WorkSheet summary = workbook.CreateWorkSheet("Summary");
WorkSheet detail = workbook.CreateWorkSheet("Detail");
// Populate summary sheet ...
// Populate detail sheet ...
workbook.SaveAs(Server.MapPath("~/Exports/FullReport.xlsx"));
WorkBook workbook = WorkBook.Create(ExcelFileFormat.XLSX);
WorkSheet summary = workbook.CreateWorkSheet("Summary");
WorkSheet detail = workbook.CreateWorkSheet("Detail");
// Populate summary sheet ...
// Populate detail sheet ...
workbook.SaveAs(Server.MapPath("~/Exports/FullReport.xlsx"));
Dim workbook As WorkBook = WorkBook.Create(ExcelFileFormat.XLSX)
Dim summary As WorkSheet = workbook.CreateWorkSheet("Summary")
Dim detail As WorkSheet = workbook.CreateWorkSheet("Detail")
' Populate summary sheet ...
' Populate detail sheet ...
workbook.SaveAs(Server.MapPath("~/Exports/FullReport.xlsx"))
IronXL은 기존 Excel 파일 읽기도 지원하므로, 브랜드 및 형식을 포함한 미리 빌드된 템플릿을 로드하고 특정 셀에 데이터를 주입하며 결과를 저장하여 템플릿에 이미 있는 차트, 이미지 및 스타일을 유지할 수 있습니다.
더 풍부한 출력을 위해 IronXL는 Excel 공식 지원, 조건부 형식, 차트 생성, 및 이미지 임베딩을 제공합니다. 이 기능들은 IronXL 튜토리얼 섹션에 문서화되어 있습니다.
IronXL은EPPlus및 ClosedXML과 어떻게 비교되나요?
| 기능 | IronXL | EPPlus | ClosedXML |
|---|---|---|---|
| 오피스 설치 필요 | 아니요 | 아니요 | 아니요 |
| XLSX 읽기 및 쓰기 | 예 | 예 | 예 |
| XLS (레거시) 지원 | 예 | 아니요 | 아니요 |
| CSV / TSV 내보내기 | 예 | 아니요 | 부분적 |
| 차트 생성 API | 예 | 예 | 제한적 |
| 라이선스 모델 | 영구 + SaaS | 비상업 Polyform | MIT |
| .NET 10 지원 | 예 | 예 | 예 |
EPPlus는 버전 5에서 상업적 라이선스로 전환하여 이미 상업적인 .NET 라이브러리 생태계에 투자하고 있는 팀에게 IronXL이 자연스러운 대안이 됩니다. ClosedXML은MIT라이선스를 유지하지만 차트 지원이 제한적입니다. 올바른 선택은 프로젝트의 라이선스 제약 조건, 필요한 Excel 기능 및 기존 .xls 형식 지원이 필요한지 여부에 따라 다릅니다.
IronXL은 어떤 Excel 형식을 지원하나요?
IronXL은 .xlsx(Office Open XML), .xls(기존 BIFF8), .csv 및 .tsv 형식을 읽고 씁니다. 단일 API 호출로 ExcelFileFormat 열거형 값 변경을 통해 WorkBook.Create에 전달하여, 또는 기존 파일을 로드한 다음 다른 형식으로 저장하여 Excel 파일 형식 간에 변환할 수 있습니다.
다음 단계는 무엇입니까?
이제 IronXL을 사용하여 ASP.NET GridView 데이터를 Excel XLSX 파일로 내보내기 위한 프로덕션 준비가 된 세 가지 패턴이 있습니다:
- 행 반복 내보내기 -- 바인딩된
GridView에서 작동하는 내보내기까지의 가장 빠른 경로 - 헤더 및 형식 내보내기 -- 보기 좋은 보고서를 위한 열 자동 크기 조정 및 굵은 헤더 추가
- DataTable 기반 내보내기 -- 페이지가 매겨지거나 필터링된 그리드에 대해 렌더링된 컨트롤을 완전히 우회합니다
다음의 논리적 단계는 다음과 같습니다:
- 브라우저 다운로드 응답 추가는
MemoryStream과Response.BinaryWrite을 사용하여 사용자가 서버 측 저장 경로 없이 즉시 파일을 받을 수 있도록 합니다. - 셀 스타일 적용 -- 굵은 헤더, 배경색 채우기, 숫자 형식 -- IronXL 포맷 API를 사용하세요.
- 이해 관계자에게 전달되는 단일 파일에 요약 데이터 및 세부 데이터를 결합하기 위해 다중 시트 워크북을 탐색합니다.
- IronXL의 읽기 API를 사용하여
DataTable객체로 Excel 파일을 다시 읽기하여 왕복 가져오기/내보내기 워크플로우를 처리합니다. - 전체 기능의 시험 라이센스를 통해 프로젝트의 모든 기능을 테스트하기 위해 ironsoftware.com/csharp/excel/에서 무료 체험판을 시작하십시오.
문서 생성 파이프라인을 구축하는 팀을 위해 IronPDF는 IronXL과 통합되어 워크시트를 PDF로 직접 내보낼 수 있습니다. Iron Suite는 IronXL과 IronPDF, IronOCR, IronBarcode, 및 IronZIP을 결합하여 할인된 가격으로 제공합니다.
자주 묻는 질문
IronXL 사용하여 GridView를 Excel로 내보내는 주된 목적은 무엇입니까?
IronXL 은 주로 ASP.NET GridView의 데이터를 XLSX와 같은 Excel 형식으로 내보내는 작업을 지원하여 C# 애플리케이션에 고성능과 손쉬운 통합을 보장합니다.
IronXL GridView에서 내보낼 때 대용량 데이터 세트를 처리할 수 있습니까?
네, IronXL GridView에서 Excel로 데이터를 내보내는 과정에서 대용량 데이터 세트를 효율적으로 처리하도록 최적화되어 속도와 성능을 유지합니다.
IronXL 사용할 때 Excel 출력 형식을 사용자 지정할 수 있습니까?
IronXL 사용하면 서식, 스타일 지정, 내보낸 파일에 추가 데이터 또는 수식 포함 등 Excel 출력의 다양한 측면을 사용자 지정할 수 있습니다.
IronXL GridView를 Excel로 내보내는 다른 라이브러리와 비교했을 때 어떤 차이가 있나요?
IronXL 다른 라이브러리에 비해 보다 직관적이고 유연한 접근 방식을 제공하며, 최신 Excel 형식을 지원하고 C# 애플리케이션과 직접 통합됩니다.
IronXL XLSX 외 다른 형식으로 내보내기를 지원합니까?
네, IronXL XLS, CSV, TSV를 포함한 다양한 Excel 형식으로 내보내기를 지원하여 다양한 프로젝트 요구 사항에 맞춰 활용할 수 있습니다.
프로젝트에서 IronXL 사용하기 위한 필수 조건은 무엇입니까?
IronXL 사용하려면 .NET 환경이 필요하며, C# 프로젝트에서 NuGet 통해 IronXL 설치할 수 있습니다.
IronXL GridView 데이터를 비동기적으로 내보낼 수 있습니까?
IronXL 비동기 작업을 지원하므로 개발자는 메인 애플리케이션 스레드를 차단하지 않고 GridView 데이터를 Excel 파일로 내보낼 수 있습니다.
IronXL 사용하여 GridView를 Excel로 내보내려면 어떻게 시작해야 하나요?
시작하려면 IronXL의 설명서와 예제를 참조하십시오. 설명서와 예제에는 GridView에서 Excel로 데이터를 내보내는 설정 및 실행 방법에 대한 단계별 지침이 나와 있습니다.




