简体   繁体   中英

Unable to display/open excel document after published to server! It's fine on local machine but not on server

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
        {
        }
    }

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# .

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.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM