Проблема с Excel, специфическая

  • Автор темы Автор темы savl
  • Дата начала Дата начала

savl

Lotus Team
28.10.2011
2 636
315
Есть сервер, теперь на нем есть Excel 2003, на сервере есть агент, который делает Excel файлик.
Суть проблемы:
Запускаем агент получаем ошибку: "Cannot create automation object"
Перезагрузили сервак, запускаем все работает, файлик приехал по почте.
Допилили агент, запускаем и получаем: "Cannot create automation object" Оо
Перезапустили сервак, запускаем все работает, файлик приехал по почте.
Ничего с агентом не делали, запускаем и получаем: "Cannot create automation object" >_<

Третий раз ребутить не стали, нечали разбираться.
1. Процесса Excel не висит в системе, ок.
2. Файлы и сам Excel создаются и запускаются, ок.
3. Логи винды по данной тематике пустые.

Лотусовый лок показал на строкус кодом:
Код:
Set object = CreateObject("Excel.Application")
Будто OLE-класс не найден... Но такое только после успешной отработки агентом 1 раз, причем только после ребута.

На серваке Win2Kx64, Excel 2003 x32.
Если кто сталкивался или если кто знает особенности x64 и 32-битного Excel, подскажите пож-та, что это происходит вообще???
 
Бала такая же фигня, причем на клиенте тоже (в рамках одной сессии).
Как обычно тупять и глючат СОМ объекты не полностью подчищая за собой.

Код:
Sub CloseMSobj(execName As String)
On Error Goto ErrH
Dim objs As Variant
Dim strSQL As String
Dim strWMI As String
strWMI = "winmgmts:"
strSQL = "Select * From Win32_Process "
strSQL = strSQL & {where Name = '} & execName &{'}
Set objs = GetObject(strWMI).ExecQuery(strSQL)
If Not objs Is Nothing Then
Forall obj In objs
obj.Terminate
End Forall
End If
Quit:
Exit Sub
ErrH:
Resume Quit
End Sub
Код где то на этом форуме был. Убивает висящие процессы.

С ним работало нормально, пока на сервер не кинули битый excel файл, который повесил агент менеджер, после чего на сервер стал передавать txt предварительно сконвертированный на машине пользователи из excel.
 
может формировать excel файл с помощью xml? без оле
Код:
Set ResStream=ns.CreateStream()
'заполяем шапку xml
ResStream.WriteText(_
{<?xml version="1.0"?>}+el+_ 
{<?mso-application progid="Excel.Sheet"?>}+el+_
{<Workbook xmlns="urn:schemas-microsoft-com:office:spreadsheet"}+el+_	
{xmlns:o="urn:schemas-microsoft-com:office:office"}+el+_ 
{xmlns:x="urn:schemas-microsoft-com:office:excel"}+el+_ 
{xmlns:ss="urn:schemas-microsoft-com:office:spreadsheet"}+el+_ 
{xmlns:html="http://www.w3.org/TR/REC-html40">}+el+_ 
{<Styles>}+el+_ 
{<Style ss:ID="Default" ss:Name="Normal">}+el+_ 
{<Alignment/>}+el+_ 
{<Borders/>}+el+_ 
{<Font x:CharSet="204"/>}+el+_ 
{<Interior/>}+el+_ 
{<NumberFormat/>}+el+_ 
{<Protection/>}+el+_ 
{</Style>}+el+_ 
.......
 
kizarek
Процесса в системе нет, это проверяли, да и на клиенте постоянно можно создать не один экземпляр Excel, это тоже проверено. И убиваю процессы немного иначе:
yerke
Вот с XML не хочется возиться, ни времени ни желания особенного... Да и версии могут различаться.
.xls и .xlsx весьма различны...

Раньше эти отчеты делали только на клиенте, теперь один отчет они хотят получать раз в месяц.
Но вот такая вот засада...
 
Поиск по форуму dcomcnfg. Неправильная настройка DCOM для EXCEL - плавали - знаем.
link removed

И боян вообще :(
 
Ну боян не боян)) не сталкивался просто)
Что-то похожее на правду, но когда выставили "Текущий пользователь", то после ребута теперь тоже не работает, совсем не работает.
Старт лотусового сервака происходит из под local System. Может есть еще советы?
 
