Мой проект в 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, но не нашел способа, как это исправить.
Пожалуйста, помогите, если кто-нибудь знает, как решить эту проблему или любое другое решение для достижения окончательного результата.
Заранее спасибо :)