В статье «Алгоритмы для перечисления всех совершенных, максимальных и максимальных совпадений в двудольных графах» от Takeaki Uno имеется алгоритм. http://citeseerx.ist.psu.edu/viewdoc/download?doi=10.1.1.107.8179&rep=rep1&type=pdf
В теореме 2 сказано: «Максимум сопоставления в двудольном графе могут быть перечислены в O (mn ^ 1/2 + nNm) времени и O (m) пространстве, где Nm - число максимальных совпадений в G. "
Я нашел замечательное решение на этой ссылке: http://www.antionline.com/showthread.php?t=277640
Это действительно работало на меня.
:). Я кратко записал свою перестрелку с Excel здесь. Это также имеет некоторые ссылки, которые я нашел после некоторого тяжелого поиска. Надежда это помогает.
Excel Basically является болью даже при том, что он может быть автоматизирован.
К сожалению это, и я не пытаюсь быть умным, но... не помещаю офис на сервер!!!
Это - то, если я понял правильно!:)
Править: Даже при том, что я был отмечен для этого, я никогда не буду защищать рабочий Office на сервере - это доказало слишком большую часть боли в заднице для меня в прошлом.
Однако то же теперь идет для меня и Crystal Reports ;-)
Я соглашаюсь с не рабочий Office на сервере. Не то, чтобы у меня есть любой выбор в вопросе :)
Одна вещь иметь в виду с taskkill опцией, то, что, если Вы конкретно не планируете ее (иначе - одиночный элемент), Вы можете иметь несколько копий Excel (или любое другое приложение Office) выполнение и неумышленно закрыть неправильный экземпляр.
Также отметьте это на http://support.microsoft.com/kb/257757
Microsoft в настоящее время не рекомендует и не поддерживает, Автоматизация приложений Microsoft Office ни от какого необслуживаемого, неинтерактивного клиентского приложения или компонента (включая ASP, ASP.NET, DCOM и NT Services), потому что Office может показать нестабильное поведение и/или зайти в тупик, когда Office выполняется в этой среде.
Как альтернатива, существует продукт по имени Ячейки Aspose, который предлагает продукт, который разработан для разрешения, Вы, чтобы программно работать с Excel покрываете в серверной среде. Как правовая оговорка, я лично никогда не использовал этот продукт, но я услышал об этом от нескольких человек, с которыми я работал в прошлом.
Команда, в которой Вы нуждаетесь, является "taskkill".
http://technet.microsoft.com/en-us/library/bb491009.aspx
> taskkill excel.exe
Вы используете VSTO? Можно закрыть приложение Excel после окончания с excelobject.Quit();
Это работало на меня, но я не использую Excel на серверной стороне больше.
Можно взглянуть на XML-схему Excel для создания файла Excel без самого Excel. Проверьте устройство записи CarlosAg Excel, которое делает точно то же.
У меня была подобная проблема. В то время как 'taskkill excel.exe' или перечисляющий все процессы "Excel" и уничтожающий их действительно работает, это уничтожает ВСЕ рабочие процессы Excel. Вы - более обеспеченное уничтожение только экземпляр, с которым Вы в настоящее время работаете.
Вот код, я раньше выполнял это. Это использует PInvoke (см. здесь) получить ProcessID от Excel. Экземпляр приложения (Я. ExcelInstance в примере ниже).
Dim ExcelPID As Integer
GetWindowThreadProcessId(New IntPtr(Me.ExcelInstance.Hwnd), ExcelPID)
If ExcelPID > 0 Then
Dim ExcelProc As Process = Process.GetProcessById(ExcelPID)
If ExcelProc IsNot Nothing Then ExcelProc.Kill()
End If
Не это не могло бы работать над всеми платформами из-за PInvoke... До настоящего времени это - единственный метод, который я нашел, чтобы быть надежным. Я также попытался найти корректный PID путем перечисления всех процессов Excel и сравнения Процесса. MainModule. BaseAddress к Excel. Приложение. Hinstance.
'DO NOT USE THIS METHOD, for demonstration only
For Each p as Process in ExcelProcesses
Dim BaseAddr As Integer = p.MainModule.BaseAddress.ToInt32()
If BaseAddr = Me.ExcelInstance.Hinstance Then
p.Kill()
Exit For
End If
Next
Это не надежный способ найти корректный процесс, поскольку BaseAddress иногда, кажется, то же для нескольких процессов (приводящий к уничтожению неправильного PID).
Я использовал spreadsheetgear для генерации XL отчетов о сервере, и он работает действительно хорошо. Мы не должны волноваться о процессе EXCEL..
Я имел подобную проблему и использовал следующий код:
System.Diagnostics.Process[] procs = System.Diagnostics.Process.GetProcesses();
for (int i = 0; i < procs.Length; i++)
{
if(procs[i].ProcessName == "EXCEL")
{
procs[i].Kill();
}
}
Это работало вполне прилично, но я буду действительно думать о работе с Office на сервере.
Вы должны безопасно расположить все взаимодействующие с COM объекты после окончания работы. "Всем" я имею в виду абсолютно все: значения свойств наборов и так далее. Я создал объект стека и продвинул объекты во время их установки:
Stack<object> comObjectsToRelease = new Stack<object>();
...
Log("Creating VBProject object.");
VBProject vbProject = workbook.VBProject;
comObjectsToRelease.Push(vbProject);
...
finally
{
if(excel != null)
{
Log("Quiting Excel.");
excel.Quit();
excel = null;
}
while (comObjectsToRelease.Count > 0)
{
Log("Releasing {0} COM object.", comObjectsToRelease.GetType().Name);
Marshal.FinalReleaseComObject(comObjectsToRelease.Pop());
}
Log("Invoking garbage collection.");
GC.Collect();
}
Если Excel все еще там, необходимо уничтожить его вручную.
У меня на самом деле был вопрос, который был подобен этому некоторое время назад - Проверке на подвешенный процесс Office при использовании Автоматизации делопроизводства - некоторые ответы на тот вопрос могли бы быть полезны для Вас.
Кроме того, я должен согласиться с тем, что все остальные говорят в отношении избегания любых Продуктов Office сервера; однако, так как Вы делаете Excel, это могло бы быть выполнимо, чтобы Вы генерировали XML-документы Excel. Можно сделать это, не имея необходимость делать, любая Автоматизация делопроизводства и процесс довольно просты. Для простых основанных на сетке электронных таблиц я нашел, что это немного легче, чем попытка автоматизировать его использование Excel. Office Открывает, XML довольно мощен и допускает более сложные отчеты, возможны также еще некоторое усилие.
Я также не рекомендовал бы использовать офисные приложения на сервере за исключением доступа к данным в mdb файлы.
Я могу определенно понять, что существуют времена, где это необходимо. В thoses случаях я рекомендовал бы следующее:
Если абсолютно необходимо сделать это на том же сервере, то, по крайней мере, реализуют вышеупомянутое в своем собственном пуле приложений.
Ограничение себя сохраняющий очередь работы и только один экземпляр Excel (или любое другое офисное приложение) позволяет нам, Вы уничтожаете его с отказом с TaskKill или.Kill () и не теряете работу.
Я верю, сохраняете ли Вы его к единственному потоку затем, у Вас редко была бы потребность уничтожить его.
У меня было больше времени подумать над этим ответом, и теперь я бы порекомендовал использовать подход XML с форматом электронной таблицы Open XML Office.
Вот несколько хороших ссылок, чтобы приступить к созданию служебный документ с кодом. http://msdn.microsoft.com/en-us/magazine/cc163478.aspx http://msdn.microsoft.com/en-us/library/bb735940 (office.12) .aspx
Просто используйте SSIS на SQL Server. Предоставляет возможность экспорта в Excel. Не запускайте офис на сервере. В качестве альтернативы тратьте деньги на aspose или электронные таблицы.
GC действительно работает, если вы не используете его должным образом, следуя этому шаблону ...
private void killExcel()
{
xlApp.Quit();
Marshal.ReleaseCOMObject(xlApp);
if(xlApp != null)
{
xlApp = null;
}
GC.WaitForPendingFinalizers();
GC.Collect();
GC.WaitForPendingFinalizers();
GC.Collect();
}
заставьте свой рабочий класс Excel реализовать IDisposable, а затем вставьте killExcel () в метод Dispose.
ОБНОВЛЕНИЕ. Также обратите внимание, что иногда разработчик все еще видит, что Excel.exe запущен в диспетчере задач. Прежде чем предположить, что приведенный выше код не работает, убедитесь, что процесс, в котором выполняется код, также закрыт. В случае надстройки VSTO или COM убедитесь, что экземпляр Word / powerpoint / другой excel также закрыт, поскольку все еще есть корень GC, возвращающийся к процессу запуска. Как только это будет закрыто, процесс Excel.exe закроется.