Передача данных от оператора ASP.NET веб-сайт в электронную таблицу excel с помощью microsoft.office.interop.excel
У меня есть ASP.Net веб-сайт с веб-элементом управления ImageButton и несколькими веб-элементами управления Label. Пользователь может взаимодействовать с кнопкой ImageButton, нажав на нее. Программа дает пользователю расстояние между парой кликов и увеличивает это расстояние до бегущей суммы. События щелчка в ImageButton обрабатываются скриптом типа "text/javascript". Обработчик OnClientClick ImageButton вызывает функцию Pic_Click из скрипта каждый раз, когда пользователь щелкает мышью. Каждый раз, когда текущий итог обновляется, это значение передается в ASP.Net скрытое поле под названием "totalhold".
То, что я пытаюсь сделать, - это обновить активную ячейку открытой книги Excel с помощью этого текущего итога, когда пользователь нажимает кнопку ASP.Net пуговица. Событие click для кнопки обрабатывается обработчиком OnClick кнопки.Метод вызывается из соответствующего файла C# (вызов метода C# с обработчиком OnClick действительно работает в моем случае). Я сделал нечто подобное на веб-сайте c# Windows Forms, используя ссылку на Microsoft.Офис.Взаимодействие.Excel.dll. Я ссылался на то же самое .dll на моем текущем веб-сайте, но ничего не происходит, когда я нажимаю кнопку обновления.
Вопрос в том, как я могу правильно использовать Microsoft.Офис.Взаимодействие.Excel.dll чтобы обновить активную ячейку из ASP.Чистый сайт?
Вот .aspx-страницы:
<asp:ImageButton ID="pic" runat="server" ImageAlign="Left" OnClientClick="Image_Click(); return false;" /> <asp:Button ID="Upload" runat="server" Text="Upload File" OnClick="Open_It" style="z-index: 1; position: absolute; top: 136px; left: 1392px; height: 27px;" /> <asp:HiddenField ID="totalhold" runat="server" /> <asp:Label ID="labeltotal" runat="server" Text="Total: "></asp:Label> <asp:Label ID="labelarea" runat="server" Text="Area: "></asp:Label> <asp:Button ID="UpdateExcel" runat="server" Text="Update Excel" Width="195px" OnClick="updateExcel"/>
Вот как выглядит функция скрипта :
function Image_Click() { numClick++; document.getElementById("labelcount").innerText = "Count: " + numClick; if (numClick % 2 == 1) { pos1x = event.pageX; pos1y = event.pageY; } else if (numClick % 2 == 0) { pos2x = event.pageX; pos2y = event.pageY; distx = Math.abs(pos2x - pos1x); disty = Math.abs(pos2y - pos1y); redistx = Math.ceil(distx / (1 / zoom * Math.floor(200 / 4))); redisty = Math.ceil(disty / (1 / zoom * Math.floor(200 / 4))); newdist = Math.ceil(Math.sqrt(redistx * redistx + redisty * redisty)); document.getElementById("lengthlabel").innerText ="Length: " + newdist; total += newdist; var th = document.getElementById("totalhold"); th.value = total; document.getElementById("labeltotal").innerText = "Span: " + total; } }
Сценарий работает отлично.
Что я уже пробовал:
Это мой метод update вызывается обработчик onclick кнопки Обновить :
protected void updateExcel(object sender, EventArgs e) { bpRow = excelApp.ActiveCell.Row; bpColumn = excelApp.ActiveCell.Row; MySheet.Cells[bpRow, bpColumn] = Convert.ToDouble(totalhold.Value); MyBook.Save(); labelarea.Text = totalhold.Value; }
Для дополнительного контекста я знаю, что значение ASP.Net скрытое значение поля переживает обратную передачу, потому что последняя строка в методе работает без сбоев.
Вот как я устанавливаю открытую электронную таблицу Excel:
protected void Open_It(object sender, EventArgs e) { string folderPath = Server.MapPath("~/Files/"); if (!Directory.Exists(folderPath)) { Directory.CreateDirectory(folderPath); } string filename = FileUploader.FileName; if (!File.Exists(Path.Combine(folderPath, filename))) FileUploader.SaveAs(folderPath + filename); string ext = Path.GetExtension(filename); else if (ext == ".xlsx") { excelApp = new Excel.Application(); excelApp.Visible = true; MyBook = excelApp.Workbooks.Open(Path.GetFileName(FileUploader.FileName)); isOpen = true; MySheet = (Excel.Worksheet)MyBook.Sheets[1]; // Explicit cast is not required here } }
Эта часть действительно открывает электронную таблицу