Member 13396929 Ответов: 2

Передача данных от оператора 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

        }
    }

Эта часть действительно открывает электронную таблицу

2 Ответов

Рейтинг:
2

RmcbainTheThird

вам придется использовать activeX для запуска приложения на компьютере пользователя, что очень плохо. кроме того, вам нужно будет создать этот файл, содержащий данные, и заставить пользователя загрузить его, а затем через activeX запустить приложение с загруженным файлом в качестве параметра. Я бы создал файл, чтобы пользователь загрузил его, а затем позволил пользователю открыть свою копию Excel, чтобы посмотреть на файл. YMMV


Member 13396929

Я не совсем понимаю, что вы сказали об activeX, который я вообще не использую. Электронная таблица excel, которую я использую, является собственностью компании, и я уже храню ее на веб-сайте. Кроме того, в моей области каждый имеет доступ к Excel

Рейтинг:
0

Dave Kreskowiak

Короче говоря, вы не можете.

Вы не можете использовать Office Interop в ASP.NET приложение. Весь этот код работает полностью на стороне сервера, а не на клиенте. Ваш серверный код никогда не будет иметь никакого доступа к чему-либо на клиенте. Все твои ASP.NET код может сделать это сгенерировать HTML-файлы и файлы сценариев и отправить их в клиентский браузер.

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

На стороне клиента ваш код javascript не будет иметь доступа ни к одному экземпляру Excel, работающему на клиенте. Это было бы огромным риском для безопасности, если бы это было возможно.

Да, я знаю, что вы скажете: "Ну, это работает на моей машине разработки!". Да, потому что все работает как вы и работает локально на одной машине. Это не будет иметь место при развертывании веб-приложения на сервере. Как только вы это сделаете, все, что вы написали, перестанет работать.

Вы не можете делать то, что хотите.


Member 13396929

Я понимаю, о чем ты говоришь. Итак, подводя итог, код Javascript не может получить доступ к экземпляру Excel на клиентском компьютере.
Если моя собственная электронная таблица Excel хранится на сервере веб-сайта, могу ли я открыть ее внутри веб-страницы и записать на нее что-то вроде office.js-что?

Dave Kreskowiak

Я понятия не имею. Тебе придется это попробовать.

Richard Deeming

Файл Excel находится на сервере. Данные, которые вы хотите добавить в файл Excel, находятся на сервере. Почему бы не манипулировать файлом на сервере?

Как сказал Дэйв, вы не можете манипулировать файлом с помощью Office Interop: read Рекомендации по автоматизации работы офиса на стороне сервера[^] для получения более подробной информации.

Но есть множество библиотек, которые вы можете использовать. мочь используйте на сервере, который даже не требует установки Excel на сервере. Например:

* EPPlus[^]
* ClosedXML[^]
* SDK OpenXML[^]

Все они поддерживают новое .xlsx файл форматирования. Если вам нужно поддержать старое .xls отформатируйте файлы, тогда вам нужно будет использовать NPOI[^].