How to make a real XLS file on asp.net c#? - c#

I have this code to extract a table to computer in a .xls file:
// I have a string which contains HTML table codes, named as excelTable
HttpResponse response = HttpContext.Current.Response;
response.Clear();
response.AddHeader("Content-Disposition", String.Format("Attachment;Filename=file.xls", ));
response.Buffer = true;
response.ContentEncoding = System.Text.Encoding.Default;
response.ContentType = "application/vnd.ms-excel";
response.Write(excelTable);
response.End();
And I have seen that this is not a real .xls file. I can open it in Notepad and see my standart html table codes.
Now I understand that defining ContentType is not enough. So what else can I do to generate a pure .xls or .xlsx file? Or Should I certainly use Excel Libraries like OpenXML, Interop, etc. ?

Actual XLS/XLSX data must be sent back - that is, data generated with a library (e.g EEPlus) or other suitable source.
This common hack/approach works because Excel "knows how to read HTML". It doesn't actually turn the HTML into XSL/XLSX, although it can be saved as new spreadsheet once loaded by Excel.
Changing the content type will have no effect on the data, and instead will effectively stop this approach from working: the content type is used for associating the program (i.e. Excel) which will be used to open/read the data.
So yes: to generate a real XLS/XLSX document, use a library.

Related

Generating Excel Sheet using HtmlWriter

