2013-08-20 3 views
1

NHibernate를 사용하는 SQL Server 2008 데이터베이스에서 데이터를 읽고 있는데 개체 목록을 얻고 있습니다. 즉시 Excel 파일 .xls을 작성하여 사용자에게 제공하고 싶습니다.Excel writer on fly

내 문제는, 어떤 임시 파일이나 폴더를 서버에 만들 수없고 blob을 사용할 수 없다는 것입니다.

모든 솔루션?

+0

당신은 iis를 사용하여 db 테이블을 전송하여 프로세스 명령을 사용하여 db 파일을 iis로 선언 할 수 있습니다. –

+0

좀 더 설명해 주시겠습니까? 나는 C#에 새로운 사람이다. :) – vishnu

답변

0

당신은 ClosedXML 라이브러리를 시도 할 수있는 메모리 스트림에 저장 (쉽게 통합 문서를 조작하는). 그런 다음 짧게 짧게 http를 통해 평소와 같이 스트림을 보냅니다. 웹 응답시

public byte[] GetExcelByteStream(string filename) 
{ 
    using (var workbook = new XLWorkbook(filename)) 
    { 
      var worksheet = workbook.Worksheets.Add("Sample Sheet"); 
      worksheet.Cell("A1").Value = "Hello World!"; 
      using (var ms = new MemoryStream()) 
      { 
       workbook.SaveAs(ms); 
       return ms.ToArray(); 
      } 
    } 
} 

고전적인 방법 :

var excelStream = GetExcelByteStream("MyExcelFilename"); 
context.Response.Clear(); 
context.Response.AddHeader("Content-Disposition", "attachment;filename="+context.Request.Form["txtFileName"].ToString()); 
context.Response.AddHeader("Content-Length", excelStream.Length.ToString()); 
context.Response.ContentType = "application/octet-stream"; 
context.Response.BinaryWrite(excelStream); 

그것이 도움이되기를 바랍니다.

+0

네, 좋아 보이네요. 감사. 이것을 시도하고 여기에 내 답변을 게시 할 것입니다. – vishnu

0

.xls이어야하나요 아니면 .xlsx도 받아 들일 수 있습니까?

저는 파일을 거치지 않고 스트림에 쓰는 것을 지원하는 C# 용 a simple .xlsx writer 라이브러리의 저자입니다.

The documentation에는 ASP.net MVC ActionResult가 들어 있습니다.이 인스턴스를 상속 한 다음 GenerateWorkbook 메서드를 재정 의하여 데이터베이스 테이블에서 통합 문서를 생성 할 수 있습니다.

public abstract class ExcelResultBase : ActionResult 
{ 
private readonly string _filename; 

protected ExcelResultBase(string filename) 
{ 
    _filename = filename; 
} 

protected abstract Workbook GenerateWorkbook(); 

public override void ExecuteResult(ControllerContext context) 
{ 
    if (context == null) 
    { 
     throw new ArgumentNullException("context"); 
    } 

    var workbook = GenerateWorkbook(); 
    if (workbook == null) 
    { 
     context.HttpContext.Response.StatusCode = (int)HttpStatusCode.NotFound; 
     return; 
    } 

    context.HttpContext.Response.ContentType = "application/octet-stream"; 
    context.HttpContext.Response.StatusCode = (int)HttpStatusCode.OK; 
    context.HttpContext.Response.AppendHeader("content-disposition", "attachment; filename=\"" + _filename + "\""); 
    workbook.Save(context.HttpContext.Response.OutputStream, CompressionLevel.NoCompression); 
} 
} 
+0

xls와 xlsx는 받아 들일 만하다. – vishnu

+0

목록 을 byte []로 변환 할 수있다. xls를 생성하기 위해 여기서 바이트 []를 사용할 수 있습니까? – vishnu

+0

@Vishnu 아니요. 바이너리 데이터를 Excel에 임베드 할 수 없기 때문입니다. 'List '에는 문자열과 정수 등이 들어 있다고 가정합니까? 기본적으로 데이터베이스의 모든 행을 살펴본 다음 모든 열 값을 워크 시트 내의 셀에 넣어야합니다. 난 당신이 실제로 데이터베이스에서 돌아갈지 모르겠 NHibernate 모르겠다. 일반적으로'List '보다 강력한 것을 얻어야합니다. 어쨌든 데이터를 수동으로 루프하여 Excel의 '셀'을 만들어야합니다. –