8.х Работа с Excel

Тема в разделе "Конфигурирование на платформе "1С:Предприятие 8"", создана пользователем Tanusha, 29 апр 2008.

  1. TopicStarter Overlay
    Tanusha
    Offline

    Tanusha

    Регистрация:
    29 апр 2008
    Сообщения:
    31
    Симпатии:
    0
    Баллы:
    1
    Мне надо сделать обмен между Excel-ким файлом и 1С. Открыть Excel-кий файл в 1С и прочитать его у меня получилось.
    НашExcel = Новый COMОбъект("Excel.Application");
    НашExcel.WorkBooks.Open(ИмяФайла);
    и дальше читаю его без проблем и загружаю данные в 1С.
    Но вот при загрузке чего-либо из 1С в Excel возникают проблемы с его сохранением. Оператор
    НашExcel.Workbooks.Save()
    не работает: Метод объекта не обнаружен (Save)

    Подскажите, плиз, как сохранить Excel-кий файл.
  2. Эмин
    Offline

    Эмин Руководитель проектов

    Регистрация:
    25 май 2007
    Сообщения:
    1.178
    Симпатии:
    1
    Баллы:
    26
    Угу, не работает, метода Save у COM объекта Excel значит нет.
    Вам по идее надо почитать именно про Excel COM описание.

    А так - он автоматически сохраняется на выходе кажется.
    Сейчас скажу совсем точно, была обработка:

    Код:
    // Получаем COM Объект.
    // Вписываю, чтобы было понятно откуда какие переменные
    Попытка
    Excel = Новый COMОбъект("Excel.Application");
    Исключение
    Сообщить(ОписаниеОшибки());
    Возврат;
    КонецПопытки;
    
    Попытка
    Книга = Excel.WorkBooks.Open(ИмяФайла);
    Исключение
    Сообщить(ОписаниеОшибки());
    Возврат;
    КонецПопытки;
    
    // Лист получаем, если нужно
    Лист = Книга.Sheets(СокрЛП(НазваниеЛиста));
    
    // Тут по всякому записываете в ячейки экселя информацию, как вам надо
    // Лист.Cells(Строка, Колонка).Value = Значение;
    
    // Просто выходим, сохраняется автоматически
    Excel.Application.Quit();
    
    
    
    Код не лучший, но сам пример работы важен.
    Используйте попытки, так вы будете застрахованы от лишних ошибок.
    Не называйте переменные смесью Русского и Английского, это моветон.
  3. TopicStarter Overlay
    Tanusha
    Offline

    Tanusha

    Регистрация:
    29 апр 2008
    Сообщения:
    31
    Симпатии:
    0
    Баллы:
    1
    Excel закрывается, но без сохранения изменений
  4. ANDRE
    Offline

    ANDRE Опытный в 1С

    Регистрация:
    12 мар 2008
    Сообщения:
    456
    Симпатии:
    0
    Баллы:
    26
    Попробуйте с помощью этого:

    Closes the object.

    expression.Close(SaveChanges, Filename, RouteWorkbook)
    expression Required. An expression that returns one of the above objects.

    SaveChanges Optional Variant. If there are no changes to the workbook, this argument is ignored. If there are changes to the workbook and the workbook appears in other open windows, this argument is ignored. If there are changes to the workbook but the workbook doesn't appear in any other open windows, this argument specifies whether changes should be saved, as shown in the following table.

    Value Action
    True Saves the changes to the workbook. If there is not yet a file name associated with the workbook, then FileName is used. If FileName is omitted, the user is asked to supply a file name.
    False Does not save the changes to this file.
    Omitted Displays a dialog box asking the user whether or not to save changes.


    FileName Optional Variant. Save changes under this file name.

    RouteWorkbook Optional Variant. If the workbook doesn't need to be routed to the next recipient (if it has no routing slip or has already been routed), this argument is ignored. Otherwise, Microsoft Excel routes the workbook as shown in the following table.

    Value Meaning
    True Sends the workbook to the next recipient.
    False Doesn't send the workbook.
    Omitted Displays a dialog box asking the user whether the workbook should be sent.

    Проще говоря:
    Excel.WorkBooks.Close(Истина);
  5. TopicStarter Overlay
    Tanusha
    Offline

    Tanusha

    Регистрация:
    29 апр 2008
    Сообщения:
    31
    Симпатии:
    0
    Баллы:
    1
    К сожалению команда
    Excel.WorkBooks.Close(Истина);
    выдает ошибку:
    Ошибка при вызове метода контекста (Close): Неверное число параметров

    А попытки при открытии Excel я использовала, просто здесь показала сокращенный код.
    Не называть переменные смесью Русского и Английского - учту.
  6. ANDRE
    Offline

    ANDRE Опытный в 1С

    Регистрация:
    12 мар 2008
    Сообщения:
    456
    Симпатии:
    0
    Баллы:
    26
    Попробуйте так
    Книга.Close(Истина);
    По крайней мере у меня все работает
  7. Эмин
    Offline

    Эмин Руководитель проектов

    Регистрация:
    25 май 2007
    Сообщения:
    1.178
    Симпатии:
    1
    Баллы:
    26
    Это просто потом удобнее будет, чем разбираться где латинская, а где русская буква :) Ну и в целом считается плохим стилем.
  8. TopicStarter Overlay
    Tanusha
    Offline

    Tanusha

    Регистрация:
    29 апр 2008
    Сообщения:
    31
    Симпатии:
    0
    Баллы:
    1
    Что-то у меня разные вариации метода Close() все-равно не работаю. Да и Save() тоже.
    Бывает же такое, что на чем-нибудь застопоришься, а причина в ерунде...
  9. Рассада
    Offline

    Рассада

    Регистрация:
    28 фев 2008
    Сообщения:
    25
    Симпатии:
    0
    Баллы:
    1
    Excel.ActiveWorkbook.Close(Истина, ПутьКФайлу);

    Workbook.Close Method
    Close(SaveChanges, Filename, RouteWorkbook)
  10. Эмин
    Offline

    Эмин Руководитель проектов

    Регистрация:
    25 май 2007
    Сообщения:
    1.178
    Симпатии:
    1
    Баллы:
    26
    А что конкретно Close пишет, выдает ошибку без конкретного описания?

    Попробуйте офис другой установить (на 2003 все точно работает, хотя и на 2008 у меня отлично все шло).
  11. BabySG
    Offline

    BabySG Администраторы Команда форума Администратор

    Регистрация:
    10 июн 2007
    Сообщения:
    11.853
    Симпатии:
    12
    Баллы:
    29
    Метод SaveAs() надо использовать.
  12. TopicStarter Overlay
    Tanusha
    Offline

    Tanusha

    Регистрация:
    29 апр 2008
    Сообщения:
    31
    Симпатии:
    0
    Баллы:
    1
    Ура!!! Заработало в варианте:
    Excel_арр = Новый COMОбъект("Excel.Application");
    Excel = Excel_арр.WorkBooks.Open(печФайл);
    . .
    Excel.Save();
    Excel.Close();
    Excel_арр.Application.Quit();
    после перезагрузки компа. Видимо слишком много COM-приложений висело в оперативке из-за прерывания по ошибке, до строки закрытия ведь программа не доходила...
    Всем спасибо.
  13. Melanto
    Offline

    Melanto Опытный в 1С

    Регистрация:
    28 ноя 2007
    Сообщения:
    204
    Симпатии:
    0
    Баллы:
    26
    Доброго всем дня!

    А вот к слову хотелось спросить:

    Код:
        Excel = Новый COMОбъект("Excel.Application");
    
    
    
    создает новый COM объект. Хорошо. Но вот в чем загвоздка.

    Если файл Excel, к-й я собираюсь изменить открыт был (ну, напр, из Explorer-a) и его не закрыли.
    Тогда - создается COM объект, в к-м этот файл НЕ открыт,так?
    Соответственно, при попытки сделать SaveAs получаем вот это:

    {Форма.Форма(261)}: Ошибка при вызове метода контекста (SaveAs): Произошла исключительная ситуация (Microsoft Office Excel): Ошибка доступа к документу '1.xls', допускающему доступ только для чтения.
    РабочаяКнига.SaveAs(ПолеИмениФайла);
    по причине:
    Произошла исключительная ситуация (Microsoft Office Excel): Ошибка доступа к документу '1.xls', допускающему доступ только для чтения.

    Как можно избежать этого?

    P.S. Ну и ессно, процесс Excel остается незавершенным...
    Просто добавить Попытку у SaveAs? И попросить закрыть Excel?

    Поробовала, добавила - работает, но не красиво...
  14. dimabolt
    Offline

    dimabolt

    Регистрация:
    5 июн 2008
    Сообщения:
    3
    Симпатии:
    0
    Баллы:
    1
    Подскажите. Есть сохраненный файл Excel (нарисованный рисунок в эксель), можно ли его вывести в табличный документ? :unsure:
  15. LxS
    Offline

    LxS Разработчик

    Регистрация:
    5 апр 2007
    Сообщения:
    680
    Симпатии:
    0
    Баллы:
    26
    Мне этот faq очень помог.

    Excel FAQ
  16. IlyaM
    Offline

    IlyaM

    Регистрация:
    15 дек 2008
    Сообщения:
    15
    Симпатии:
    0
    Баллы:
    1
    Мне надо сделать обмен между Excel-ким файлом и 1С. Открыть Excel-кий файл в 1С и прочитать его у меня получилось.
    НашExcel = Новый COMОбъект("Excel.Application");
    НашExcel.WorkBooks.Open(ИмяФайла);
    и дальше читаю его без проблем и загружаю данные в 1С.
    Но вот при загрузке чего-либо из 1С в Excel возникают проблемы с его сохранением. Оператор
    НашExcel.Workbooks.Save()
    не работает: Метод объекта не обнаружен (Save)

    Подскажите, плиз, как сохранить Excel-кий файл.



    Блин... Может уже поздновато отвечаю и проблема решена. И времени не было подробно читать всю переписку....

    Во-первых!
    Тут есть первый вариант решения.
    1Ска сама может сохранять табличный документ в формате Экселя(правда 97ого, но он будет читаться и в новых Экселях).
    И это самый быстрый вариант сохранить данные в формате Эксель вообще не вызывая никаких комобъектов...
    Но вот если уж так сильно необходимо именно создать комобъект и писать именно в сам файл эксель, то.....
    Но вот при загрузке чего-либо из 1С в Excel возникают проблемы с его сохранением. Оператор
    НашExcel.Workbooks.Save()
    не работает: Метод объекта не обнаружен (Save)
    В твоем коде ты пытаешься сохранить не книгу, а всю коллекцию книг, а для неё, конечно, метод недоступен. Нужно обратиться к конкретной книге из этой коллекции...
    Далее...
    Для нового файла эксель при использовании метода Save будет недостаточно параметров(насколько помню) и тогда нужно будет использовать SaveAs...
    Жаль щас не смогу, наверно примеров найти....
    Но одно время приходилось писать эти файлы Эксель.. И тогда я прилично поковырялся....
    Но в итоге я пришел к выводу, что то, что я писал в Эксель проще было сделать создав Табличный документ в 1Ске и записав его в формате Эксель без создания всяких тормозных КомОбъектов...
    Но если уж не обойтись без писания в Эксель, то ещё для обмена данными лучше использовать ComSafeArray В синтакс-помошнике надйдёшь описание... Правда, сам для записи его не использовал. Только для чтения, но знаю, что можно использовать и для записи в Эксель....
  17. IlyaM
    Offline

    IlyaM

    Регистрация:
    15 дек 2008
    Сообщения:
    15
    Симпатии:
    0
    Баллы:
    1

    Может, сразу не до конца понимаю... Но по ходу, просто у файла атрибут только для чтения стоит...
    А вообще, точно помню, что когда файл уже открыт СомОбъектом, можно его свойство поменять, которое отвечает за общий доступ к документу(правда уже не помню, как именно). И вот я сталкивался с исключительной ситуацией совместного доступа, но там ничего не сообщалось по поводу файла, "доступного только для чтения"
  18. Jivchic
    Offline

    Jivchic Опытный в 1С

    Регистрация:
    4 фев 2008
    Сообщения:
    54
    Симпатии:
    0
    Баллы:
    26
    Подскажите почему при использовании кода, указанного ниже, после выполнения обработки excel.exe так и висит в процессах... ???

    Код:
    Excel = Новый COMОбъект("Excel.Application");
    Книга = Excel.WorkBooks.Open(ПутьКфайлу);
    
    Для ТекНомер = 1 По 100 Цикл
    
    Сообщить(Книга.Sheets(1).Cells(ТекНомер, 1).Value + " " +
    Книга.Sheets(1).Cells(ТекНомер, 2).Value + " " +
    Книга.Sheets(1).Cells(ТекНомер, 3).Value);
    КонецЦикла;
    
    Excel.Application.Quit();
    
  19. Jivchic
    Offline

    Jivchic Опытный в 1С

    Регистрация:
    4 фев 2008
    Сообщения:
    54
    Симпатии:
    0
    Баллы:
    26
    Переписал так:

    Код:
    Excel = Новый COMОбъект("Excel.Application");
    Книга = Excel.WorkBooks.Open(ПутьКфайлу);
    
    Для ТекНомер = 1 По 100 Цикл
    
    Сообщить(Книга.Sheets(1).Cells(ТекНомер, 1).Value + " " +
    Книга.Sheets(1).Cells(ТекНомер, 2).Value + " " +
    Книга.Sheets(1).Cells(ТекНомер, 3).Value);
    КонецЦикла;
    
    Попытка
    Книга.Close();
    Исключение
    Сообщить(ОписаниеОшибки());    
    КонецПопытки;
    
    Попытка
    Excel.Application.Quit();
    Исключение
    Сообщить(ОписаниеОшибки());    
    КонецПопытки;
    
    
    
    потом заметил, при использовании любого из этих методов Книга.Close() и Excel.Application.Quit() или же эти метода оба, то при закрытии обработки -процесс excel.exe закрывается...

    с чем это связано? почему не работают Книга.Close() и Excel.Application.Quit() до закрытия обработки ?
  20. Jivchic
    Offline

    Jivchic Опытный в 1С

    Регистрация:
    4 фев 2008
    Сообщения:
    54
    Симпатии:
    0
    Баллы:
    26
    подсказали мне, короче нужно освободить переменную...

    Код:
    Книга.Close();
    Excel.Application.Quit();
    
    Excel = "";
    
    

Поделиться этой страницей