nvy
Думал, но не в этом году это будет.
 
на сервере такая связка вообще валить сервер могет в легкую..
в свое время я не искал решений создания в екселе отчетов на стороне сревера, т.к. сервак падал откровенно..
отчеты были простые, то я посмотрел на то, как они выглядят в хмл (если в екселе сохранить отчет в формате xml, то не трудно понять как оно устроено) и создавал их в хмл формате с расширением xls, работало на ура :)
 
Что-то похожее на правду, но когда выставили "Текущий пользователь", то после ребута теперь тоже не работает, совсем не работает.
А попробуйте учетку админа указать явно. Так наверняка должно. "Текущий пользователь" не всегда помогает. Верно.

Или создать спец юзера с админскими правами и им запускать. Тогда автором создаваемого EXCEL файла будет этот пользователь.
 
Вот с XML не хочется возиться, ни времени ни желания особенного... Да и версии могут различаться.
.xls и .xlsx весьма различны...
Версии здесь не при чем. Пишите в xml (http://en.wikipedia.org/wiki/Microsoft_Office_XML_formats), один раз разберетесь, потом забудете про тормоза и проблемы OLE MS Office.
 
NetWood, не помогло... Какая-то фигня...

oshmianski2
И как потом xls сделать? если просто переименовать, то сорри, будет ругаться при открытии, что тоже не надо.

Kee_Keekkenen
На другом сервере все крутиться и проблем нет, тут дело в чем-то другом. Сам все пути и имена файлов прописаны жестко.
А у меня тут скрипт полуавтомат, сам выбирает что и как делать... Может и в этом проблема.
 
И как потом xls сделать? если просто переименовать, то сорри, будет ругаться при открытии, что тоже не надо.
Можно делать двумя способами:
1) выгружать данные в ЧИСТЫЙ xml, создавать xsl-файл и через xslt получать xml MS Excel'я.
2) сразу писать xml с разметкой MS Office Open xml. Тут xml сразу можно открыть MS Excel'ем, никакой xsl не нужен.
 
NetWood
Удаленный, ставили через подключение по teamviewer.
Насчет кривизны ставки не скажу, поставили только 2 компанента word и excel.

Сейчас одну вещь проверим, после этого возможно все пройдет
 
когда-то делал так...
xml:<!--shcode--><pre><code class='xml'><priceitem>
<art>LBC-1</art>
<grp> Материалы для оформления СТО </grp>
<prodname>Лайтбокс формованный</prodname>
<price>4063</price>
<quantity>343</quantity>
</priceitem>
<priceitem>
<art>DS-2</art>
<grp> Материалы для оформления СТО </grp>
<prodname>стойка</prodname>
<price>6000</price>
<quantity>30</quantity>
</priceitem>[/CODE]
шаблон для хухеля:<!--shcode--><pre><code class='xml'><?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet
xmlns="urn:schemas-microsoft-com:office:spreadsheet"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:msxsl="urn:schemas-microsoft-com:xslt"