i am generating Excel report using string writer.i generated the excel sheet but it generats only one sheet.but i need to create sheets based on my condition.
my code is:
string filename = "DownloadMobileNoExcel.xls";
System.IO.StringWriter tw = new System.IO.StringWriter();
tw.Write("<table>");
tw.Write("<tr><td>data1</td><td>data2</td><td>data3</td><td>data4</td><td>data5</td><td>data6</td></tr>");
tw.Write("<tr><td>data1</td><td>data2</td><td>data3</td><td>data4</td><td>data5</td><td>data6</td></tr>");
tw.Write("<tr><td>data1</td><td>data2</td><td>data3</td><td>data4</td><td>data5</td><td>data6</td></tr>");
tw.Write("</table>");
Response.ContentType = "application/vnd.ms-excel";
Response.AppendHeader("Content-Disposition", "attachment; filename=" + filename + "");
this.EnableViewState = false;
Response.Write(tw.ToString());
Response.End();
The above Code generate single sheet but i want to create based on my condtion,how can i create sheets,i want same method which would to append the Html ,advance Thanks
it can be done using frames: you'll have to create one .html file for each tab you want in the Excel sheet.
To see how it works,
- create an Excel file with 2 sheets
- Save As... .html
- look at the html written (+ the subfolder generated containing the sheets
If you create a similar structure (using the files from the above test as templates), Excel will be able to open it.
Another approach is to create an Excel file using OpenXml, as decribed here:
How to write data on new sheet of EXCEL

Export to excel opening it

I currently have an option in my app to export to Excel. It saves the data to a file in disk.
I would like to open Excel instead and show the data. Do any of you know if this is possible and how to accomplish it?
I guess I can just open the file I'm already saving to disk, but it would be just better to not save a file to disk at all.
I am assuming you are using Interop. Just set the Application to Visible.
excelApp.Visible = true;
where
InteropExcel.Application excelApp;
Just remember to still release all the COM references so that your application does not also hold a handle to Excel. That may cause your Excel file to be read-only.
How are you currently creating your file?
If you are using the Excel engine or POI (or what ever thier abbreviation is) to create an XLS / XLSX it would just be a case of not saving the workbook and making the instance visible (as per above)?
If you are not dependant on or do not want to be dependant on Excel (i.e. using 3rd party libraries like Syncfusion to create the file) or just outputting your data in an excel readable format like CSV, then I guess you're stuck with a file-based operation...
As for a temp file being easier than an unsaved one... the data needs to be created in either instance, either simple CSV or a coded population of Excel cells, so I don't quite see what is meant by that.
Refer Below code to open excel without saving
System.Web.HttpContext.Current.Response.Clear();
System.Web.HttpContext.Current.Response.AddHeader("content-disposition", "attachment; filename=DateTime.Now + ".xls");
System.Web.HttpContext.Current.Response.Charset = "";
Response.Cache.SetCacheability(HttpCacheability.NoCache); // If you want the option to open the Excel file without saving than
System.Web.HttpContext.Current.Response.ContentType = "application/vnd.xls";
System.IO.StringWriter stringWrite = new System.IO.StringWriter();
System.Web.UI.HtmlTextWriter htmlWrite = new HtmlTextWriter(stringWrite);
Gridview1.RenderControl(htmlWrite);
//style to format numbers to string
string style = #"<style> .textmode { } </style>";
System.Web.HttpContext.Current.Response.Write(style);
System.Web.HttpContext.Current.Response.Output.Write(stringWrite.ToString());
System.Web.HttpContext.Current.Response.Flush();
System.Web.HttpContext.Current.Response.End();

.xlsx file corrumption following streaming event

I am using the EPPlus library to create an .xlsx file which I am then streaming to the browser. To stream the code I am using:
HttpContext.Current.Response.Clear();
HttpContext.Current.Response.Buffer = true;
HttpContext.Current.Response.ContentType = "application/octet-stream";
HttpContext.Current.Response.AddHeader("Content-Disposition", "attachment;filename=" + Server.MapPath("xls/"+ download_results_filename));
HttpContext.Current.Response.TransmitFile(Server.MapPath("xls/" + download_results_filename));
HttpContext.Current.Response.Flush();
My question is this. If I use my code along with the library, save and open the document everything is fine. However, when I create the file on the server and stream it to the user, using the code above, I get a corrupt file message with the additional ability to correct or recover the file, which I do and the file displays correct; so if using the octet stream method above to stream the file to the user corrupts the file how should I stream the Binary data to the user. I want to keep the content type to 'application/octet-stream' as if I am specific about it being an excel spreadsheet I run into problems on the iPad.
Thanks
Did you see this example?
http://epplus.codeplex.com/wikipage?title=WebapplicationExample
It use this line
Response.BinaryWrite(pck.GetAsByteArray());

Can I download an Excel file made from a memory stream off an ASP.NET page?

I have an ASP.NET page where a user provides an ID, and then we pull some data from the DB and put it into an Excel spreadsheet. I would like to create the Excel file in memory and then allow the user to download the file. I could create a file on the server, and then delete it afterwards, but it seems unnecessary. Depending on error handling I could potentially orphan a file with that approach, etc.
Is something like this possible? Or do I need to use a file stream?
On a side note, I'm using EPPlus as an API (quick plug for it).
You want to specify the content-type and content-dispisition headers like so - Response.ContentType = "application/vnd.ms-excel" works in IE and firefox but not in Safari, then stream your file. Once complete, call Response.End() to stop the application execution
Code Sample:
void StreamExcelFile(byte[] bytes)
{
Response.Clear();
Response.ContentType = "application/force-download";
Response.AddHeader("content-disposition", "attachment; filename=name_you_file.xls");
Response.BinaryWrite(bytes);
Response.End();
}
ExcelPackage pck = new ExcelPackage();
.....
.....
.....
byte[] bfr = pck.GetAsByteArray();
Response.ContentType = "application/application/vnd.openxmlformats-officedocument.spreadsheetml.sheet";
Response.AppendHeader("content-disposition", "attachment; filename=ExcelFileName.xlsx");
Response.OutputStream.Write(bfr, 0, bfr.Length);
Response.Flush();
Response.Close();
Yes, look into using an HTTP Handler to stream the file to the browser from memory.
http://msdn.microsoft.com/en-us/library/ms972953.aspx
What you're looking for is called a generic handler:
http://www.dotnetperls.com/ashx
In a nutshell, what you need to do is define the context type. Which in your case will be a xls or xlsx. Set the response, and direct the user to the handler.
They will be prompted to download the file.

ASP.Net Export Data to Excel

Wondering what is a good library I can use with VS2005 to export data to a excel file. The file has some formatting like background colors and colspans.
Thanks
Here is some code that uses a trick to output HTML to an Excel file. I have found that you can trick excel into opening an HTML by setting the content type of the output to "application/excel".
In the code below secresults is an HTML div like so:
<div id="secresults" runat="server" visible="false" class="secresults">
Content or data here.
</div>
In code behind:
Response.ClearContent();
string filename = "Output" + istartDate.ToShortDateString() + ".xls";
Response.AddHeader("content-disposition", "attachment; filename=" + filename + ";");
Response.ContentType = "application/excel";
StringWriter sw = new StringWriter();
HtmlTextWriter htw = new HtmlTextWriter(sw);
secresults.RenderControl(htw);
Response.Write(sw.toString());
Response.End();
I have found that you can use some html formatting in excel. To test which formatting you can use you can create an html file and rename it to a .xls file, then open it with excel. You can get a pretty good idea about what HTML Excel will read.
I would recommend taking the class from the following website, and adapting it to your needs.
Mikes Knowledge Base - ExportToExcel
By default, this class takes a DataSet, DataTable or List<>, and exports it into a genuine Excel 2007 .xlsx file, using the OpenXML libraries (also provided).
It doesn't currently attempt to add any formating to the Excel cells (DataTables only store values, not formating, colors, horizontal alignment, etc !) but it should be a good place to start from.
All source code is provided, free of charge, so you can adapt it as required.
Good luck !
I have used this library in the past, but I normally just spit out a CSV file.
C# class library for exporting data to CSV/Excel file
If you have predefined layout of the document, Templater will probably fit your description.
Take a look at the example on how to use it.
I've used this codeplex project (Excel Package). One technique is to start with a formatted template, then modify the template. That is much easier than applying a lot of styling commands starting with an empty spreadsheet.

Categories

Resources