Как вы используете сервер Excel?

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

(Они НЕ хотят показывать пользователю интерфейс, похожий на электронную таблицу. Это не вопрос пользовательского интерфейса.)

У них есть огромная электронная таблица с большим количеством вычислений на многих, многих листах. Но, в конце концов, важны только две вещи: (1) вы помещаете числа в пару ячеек на одном листе и (2) вы получаете соответствующие числа из пары ячеек на другом листе. Все остальное - черный ящик.

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

Это возможно/желательно? Есть ли коммерческий компонент, который делает это проще? Их подводные камни я не рассматриваю?

(Я знаю, что могу использовать Office Automation для этого, но я знаю, что не рекомендуется делать это на стороне сервера, поскольку он пытается работать в контексте пользователя и т.д.)

Многие люди говорят, что мне нужно воссоздать формулы в коде. Однако это будет ошеломительно сложным.

Ответ 1

Вы определенно не хотите использовать interop на стороне сервера, это достаточно плохо, используя его как kludge на стороне клиента.

Я вижу два варианта:

Выясните логику электронной таблицы. Это может принести вам пользу в долгосрочной перспективе, сделав бизнес-логику известным количеством, и в ближайшей перспективе вы обнаружите, что на самом деле есть ошибки в электронной таблице (я столкнулся с тоннами таблиц монстров, которые использовались годами, которые, как оказалось, ошибки в них - все просто полагали, что ответы должны быть правильными)

Оцените SpreadSheetGear.NET, который в основном заменяет interop, который делает все без Excel (он реплицирует огромный кусок Excel, визуальная логика и IO в .NET)

Ответ 2

Возможно, но не рекомендуется (и официально не поддерживается).

Вы можете взаимодействовать с Excel через COM или .NET Primary Interop Assemblies, но это должно быть процессом на стороне клиента.

На стороне сервера нет отображения или рабочего стола, и любые неожиданные диалоговые окна (например) заставят ваш веб-приложение зависать и ndash; ваше приложение будет вести себя flaky.

Кроме того, привязка процесса Excel к каждому запросу - это не совсем подход с низким уровнем ресурсов.

Разработка черного ящика и повторная реализация его на правильном языке программирования, безусловно, лучше (как в случае "более надежного и быстрого" ).

Связанное чтение: KB257757: соображения для автоматизации на стороне сервера

Ответ 3

Хотя это, безусловно, возможно с использованием ASP.NET, это очень нецелесообразно. Он не масштабируется и подвержен ошибкам concurrency.

Лучше всего анализировать вычисления электронных таблиц и дублировать их. Теперь, предоставленный, вашему бизнесу не понравится время, необходимое для этого, но оно (предположительно) даст им более удобную систему.

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

Изменить: Если ваши заинтересованные стороны действительно настаивают на использовании серверной части Excel, я предлагаю вам внимательно изучить Excel Services как @John Saunders предлагает. Возможно, вы не получите все, что захотите, но вы получите совсем немного и должны решить некоторые из проблем, которые вы в конечном итоге попытаетесь сделать на сервере с ASP.NET.

Это не значит, что это панацея; ваш пробег, безусловно, будет меняться. И Sharepoint не совсем дешево покупать или обслуживать. Фактически, краткосрочные затраты могут быть легко затмеваны долгосрочными издержками, если вы поедете по пути Sharepoint, но это может наилучшим образом соответствовать требованию.

Я все же предлагаю вам отступить в пользу кодирования всей вашей логики в отдельном модуле .NET. Таким образом, вы можете использовать его как на стороне сервера, так и на стороне клиента. Excel легко переносит вычисления на COM-объект, и вы можете легко опубликовать свою библиотеку .NET как COM-объекты. В конце концов, у вас будет гораздо более удобная и удобная архитектура.

Ответ 4

Пренебрегая обсуждением, имеет ли смысл манипулировать листом excel на стороне сервера, один из способов его выполнения, вероятно, будет выглядеть как принятие

Microsoft.Office.Interop.Excel.dll

Используя эту библиотеку, вы можете сказать Excel, чтобы открыть таблицу, изменить и прочитать содержимое из .NET. Я использовал библиотеку в приложении WinForm, и я предполагаю, что он также может использоваться из ASP.NET.

Тем не менее рассмотрим уже упомянутые проблемы concurrency... Однако, если доступ к листу осуществляется нерегулярно, почему бы и нет...

Ответ 5

Самый простой способ сделать это можно:

Загрузите книгу Excel в Документы Google - это очень чисто, по моему опыту

Используйте API данных электронных таблиц Google для обновления данных и возврата чисел.

Вот ссылка, чтобы вы начали с этого, если хотите идти в этом направлении:

http://code.google.com/apis/spreadsheets/overview.html

Ответ 6

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

Это одна из причин, по которой существуют службы Excel. Быстрый поиск по MSDN показал эту ссылку: http://blogs.msdn.com/excel/archive/category/11361.aspx. Что список категорий, поэтому содержит список сообщений в блогах по этому вопросу. См. Также Пространство имен Microsoft.Office.Excel.Server.WebServices.

Ответ 7

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

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

Что вы можете сделать, так это создать веб-службу для выполнения вычислений и добавить код vba или vsto в лист Excel, чтобы поговорить с этой службой.