xmlns:o="urn:schemas-microsoft-com:office:office"
xmlns:x="urn:schemas-microsoft-com:office:excel"
xmlns:ss="urn:schemas-microsoft-com:office:spreadsheet"
xmlns:html="http://www.w3.org/TR/REC-html40"
version="1.0">
<xsl:strip-space elements="*"/>
<xsl:output indent="yes"/>
<xsl:template match="/">
<xsl:processing-instruction name="mso-application">progid="Excel.Sheet"</xsl:processing-instruction>
<Workbook
xmlns="urn:schemas-microsoft-com:office:spreadsheet"
xmlns:o="urn:schemas-microsoft-com:office:office"
xmlns:x="urn:schemas-microsoft-com:office:excel"
xmlns:ss="urn:schemas-microsoft-com:office:spreadsheet"
xmlns:html="http://www.w3.org/TR/REC-html40">
<DocumentProperties xmlns="urn:schemas-microsoft-com:office:office">
<Title>test</Title>
</DocumentProperties>
<Worksheet ss:Name="Test">
<Table x:FullColumns="1" x:FullRows="1" ss:DefaultColumnWidth="51.326732673267323"
ss:DefaultRowHeight="12.831683168316831">
<xsl:apply-templates
select="descendant::document/@* | descendant::document/node()"/>
</Table>
</Worksheet>
<WorksheetOptions xmlns="urn:schemas-microsoft-com:office:excel">
<FitToPage/>
<Print>
<FitHeight>1</FitHeight>
<ValidPrinterInfo/>
<PaperSizeIndex>9</PaperSizeIndex>
<Scale>100</Scale>
<HorizontalResolution>600</HorizontalResolution>
<VerticalResolution>600</VerticalResolution>
</Print>
<Selected/>
<ProtectObjects>False</ProtectObjects>
<ProtectScenarios>False</ProtectScenarios>
</WorksheetOptions>
</Workbook>
</xsl:template>
<xsl:template match="priceitem">
<xsl:element name="Row">
<xsl:for-each select="descendant::text()">
<xsl:element name="Cell">
<Data ss:Type="String">
<xsl:apply-templates select="."/>
</Data>
</xsl:element>
</xsl:for-each>
</xsl:element>
</xsl:template>
</xsl:stylesheet>[/CODE]
 
Да вот разобрались, классика жанра: "Горе от ума".
Агент должен был работать на сервере, поэтому перед тем как его выставить Enable я его проверял.
Запускал по кнопке, через RunOnServer. Таким образом работает только один раз.
Админ, запустил через консоль, все отработало. Попробовали через консоль еще раз: ошибка доступа к файлу.
Тут понятно, процесс не закрыл, но сам факт 2 раза подряд Excel создался.
Сделали агент на запуск каждые 30 минут, все работает как часы.
Стыд и позор моим познаниям :(

Всем спасибо за помощь и желание помочь, данный механизм я переведу на java, но чуть позже.
 
В копилку знаний. Намедни, ни с того ни с сего, перестал работать Excel DCOM на одном сервере с ошибкой Cannot create automation object. В логах вижу невозможность подключения к серверу Domino. Стал разбираться. Оказалось, что поменяли имя хоста на Сервере, а в настройках Domino нет. Итого, для правильной работы с DCOM, кроме настроек dcomcnfg, должны совпадать:
1. имя хоста в настройках WIN
2. в закладках Сервер/Основные/Полностью определенное имя узла Интернета
3. и Сервер/Порты/Сетевые порты/TCPIP сетевой адрес.
Такие дела.
 
Уже сколько писали про то, что MS Office и сервер - вещи не совместимые, но продолжаем есть кактус... :-)

Вопрос я так понимаю уже решен, но несколько заметок на будущее:

1. ВСЕГДА, до вызова CreateObject пробуйте получить объект с помощью GetObject.
2. Можно легко принтами LS создать XML файл Excel. Немного разобраться, там только "шапка" файла, всё остальное вообще примитивно. Можно использовать заготовку сделанную с помощью самого Excel.
3. Excel на ура открывает обычные HTML фалы, даже если вы их переименуете в XLS.
4. Apache POI и куча других библиотек построенных на аналогичной технологии или поверх того же POI.
 
Да вот разобрались, классика жанра: "Горе от ума".
Агент должен был работать на сервере, поэтому перед тем как его выставить Enable я его проверял.
Запускал по кнопке, через RunOnServer. Таким образом работает только один раз.
Админ, запустил через консоль, все отработало. Попробовали через консоль еще раз: ошибка доступа к файлу.
Тут понятно, процесс не закрыл, но сам факт 2 раза подряд Excel создался.
Сделали агент на запуск каждые 30 минут, все работает как часы.
Стыд и позор моим познаниям :)

Всем спасибо за помощь и желание помочь, данный механизм я переведу на java, но чуть позже.

Приветствую, Savl! Вы уже перенесли его на Java? Дело в том, что у меня этот вопрос висит долго. Очень долго мучаюсь с Set Client = CreateObject("MSSOAP.SoapClient30")
Вычитал весь инет. Никак не получается. Нужен ХЭЛП
 
Мы в соцсетях:

Обучение наступательной кибербезопасности в игровой форме. Начать игру!