perkes456
perkes456

Reputation: 1181

Generating report (invoice) in ASP.NET C#

So I have a gridview with orders filling it. On the side of each row I have set a link button which says "generate invoice". I've defined command name as "GenerateInvoiceCommand" and command argument OrderID so that I can get all the data I need about that order. Now my question is... Is there any way that I can generate a PDF report and once its generated that it automatically starts downloading? Is there any way I can do this without inserting the pdf report first into the database then downloading it?

What other ways are there to generate reports like this?

Any help is appreciated!

Thanks!

Upvotes: 0

Views: 5276

Answers (3)

tom
tom

Reputation: 729

I can see there are two ways :

  1. Use Crystal Report to generate PDF, this answer
  2. Write your own code to generate PDFs, my answer

Because you have tagged Crystal Report, you may want to use first but for gaining more control on your report's appearance second option looks better.

Upvotes: 1

Mahdi ghafoorian
Mahdi ghafoorian

Reputation: 1205

You can generate a report programmatically using following code in asp.net C#

you should bound your datatable with your data

        DataTable dt = GetDataTableFromDGV(AFIs, ArrayTitle, ArrayEnTitle, ArrayOrder, ArrayChecked);       

        DataView dataView = dt.DefaultView;

        report.ScriptLanguage = StiReportLanguageType.CSharp;
        report.RegData("view", dataView);
        //fill dictionary
        report.Dictionary.Synchronize();
        StiPage page = report.Pages.Items[0];
        if (Landscape)
            page.Orientation = StiPageOrientation.Landscape;
        else
            page.Orientation = StiPageOrientation.Portrait;

        //
        Double pos = 0;
        //Double columnWidth = StiAlignValue.AlignToMinGrid(page.Width / dataView.Table.Columns.Count, 0.1, true);

        Double columnWidth = StiAlignValue.AlignToMinGrid(page.Width / dt.Columns.Count, 0.1, true);
        int nameIndex = 1;

        columnWidth = StiAlignValue.AlignToMinGrid(page.Width / dt.Columns.Count, 0.1, true);

        //create ReportTitleBand
        StiReportTitleBand rt = new StiReportTitleBand();
        rt.Height = 1.5f;
        rt.Name = "ReportTitleBand";
        StiText st = new StiText(new RectangleD(0, 0, page.Width, 1f));
        st.Text.Value = ReportTitle;
        st.HorAlignment = StiTextHorAlignment.Center;
        st.Name = "TitleText1";
        st.Font = new Font(FontName, 16f);
        rt.Components.Add(st);
        page.Components.Add(rt);


        //create HeaderBand
        StiHeaderBand headerBand = new StiHeaderBand();
        if (chkRotate)
            headerBand.Height = 0.9f;
        else
            headerBand.Height = 0.5f;
        headerBand.Name = "HeaderBand";
        page.Components.Add(headerBand);


        //create Dataaband
        StiDataBand dataBand = new StiDataBand();
        dataBand.DataSourceName = "view" + dataView.Table.TableName;
        dataBand.Height = 0.5f;
        dataBand.Name = "DataBand";
        dataBand.CanBreak = true;//Added 11 20 2014     

        page.Components.Add(dataBand);

        //create FooterBand
        StiFooterBand footerBand = new StiFooterBand();
        footerBand.Height = 0.5f;
        footerBand.Name = "FooterBand";
        footerBand.Border = new StiBorder(StiBorderSides.All, Color.Black, 1, StiPenStyle.Solid);
        footerBand.PrintOnAllPages = true;            
        page.Components.Add(footerBand);            

        pos = (page.Width - (columnWidth * Convert.ToDouble(dataView.Table.Columns.Count))) / Convert.ToDouble(2);

        for (int i = dataView.Table.Columns.Count - 1; i != -1; i--)
        {
            DataColumn column = dataView.Table.Columns[i];

            //initilized column value
            Double headerHeight = 0.5f;
            if (chkRotate)
                headerHeight = 0.9f;

            StiText headerText = new StiText(new RectangleD(pos, 0, columnWidth, headerHeight));
            headerText.Text.Value = Stimulsoft.Report.CodeDom.StiCodeDomSerializator.ReplaceSymbols(column.Caption).Replace("_", " ");//ReplaceUnderLineWithSpace(column.Caption);
            if (chkRotate)
                headerText.Angle = 90;
            headerText.HorAlignment = StiTextHorAlignment.Center;
            headerText.VertAlignment = StiVertAlignment.Center;
            headerText.Name = "HeaderText" + nameIndex.ToString();
            headerText.Brush = new StiSolidBrush(Color.LightGreen);
            headerText.Border.Side = StiBorderSides.All;
            headerBand.Components.Add(headerText);
            headerText.Font = new Font(FontName, 11.0f);

            headerText.WordWrap = true;
            headerText.GrowToHeight = true;

            //initilized Data Band value
            StiText dataText = new StiText(new RectangleD(pos, 0, columnWidth, 0.5f));
            dataText.Text.Value = "{view" + dataView.Table.TableName + "." + Stimulsoft.Report.CodeDom.StiCodeDomSerializator.ReplaceSymbols(column.ColumnName) + "}";
            dataText.Name = "DataText" + nameIndex.ToString();
            dataText.HorAlignment = StiTextHorAlignment.Center;
            dataText.VertAlignment = StiVertAlignment.Center;
            dataText.Border.Side = StiBorderSides.All;

            dataText.WordWrap = true;
            dataText.GrowToHeight = true;
            dataText.Font = new Font(FontName, 11.0f);                

            //Add highlight
            if (true)
            {
                StiCondition condition = new StiCondition();
                condition.BackColor = Color.CornflowerBlue;
                condition.TextColor = Color.Black;
                condition.Expression = "(Line & 1) == 1";
                condition.Font = new Font(FontName, 11.0f);
                condition.Item = StiFilterItem.Expression;
                dataText.Conditions.Add(condition);
            }

            dataBand.Components.Add(dataText);

            pos += columnWidth;

            nameIndex++;
        }

        ////footer text
        StiText footerText = new StiText(new RectangleD(0, 0, page.Width, 0.5f));
        footerText.Text.Value = "صفحه {PageNumber}";
        footerText.HorAlignment = StiTextHorAlignment.Center;
        footerText.Name = "FooterText";
        footerText.Brush = new StiSolidBrush(Color.WhiteSmoke);
        footerText.Font = new Font(FontName, 11.0f);

        footerBand.Components.Add(footerText);

        report.Render(true);
        StiWebViewer1.ResetReport();
        StiWebViewer1.Report = report;

Upvotes: 0

Nima Derakhshanjan
Nima Derakhshanjan

Reputation: 1404

you should first use a third party software like crystal-reports or stimulsoft to generate the report's template(myReport.mrt) and then do something like this :

StiReport report = new StiReport();
string path = "~/report/myReport.mrt";
report.Load(Server.MapPath(path));

// register your data to report's template

report.Render();
if (!Directory.Exists(Server.MapPath("~/report/PDF")))
     Directory.CreateDirectory(Server.MapPath("~/report/PDF"));
string ReportFileName = Server.MapPath("~/report/PDF/test.pdf");
report.ExportDocument(StiExportFormat.Pdf, ReportFileName);
FileStream file = File.Open(ReportFileName, FileMode.Open);
Response.Clear();
Response.AddHeader("Content-Disposition", "attachment; filename=test.pdf");
Response.AddHeader("Content-Length", file.Length.ToString());
Response.ContentType = "application/pdf";
file.Close();
Response.WriteFile(ReportFileName);

hope it helps

Upvotes: 0

Related Questions