Невозможно открыть файл Excel на Windows Server R2 с помощью кода C # - PullRequest
0 голосов
/ 13 сентября 2018

Мой проект в ASP.Net MVC. Я создаю модуль, который автоматически создает файл Excel с различными сводными таблицами в нем, получая доступ к данным базы данных сервера SQL, а затем автоматически отправляет электронную почту соответствующим пользователям с этим приложенным приложением Excel. Я пытался создать сводные таблицы с использованием библиотек Spire.Xls, но его бесплатный продукт имеет ограниченные возможности, поэтому я решил написать макрос в Excel, который будет создавать сводные таблицы, но затем я должен вызывать этот макрос из кода C # по нажатию кнопки. Я не получил правильное решение, которое будет вызывать макрос Excel через код C #. Тогда я решил, что просто открою файл Excel, чтобы макрос события открытия автоматически запускался в файле Excel. Я написал следующий макрос в Excel.

Private Sub Workbook_Open()

Dim strFileName As String
Dim strPath As String

bIf ActiveWorkbook.FileFormat = 56 Then
'If UCase(Trim(Environ("username"))) = "RITPATEL" Or _
UCase(Trim(Environ("username"))) = "NIKAMBLE" Then

    'Delete existing data
    Worksheets("MTS Data").Range("A2:A50000").EntireRow.Delete

    'Copy Data
    'Open file
    strPath = ThisWorkbook.Path & "\"

    Workbooks.Open (strPath & "MTS Dump.xlsx")

    strWorksheet = "MTS Dump"

    nFirstRow = 1
    nFirstCol = 1

    Call GetRows(strWorksheet)
    Call GetCols(strWorksheet)


    With Workbooks("MTS Dump.xlsx").Worksheets(strWorksheet)
        .Activate
        .Range(.Cells(nFirstRow + 1, nFirstCol), .Cells(nLastRow, nLastCol)).Select
        Selection.Copy
    End With


    ThisWorkbook.Activate
    Worksheets("MTS Data").Select
    Worksheets("MTS Data").Range("A2").Select
    ActiveSheet.Paste
    Worksheets("MTS Data").Range("A2").Select

    Application.CutCopyMode = False

    'Update Date & Time

    ThisWorkbook.Worksheets("Upload Details").Range("A2").Value = _
    Workbooks("MTS Dump.xlsx").Worksheets("Upload Details").Range("A2").Value

    ThisWorkbook.Worksheets("Upload Details").Range("B2").Value = _
    Workbooks("MTS Dump.xlsx").Worksheets("Upload Details").Range("B2").Value

    Call CloseDataWorkbook

    strFileName = Right("00" & Day(Worksheets("Upload Details").Range("A2").Value), 2) & _
            Right("00" & Month(Worksheets("Upload Details").Range("A2").Value), 2) & _
            Right(Year(Worksheets("Upload Details").Range("A2").Value), 2) & "-MTS Report-" & _
            Format(Worksheets("Upload Details").Range("A2").Value, "Mmm") & " - " & _
            Format(Worksheets("Upload Details").Range("B2").Value, "HH.MM AM/PM") & ".xlsb"

    'MsgBox strFileName


    Call Refresh_Pivots

    'Save As file
    Worksheets("Sector Wise- Billable MTS").Select
    Application.DisplayAlerts = False
    ThisWorkbook.Save
    Worksheets("Upload Details").Visible = xlVeryHidden
    Application.DisplayAlerts = True
    Application.DisplayAlerts = False
    ThisWorkbook.SaveAs strPath & strFileName, 50
    Application.DisplayAlerts = True

    'Workbooks.Open strPath & strFileName

    'Call Refresh_Pivots

    Workbooks(strFileName).Save
    'Workbooks(strFileName).Close

    'Call CloseDataWorkbook


    'ThisWorkbook.Close
    Application.Quit

'End If
End If
End Sub

Этот макрос обращается к данным других файлов Excel, которые представляют собой MTSDump, и он создаст один новый файл Excel, который будет иметь все сводные таблицы. Так что я просто хочу открыть этот файл Excel по нажатию кнопки, и макрос создаст все дальше. Я написал следующий код в C #, который сначала обновит данные в Excel, то есть MTSDump, а затем просто откроет второй файл Excel.

  public void GetMTS()
    {
        DashboardViewModel soVM = new DashboardViewModel();

        using (System.Data.SqlClient.SqlConnection conn = new System.Data.SqlClient.SqlConnection(ConfigurationManager.ConnectionStrings["SqlConString"].ToString()))
        {
            using (System.Data.SqlClient.SqlCommand cmd = new System.Data.SqlClient.SqlCommand())
            {
                cmd.CommandText = "MTS_ReportExcel";
                cmd.Connection = conn;
                cmd.CommandType = CommandType.StoredProcedure;

                conn.Open();

                System.Data.SqlClient.SqlDataAdapter adapter = new System.Data.SqlClient.SqlDataAdapter(cmd);

                DataSet ds = new DataSet();
                adapter.Fill(ds);

                conn.Close();

                DataTable mts = ds.Tables[0];
                DataTable mts1 = ds.Tables[1];

                Workbook book1 = new Workbook();

                book1.LoadFromFile(@"C:\Test\MTS Dump.xlsx");

                book1.CreateEmptySheet("abc");
                book1.CreateEmptySheet("xyz");
                book1.Worksheets[0].Remove();
                book1.Worksheets[1].Remove();
                Worksheet sheet3 = book1.Worksheets[0];
                Worksheet sheet4 = book1.Worksheets[1];


                sheet3.Name = "MTS Dump";

                sheet4.Name = "Upload Details";
                sheet3.InsertDataTable(mts, true, 1, 1);
                sheet4.InsertDataTable(mts1, true, 1, 1);


                book1.SaveToFile(@"C:\Test\MTS Dump.xlsx");
                book1.Save();
                System.Diagnostics.Process.Start(@"C:\MTS\New MTS\MTS Report Template v4.xls");


            }
        }
    }

System.Diagnostics.Process.Start (@ "C: \ MTS \ New MTS \ Шаблон отчета MTS v4.xls"); это откроет второй файл Excel. Этот код работает правильно на локальном компьютере. Но когда я развернул его на сервере Windows Server 2008 R2, он просто обновляет данные в первом Excel, но не открывает второй файл Excel. Так как он не может открыть файл Excel на сервере, макрос не выполняется. Я пробовал несколько решений из поиска в Интернете, например, по этой ссылке

Но ничего не работает, я имею в виду, что это связано с безопасностью Server Excel, но не нашел способа, как это исправить.

Пожалуйста, помогите, если кто-нибудь знает, как решить эту проблему или любое другое решение для достижения окончательного результата.

Заранее спасибо :)

...