0

I want to display the excel document template from a LinkButton click. However on the server side, I'm not able to do so (instead it just seems like refreshing that page).

How do I do this?

 public class CreateExcelDoc
    {
        public static Excel.Application app = null;
        public static Excel.Workbook workbook = null;
        public static Excel.Worksheet worksheet = null;
        public static Excel.Range workSheet_range = null;

        public CreateExcelDoc()
        {
            createDoc();
        }

        public void createDoc()
        {
            try
            {
                app = new Excel.Application();
                app.Visible = true;
                workbook = app.Workbooks.Add(1);
                worksheet = (Excel.Worksheet)workbook.Sheets[1];

            }
            catch (Exception)
            {
                //MessageBox.Show("Error!");
            }
            finally
            {
            }
        }

        public void createHeaders(int row, int col, string htext, string cell1, string cell2, int mergeColumns, string b, bool font, int size, string fcolor)
        {
            object misValue = System.Reflection.Missing.Value;
            worksheet.Cells[row, col] = htext;
            workSheet_range = worksheet.get_Range(cell1, cell2);
            workSheet_range.Merge(mergeColumns);
            //workSheet_range.Validation.Add(Excel.XlDVType.xlValidateInputOnly, Excel.XlDVAlertStyle.xlValidAlertStop, Excel.XlFormatConditionOperator.xlBetween, misValue, misValue);
            switch (b)
            {
                case "YELLOW":
                    workSheet_range.Interior.Color = System.Drawing.Color.Yellow.ToArgb();
                    break;
                case "GRAY":
                    workSheet_range.Interior.Color = System.Drawing.Color.Gray.ToArgb();
                    break;
                case "WHITE":
                    workSheet_range.Interior.Color = System.Drawing.Color.White.ToArgb();
                    break;
                case "ANWHITE":
                    workSheet_range.Interior.Color = System.Drawing.Color.AntiqueWhite.ToArgb();
                    break;
                default:
                    // workSheet_range.Interior.Color = System.Drawing.Color..ToArgb();
                    break;
            }

            workSheet_range.Borders.Color = System.Drawing.Color.Black.ToArgb();
            workSheet_range.Font.Bold = font;
            workSheet_range.ColumnWidth = size;
            if (fcolor.Equals(""))
            {
                workSheet_range.Font.Color = System.Drawing.Color.White.ToArgb();
            }
            else
            {
                workSheet_range.Font.Color = System.Drawing.Color.Black.ToArgb();
            }
        }

        public void addData(int row, int col, string data, string cell1, string cell2, string format)
        {
            worksheet.Cells[row, col] = data;
            workSheet_range = worksheet.get_Range(cell1, cell2);
            workSheet_range.Borders.Color = System.Drawing.Color.Black.ToArgb();
            workSheet_range.NumberFormat = format;
        }
    }



 protected void DownloadLinkBtn_Click(object sender, EventArgs e)
        {
            try
            {
                #region Create excel format & show

                //create the excel template for the users
                CreateExcelDoc excell_app = new CreateExcelDoc();
                excell_app.createHeaders(1, 1, "a", "A1", "A1", 0, "YELLOW", true, 30, "");
                excell_app.createHeaders(1, 2, "b", "B1", "B1", 0, "YELLOW", true, 10, "");
                excell_app.createHeaders(1, 3, "c", "C1", "C1", 0, "YELLOW", true, 30, "");
                excell_app.createHeaders(1, 4, "d", "D1", "D1", 0, "YELLOW", true, 10, "");
                excell_app.createHeaders(1, 5, "e", "E1", "E1", 0, "YELLOW", true, 10, "");
                excell_app.createHeaders(1, 6, "f", "F1", "F1", 0, "YELLOW", true, 20, "");
                excell_app.createHeaders(1, 7, "g", "G1", "G1", 0, "ANWHITE", true, 20, "");
                excell_app.createHeaders(1, 8, "h", "H1", "H1", 0, "ANWHITE", true, 20, "");
                excell_app.createHeaders(1, 9, "i", "I1", "I1", 0, "ANWHITE", true, 20, "");
                excell_app.createHeaders(1, 10, "j", "J1", "J1", 0, "ANWHITE", true, 20, "");

            //add data into cells
            excell_app.addData(2, 1, "", "A2", "J501", "");

            object misValue = System.Reflection.Missing.Value;
            CreateExcelDoc.workbook = CreateExcelDoc.app.Workbooks.Add(misValue);

            CreateExcelDoc.workbook.Close(true, misValue, misValue);

            ////prevent stacking of worksheet
            releaseObject(CreateExcelDoc.worksheet);
            releaseObject(CreateExcelDoc.workbook);
            releaseObject(CreateExcelDoc.app);

            #endregion
        }
        catch
        {
        }
    }
Brock Adams
  • 90,639
  • 22
  • 233
  • 295

2 Answers2

0

You need to install Office interOp runtime at deployment machine but I think that is not good solution. Take a look at How to create Excel file dynamically in ASP.NET and Reading Excel files from C#.

Community
  • 1
  • 1
KV Prajapati
  • 93,659
  • 19
  • 148
  • 186
0

The Office Interop assemblies were never intended to be used for server-side development. You may want to consider using Open XML instead. The following KB article provides a detailed explanation: Considerations for server-side Automation of Office

As @AVD mentioned, you do need to have Office Primary Interop Assemblies installed on the server. Also, depending on the MS Office version you are trying to use, the 64bit Office Interop assemblies may not be available.

Vassili Altynikov
  • 2,049
  • 2
  • 17
  • 24