2013-08-20 2 views
1

Я читаю данные из базы данных SQL Server 2008 usnig NHibernate, и я получаю список объектов. Я хочу создать файл Excel .xls на лету и предоставить его пользователю.Excel writer на лету

Моя проблема: я не могу создавать временные файлы или папки на сервере и не могу использовать какой-либо blob.

Любые решения?

+0

вы можете использовать iis и передавать таблицы ur db в файл excel, используя команду процесса , чтобы объявить ur 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 приемлемым?

Я являюсь автором библиотеки a simple .xlsx writer для C#, которая поддерживает запись в поток без прохождения через файл.

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

Я могу преобразовать список в байт []. Могу ли я использовать этот байт [] где угодно, чтобы создать xls? – vishnu

+0

@ Vishnu Нет, поскольку вы не можете вставлять двоичные данные в Excel. Я предполагаю, что 'List ' содержит строки и ints и прочее? Вы в основном должны просматривать каждую строку из базы данных, а затем помещать каждое значение столбца в ячейку в рабочей таблице. Я не знаю NHibernate, поэтому я не знаю, что вы действительно получаете от базы данных. Обычно вы должны получить что-то лучше, чем 'List ', что-то строго типизированное? В любом случае вам придется вручную прокручивать данные и создавать из него Excel 'Cell'. –

Смежные вопросы