Requirement:Provided the user has authorization to request reports (Vols.reports=”Y”), display report names (Report.rname) as report choices and a “Return to the Volunteer Menu” button. When the user clicks on a name, retrieve the report script from the Reports table, execute the script, email the result to the user as an Excel spreadsheet attachment, and display the message “Report Successfully Sent.”
Problem:The requirement is mentioned above. I have attached 'report.aspx.cs' file (I'm using C#.NET) which I have developed to meet above requirement. Everything works fine except that the excel sheet has garbage characters in first row like '´' etc. Any ideas to solve this problem? Any help will be greatly appreciated. Thanks, [email protected]
using System;using System.Data;using System.Configuration;using System.Collections;using System.Web;using System.Web.Security;using System.Web.UI;using System.Web.UI.WebControls;using System.Web.UI.WebControls.WebParts;using System.Web.UI.HtmlControls;using System.Data.SqlClient;using System.Web.Mail;using System.Net.Mail;using System.Data.OleDb;using System.Data.Common;using System.IO;
public partial class development_Reports : System.Web.UI.Page{ string connstr = ConfigurationSettings.AppSettings["connstr"]; string smtpserver = ConfigurationSettings.AppSettings["smtpserver"]; string smtpusername = ConfigurationSettings.AppSettings["smtpusername"]; string smtppassword = ConfigurationSettings.AppSettings["smtppassword"];
protected void CreateMessageAlert(System.Web.UI.Page senderPage, String alertMsg, String alertKey, string url) { String strScript = "<script language=JavaScript>alert('" + alertMsg + "');location.href('" + url + "');</script>"; if (!(senderPage.IsStartupScriptRegistered(alertKey))) { senderPage.RegisterStartupScript(alertKey, strScript); } } public void sendmail(int report,string frm, string to, string sub, string bdy, string smtpserver, string smtpusername, string smtppassword) { string DocFileName=""; DocFileName = "report.xls"; string FilePathName = Request.PhysicalPath; FilePathName = FilePathName.Substring(0, FilePathName.LastIndexOf("\\")); FilePathName = FilePathName + "\\" + DocFileName;
if (smtpusername != "" && smtppassword != "") { System.Net.Mail.MailMessage msg = new System.Net.Mail.MailMessage(frm, to, sub, bdy); msg.Attachments.Add(new Attachment(FilePathName)); msg.IsBodyHtml = true; System.Net.Mail.SmtpClient smtpClient = new System.Net.Mail.SmtpClient(smtpserver); smtpClient.UseDefaultCredentials = false; smtpClient.Credentials = new System.Net.NetworkCredential(smtpusername, smtppassword); smtpClient.Send(msg); } else { System.Web.Mail.MailMessage msg = new System.Web.Mail.MailMessage(); msg.From = frm; msg.To = to; msg.Subject = sub; msg.Attachments.Add(new Attachment(FilePathName)); msg.BodyFormat = MailFormat.Html; msg.Body = bdy; SmtpMail.SmtpServer = smtpserver; SmtpMail.Send(msg); } } protected void Page_Load(object sender, EventArgs e) { if (!IsPostBack) { SqlConnection sqlconn = new SqlConnection(connstr); SqlDataAdapter sqlda = new SqlDataAdapter("select * from reports", sqlconn); DataSet ds = new DataSet(); sqlda.Fill(ds, "reports"); sqlconn.Open(); ddlReportName.DataSource = ds; ddlReportName.DataTextField = "rname"; ddlReportName.DataValueField = "rcode"; ddlReportName.DataBind(); ddlReportName.Items.Add("Choose a Report"); ddlReportName.SelectedIndex = ddlReportName.Items.Count - 1; sqlconn.Close(); } } protected void ddlReportName_SelectedIndexChanged(object sender, EventArgs e) { SqlConnection sqlconn = new SqlConnection(connstr); SqlCommand sqlcomm = new SqlCommand("select rsql from reports where rcode=" + ddlReportName.SelectedValue.ToString() + " ", sqlconn); sqlconn.Open(); SqlDataReader dr; dr = sqlcomm.ExecuteReader(); string rsql = ""; while (dr.Read()) { rsql = dr.GetValue(0).ToString(); } dr.Close(); sqlconn.Close();
SqlDataAdapter sqlada = new SqlDataAdapter(rsql, sqlconn); DataSet ds = new DataSet(); sqlada.Fill(ds, "dtreports");
int report = int.Parse(ddlReportName.SelectedValue); //dgtoexcel(report); //dstoexcel(); dg2excel(ds); //DataGrid1.Visible = false; //Convert(ds,Response,"report.xls"); sendmail(report, "[email protected]", Session["userid"].ToString(), "osv-Reports", "The report is attached", smtpserver, smtpusername, smtppassword); CreateMessageAlert(this, "Report Successfully Sent.", "alertKey", "volunteermenu.aspx"); } public void dgtoexcel(int report) { string DocFileName=""; DocFileName = "report.xls"; try { //Export data from DataGrid to Excel Sample Codes //Write DataGrid1 html code to StringWriter this.DataGrid1.Page.EnableViewState = false; System.IO.StringWriter tw = new System.IO.StringWriter(); System.Web.UI.HtmlTextWriter hw = new System.Web.UI.HtmlTextWriter(tw); this.DataGrid1.RenderControl(hw); string HtmlInfo = tw.ToString().Trim(); string FilePathName = Request.PhysicalPath; FilePathName = FilePathName.Substring(0, FilePathName.LastIndexOf("\\")); //Get the physical address of Excel file FilePathName = FilePathName + "\\" + DocFileName; if (System.IO.File.Exists(FilePathName)) { System.IO.File.Delete(FilePathName); } FileStream Fs = new FileStream(FilePathName, FileMode.Create); BinaryWriter BWriter = new BinaryWriter(Fs); //Write the data information of DataGrid to Excel BWriter.Write(HtmlInfo); hw.Dispose(); tw.Dispose(); Fs.Flush(); BWriter.Flush(); Fs.Close(); Fs.Dispose(); BWriter.Close(); } catch { } }
void dstoexcel() { //// Create a DataSet from an XML file and retrieve an order table. //String xmlfile = Server.MapPath("files/spiceorder.xml"); //System.Data.DataSet dataset = new System.Data.DataSet(); //dataset.ReadXml(xmlfile); //System.Data.DataTable datatable = dataset.Tables["OrderItems"];
//System.Data.DataTable datatable1 = ds.Tables[0]; //// Open the template workbook, which contains number formats and //// formulas, and get an IRange from a defined name //String filename = Server.MapPath("report.xls"); //SpreadsheetGear.IWorkbook workbook = SpreadsheetGear.Factory.GetWorkbook(filename); //SpreadsheetGear.IRange range = workbook.Names["SetDataRange"].RefersToRange;
//// Insert the DataTable into the template worksheet range. The InsertCells //// flag will cause the formatted range to be adjusted for the inserted data. //range.CopyFromDataTable(datatable1, SpreadsheetGear.Data.SetDataFlags.InsertCells);
//// Retrieve a DataSet from a defined name which includes the formatted range. //System.Data.DataSet datasetOutput = workbook.GetDataSet("GetDataRange", //SpreadsheetGear.Data.GetDataFlags.FormattedText);
// //Bind a DataGrid to the formatted DataSet //DataGrid1.DataSource = datasetOutput; //DataGrid1.DataBind(); }
void dg2excel(DataSet ds) { string DocFileName = ""; DocFileName = "report.xls"; System.IO.StringWriter stringWrite = new System.IO.StringWriter(); System.Web.UI.HtmlTextWriter htmlWrite = new System.Web.UI.HtmlTextWriter(stringWrite); System.Web.UI.WebControls.DataGrid dg = new System.Web.UI.WebControls.DataGrid();
//dg.DataSource = FitDataTableToExcel(ds.Tables[0]); dg.DataSource = ds.Tables[0]; dg.DataBind(); dg.RenderControl(htmlWrite);
string HtmlInfo = stringWrite.ToString().Trim();
string FilePathName = Request.PhysicalPath; FilePathName = FilePathName.Substring(0, FilePathName.LastIndexOf("\\")); //Get the physical address of Excel file FilePathName = FilePathName + "\\" + DocFileName; if (System.IO.File.Exists(FilePathName)) { System.IO.File.Delete(FilePathName); } FileStream Fs = new FileStream(FilePathName, FileMode.Create); BinaryWriter BWriter = new BinaryWriter(Fs); //BinaryWriter BWriter = new BinaryWriter(Fs, System.Text.Encoding.GetEncoding("utf-8")); //Write the data information of DataGrid to Excel BWriter.Write(HtmlInfo);
htmlWrite.Dispose(); stringWrite.Dispose(); Fs.Flush(); BWriter.Flush(); Fs.Close(); Fs.Dispose(); BWriter.Close(); } public void Convert(DataSet ds, HttpResponse response, string xlsFileName) { response.Clear(); response.AddHeader("content-disposition", "attachment;filename=" + xlsFileName); response.Charset = ""; response.ContentType = "application/vnd.ms-excel";
System.IO.StringWriter stringWrite = new System.IO.StringWriter(); System.Web.UI.HtmlTextWriter htmlWrite = new System.Web.UI.HtmlTextWriter(stringWrite); System.Web.UI.WebControls.DataGrid dg = new System.Web.UI.WebControls.DataGrid();
dg.DataSource = ds.Tables[0]; dg.DataBind(); dg.RenderControl(htmlWrite);
response.Write(stringWrite.ToString()); response.End(); } private DataTable FitDataTableToExcel(DataTable dt) { int ExcelRowLimit = 65534; int TotTableRowCounter = 0; int TotExcelRowCounter = 0; int TempExcelRowCounter = 0; int TableCounter = 0; DataRow dr; DataTable ExcelTempTable = new DataTable(); DataTable ExcelTable = new DataTable(); do { ExcelTempTable = dt.Clone(); TableCounter += 1; // Create Excel Temporary Table TempExcelRowCounter = 0; do { TotTableRowCounter += 1; TempExcelRowCounter += 1; dr = dt.Rows[TotTableRowCounter - 1]; ExcelTempTable.NewRow(); ExcelTempTable.ImportRow(dr); } while (TotTableRowCounter < dt.Rows.Count & TempExcelRowCounter < ExcelRowLimit); // Join Excel Temporary Table to Excel Table as columns // Create columns of Excel Table // Line No column ExcelTable.Columns.Add(new DataColumn("No [" + TableCounter.ToString() + "]", typeof(Int32))); for (int i = 0; i <= ExcelTempTable.Columns.Count - 1; i++) { ExcelTable.Columns.Add(new DataColumn(ExcelTempTable.Columns[i].ColumnName + " [" + TableCounter.ToString() + "]", ExcelTempTable.Columns[i].DataType)); } // Table seperator column ExcelTable.Columns.Add(new DataColumn("[*" + TableCounter.ToString() + "*]", typeof(String))); // Fill data into Excel Table from Excel Temporary Table int ExcelTableRow, ExcelTableCol = 0; for (ExcelTableRow = 0; ExcelTableRow <= ExcelTempTable.Rows.Count - 1; ExcelTableRow++) { try { ExcelTable.Rows[ExcelTableRow].BeginEdit(); } catch { dr = ExcelTable.NewRow(); ExcelTable.Rows.Add(dr); ExcelTable.Rows[ExcelTableRow].BeginEdit(); } // Row Number value TotExcelRowCounter += 1; ExcelTable.Rows[ExcelTableRow][(TableCounter - 1) + ((TableCounter - 1) * (ExcelTempTable.Columns.Count + 1))] = TotExcelRowCounter; // Data column's value for (ExcelTableCol = 0; ExcelTableCol <= ExcelTempTable.Columns.Count - 1; ExcelTableCol++) { int CurrenColPositon = (ExcelTableCol + 1) + ((TableCounter - 1) * (ExcelTempTable.Columns.Count + 2)); ExcelTable.Rows[ExcelTableRow][CurrenColPositon] = ExcelTempTable.Rows[ExcelTableRow].ItemArray[ExcelTableCol]; } // Seperator column's value ExcelTable.Rows[ExcelTableRow][(TableCounter - 1) + (((TableCounter - 1) * (ExcelTempTable.Columns.Count + 1)) + ExcelTempTable.Columns.Count + 1)] = " ";
ExcelTable.Rows[ExcelTableRow].EndEdit(); ExcelTable.Rows[ExcelTableRow].AcceptChanges(); } } while (TotTableRowCounter < dt.Rows.Count); return ExcelTable; }}