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

savl

Lotus Team
28.10.2011
2 624
314
BIT
539
Есть сервер, теперь на нем есть 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, подскажите пож-та, что это происходит вообще???
 

Kizarek86

Green Team
20.07.2007
875
8
BIT
117
Бала такая же фигня, причем на клиенте тоже (в рамках одной сессии).
Как обычно тупять и глючат СОМ объекты не полностью подчищая за собой.

Код:
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.
 
Y

yerke

может формировать 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+_ 
.......
 

savl

Lotus Team
28.10.2011
2 624
314
BIT
539
kizarek
Процесса в системе нет, это проверяли, да и на клиенте постоянно можно создать не один экземпляр Excel, это тоже проверено. И убиваю процессы немного иначе:
yerke
Вот с XML не хочется возиться, ни времени ни желания особенного... Да и версии могут различаться.
.xls и .xlsx весьма различны...

Раньше эти отчеты делали только на клиенте, теперь один отчет они хотят получать раз в месяц.
Но вот такая вот засада...
 

NetWood

Lotus Team
17.04.2008
565
96
BIT
174
Поиск по форуму dcomcnfg. Неправильная настройка DCOM для EXCEL - плавали - знаем.
link removed

И боян вообще :(
 

savl

Lotus Team
28.10.2011
2 624
314
BIT
539
Ну боян не боян)) не сталкивался просто)
Что-то похожее на правду, но когда выставили "Текущий пользователь", то после ребута теперь тоже не работает, совсем не работает.
Старт лотусового сервака происходит из под local System. Может есть еще советы?
 
K

Kee_Keekkenen

на сервере такая связка вообще валить сервер могет в легкую..
в свое время я не искал решений создания в екселе отчетов на стороне сревера, т.к. сервак падал откровенно..
отчеты были простые, то я посмотрел на то, как они выглядят в хмл (если в екселе сохранить отчет в формате xml, то не трудно понять как оно устроено) и создавал их в хмл формате с расширением xls, работало на ура :)
 

NetWood

Lotus Team
17.04.2008
565
96
BIT
174
Что-то похожее на правду, но когда выставили "Текущий пользователь", то после ребута теперь тоже не работает, совсем не работает.
А попробуйте учетку админа указать явно. Так наверняка должно. "Текущий пользователь" не всегда помогает. Верно.

Или создать спец юзера с админскими правами и им запускать. Тогда автором создаваемого EXCEL файла будет этот пользователь.
 

oshmianski

Достойный программист
Lotus Team
25.04.2012
711
59
BIT
8
Вот с XML не хочется возиться, ни времени ни желания особенного... Да и версии могут различаться.
.xls и .xlsx весьма различны...
Версии здесь не при чем. Пишите в xml (http://en.wikipedia.org/wiki/Microsoft_Office_XML_formats), один раз разберетесь, потом забудете про тормоза и проблемы OLE MS Office.
 

savl

Lotus Team
28.10.2011
2 624
314
BIT
539
NetWood, не помогло... Какая-то фигня...

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

Kee_Keekkenen
На другом сервере все крутиться и проблем нет, тут дело в чем-то другом. Сам все пути и имена файлов прописаны жестко.
А у меня тут скрипт полуавтомат, сам выбирает что и как делать... Может и в этом проблема.
 

oshmianski

Достойный программист
Lotus Team
25.04.2012
711
59
BIT
8
И как потом xls сделать? если просто переименовать, то сорри, будет ругаться при открытии, что тоже не надо.
Можно делать двумя способами:
1) выгружать данные в ЧИСТЫЙ xml, создавать xsl-файл и через xslt получать xml MS Excel'я.
2) сразу писать xml с разметкой MS Office Open xml. Тут xml сразу можно открыть MS Excel'ем, никакой xsl не нужен.
 

savl

Lotus Team
28.10.2011
2 624
314
BIT
539
NetWood
Удаленный, ставили через подключение по teamviewer.
Насчет кривизны ставки не скажу, поставили только 2 компанента word и excel.

Сейчас одну вещь проверим, после этого возможно все пройдет
 

lmike

нет, пердело совершенство
Lotus Team
27.08.2008
7 985
611
BIT
470
когда-то делал так...
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:eek:ffice:spreadsheet"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:msxsl="urn:schemas-microsoft-com:xslt"

xmlns:eek:="urn:schemas-microsoft-com:eek:ffice:eek:ffice"
xmlns:x="urn:schemas-microsoft-com:eek:ffice:excel"
xmlns:ss="urn:schemas-microsoft-com:eek:ffice:spreadsheet"
xmlns:html="http://www.w3.org/TR/REC-html40"
version="1.0">
<xsl:strip-space elements="*"/>
<xsl:eek:utput indent="yes"/>
<xsl:template match="/">
<xsl:processing-instruction name="mso-application">progid="Excel.Sheet"</xsl:processing-instruction>
<Workbook
xmlns="urn:schemas-microsoft-com:eek:ffice:spreadsheet"
xmlns:eek:="urn:schemas-microsoft-com:eek:ffice:eek:ffice"
xmlns:x="urn:schemas-microsoft-com:eek:ffice:excel"
xmlns:ss="urn:schemas-microsoft-com:eek:ffice:spreadsheet"
xmlns:html="http://www.w3.org/TR/REC-html40">
<DocumentProperties xmlns="urn:schemas-microsoft-com:eek:ffice:eek:ffice">
<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:eek:ffice: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]
 

savl

Lotus Team
28.10.2011
2 624
314
BIT
539
Да вот разобрались, классика жанра: "Горе от ума".
Агент должен был работать на сервере, поэтому перед тем как его выставить Enable я его проверял.
Запускал по кнопке, через RunOnServer. Таким образом работает только один раз.
Админ, запустил через консоль, все отработало. Попробовали через консоль еще раз: ошибка доступа к файлу.
Тут понятно, процесс не закрыл, но сам факт 2 раза подряд Excel создался.
Сделали агент на запуск каждые 30 минут, все работает как часы.
Стыд и позор моим познаниям :(

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

NetWood

Lotus Team
17.04.2008
565
96
BIT
174
В копилку знаний. Намедни, ни с того ни с сего, перестал работать Excel DCOM на одном сервере с ошибкой Cannot create automation object. В логах вижу невозможность подключения к серверу Domino. Стал разбираться. Оказалось, что поменяли имя хоста на Сервере, а в настройках Domino нет. Итого, для правильной работы с DCOM, кроме настроек dcomcnfg, должны совпадать:
1. имя хоста в настройках WIN
2. в закладках Сервер/Основные/Полностью определенное имя узла Интернета
3. и Сервер/Порты/Сетевые порты/TCPIP сетевой адрес.
Такие дела.
 

garrick

Lotus Team
26.10.2009
1 367
152
BIT
363
Уже сколько писали про то, что MS Office и сервер - вещи не совместимые, но продолжаем есть кактус... :)

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

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

imendan

Green Team
22.09.2010
159
4
BIT
0
Да вот разобрались, классика жанра: "Горе от ума".
Агент должен был работать на сервере, поэтому перед тем как его выставить Enable я его проверял.
Запускал по кнопке, через RunOnServer. Таким образом работает только один раз.
Админ, запустил через консоль, все отработало. Попробовали через консоль еще раз: ошибка доступа к файлу.
Тут понятно, процесс не закрыл, но сам факт 2 раза подряд Excel создался.
Сделали агент на запуск каждые 30 минут, все работает как часы.
Стыд и позор моим познаниям :)

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

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

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