Закрыть соединение с excel

Excel для Microsoft 365 Excel 2021 Excel 2019 Excel 2016 Excel 2013 Excel 2010 Excel 2007 Еще…Меньше

Важно: 

  • При разрыве связи с исходной книгой (внешним источником) все формулы, использующие значения в этой книге, преобразуются в свои текущие значения. Например, если разорвать связь с внешней ссылкой =СУММ([Budget.xls]Годовой! C10:C25), формула СУММ заменяется вычисляемой величиной, каким бы ни была формула. Кроме того, так как это действие нельзяотменить, вы можете сохранить версию конечной книги в качестве резервной копии.

  • Если используется диапазон внешних данных, параметр в запросе может использовать данные из другой книги. Может потребоваться проверить и удалить эти типы связей.

Разрыв связи

  1. На вкладке Данные в группе Подключения нажмите кнопку Изменить связи.

    Изменить ссылки

    Примечание: Отсутствие команды Изменить связи означает, что файл не содержит связанных данных.

  2. В списке Источник выберите связь, которую требуется разорвать.

    • Чтобы выбрать несколько связанных объектов, щелкните каждый из них, удерживая нажатой клавишу CTRL.

    • Чтобы выделить все связи, нажмите клавиши CTRL+A.

  3. Щелкните элемент Разорвать.

Удаление имени определенной ссылки

Если для ссылки использовался определенный имя, имя не удаляется автоматически. Чтобы удалить имя, с помощью следующих действий:

  1. На вкладке Формулы в группе Определенные имена нажмите кнопку Диспетчер имен.

  2. В диалоговом окне Диспетчер имен щелкните имя, которое нужно изменить.

  3. Щелкните имя, чтобы выделить его.

  4. Нажмите кнопку Удалить.

  5. Нажмите кнопку ОК.

Дополнительные сведения

Вы всегда можете задать вопрос специалисту Excel Tech Community или попросить помощи в сообществе Answers community.

Нужна дополнительная помощь?

   LeoKeyn

8 — 07.12.17 — 15:10

Приведу полностью может так лучше будет, так как у меня что то не выходит понять

Функция открытия

&НаКлиенте

Функция ОткрытиеEXCEL()

    
    Попытка

        
        Excel = Новый COMОбъект(«Excel.Application»);

        БД = Excel.WorkBooks.Open(ИзначальнаяТаблица);

        Возврат БД;  

        
    Исключение

        
        Сообщить(«Ошибка при открытии файла с помощью Excel! Загрузка не будет произведена!»);

        Сообщить(ОписаниеОшибки());

        
    КонецПопытки;

    
КонецФункции

Обработка

&НаКлиенте

Процедура ОбработкаИзEXCEL()

    
    БДНачальная = ОткрытиеEXCEL();

    БДКонечная = СозданиеDBF();

    КоличествоЛистов = БДНачальная.Sheets.Count;

    
    Для НомерЛиста = 1 ПО КоличествоЛистов Цикл

        Лист = БДНачальная.WorkSheets(НомерЛиста);

        ВсегоСтрок = Лист.Cells(1,1).SpecialCells(11).Row;

        
        Для Строка = 1 ПО ВсегоСтрок Цикл

            Если ПроверкаСодержанияСтроки(Лист.Cells(Строка, 1).Value) = Истина Тогда

                
                Лист.Cells(Строка, 3).Value = СтрЗаменить(Лист.Cells(Строка, 3).Value,Символы.ПС ,» «);

                Лист.Cells(Строка, 3).Value = СтрЗаменить(Лист.Cells(Строка, 3).Value,Символы.ВК ,» «);

                Лист.Cells(Строка, 3).Value = СтрЗаменить(Лист.Cells(Строка, 3).Value,»№» ,» № «);

                Лист.Cells(Строка, 3).Value = СтрЗаменить(Лист.Cells(Строка, 3).Value,»г.» ,» г.»);

                Лист.Cells(Строка, 3).Value = СтрЗаменить(Лист.Cells(Строка, 3).Value,»г .» ,» г.»);

                Лист.Cells(Строка, 3).Value = СтрЗаменить(Лист.Cells(Строка, 3).Value,»  «,» «);

                Лист.Cells(Строка, 3).Value = СокрЛП(Лист.Cells(Строка, 3).Value);

                ЗапомнитьКоммент = Лист.Cells(Строка, 3).Value;

                //БДКонечная.Добавить();

                //БДКонечная.COMMENT = «VID_DOC 0 — не известно, 1 — судебное решение; 2 — погашение; 3 — отмена судебного решения; 4 — формирование иска.»;

                //БДКонечная.Записать();

                
                
                
                БДКонечная.Добавить();

                БДКонечная.COMMENT = ЗапомнитьКоммент;

                БДКонечная.Z_DOC = ОбработатьСтроку(Лист.Cells(Строка, 3).Value,»Z_DOC»);

                Если СтрЧислоВхождений(Лист.Cells(Строка, 5).Value, «ОСР») > 0 Тогда

                    БДКонечная.VID_DOC = 3;

                ИначеЕсли СтрЧислоВхождений(Лист.Cells(Строка, 6).Value, «-«) > 0 Тогда

                    БДКонечная.VID_DOC = 1;

                ИначеЕсли СтрЧислоВхождений(Лист.Cells(Строка, 5).Value, «-«) > 0 Тогда

                    БДКонечная.VID_DOC = 2;

                Иначе

                    БДКонечная.VID_DOC = 0;

                КонецЕсли;

                
                БДКонечная.OPER_NUMB = Лист.Cells(Строка, 1).Value;

                ДатаНомер = Лист.Cells(Строка, 2).Value;

                БДКонечная.DATE = ОбработатьСтроку(Лист.Cells(Строка, 2).Value,»SUD_DATE»);

                БДКонечная.DOCUMENT = СокрЛП(СтрЗаменить(ДатаНомер, Лев(Строка(БДКонечная.DATE), 10), «»));

                БДКонечная.MISTK = ОбработатьСтроку(Лист.Cells(Строка, 3).Value,»MISTK»);

                
                Если СтрЗаменить(БДКонечная.MISTK,» «,»») = «» Тогда

                    БДКонечная.SUD_DOC = ОбработатьСтроку(Лист.Cells(Строка, 3).Value,»SUD_DOC»);

                    
                КонецЕсли;

                БДКонечная.LT = ОбработатьСтроку(Лист.Cells(Строка, 3).Value,»LT»);

                Если НЕ СтрЗаменить(БДКонечная.SUD_DOC,» «,»») = «» Тогда

                    
                    БДКонечная.SUD_DATE = ОбработатьСтроку(Лист.Cells(Строка, 3).Value,»SUD_DATE»,БДКонечная.VID_DOC);

                КонецЕсли;

                
                
                
                
                БДКонечная.PAI_NUMB = ОбработатьСтроку(БДНачальная.Sheets(НомерЛиста).Name,»PAI_NUMB»);

                
                
                Если СтрЧислоВхождений(Лист.Cells(Строка, 5).Value, «-«) > 0 Тогда

                    БДКонечная.DEBIT = Лист.Cells(Строка, 4).Value;

                ИначеЕсли СтрЧислоВхождений(Лист.Cells(Строка, 5).Value, «-«) = 0 И СтрЗаменить(Лист.Cells(Строка, 5).Value,» «,»») <> 0 Тогда

                    БДКонечная.DEBIT = «76/СРШ»;

                КонецЕсли;

                
                Если СтрЧислоВхождений(Лист.Cells(Строка, 6).Value, «-«) > 0 Тогда

                    БДКонечная.CREDIT = Лист.Cells(Строка, 4).Value;

                ИначеЕсли СтрЧислоВхождений(Лист.Cells(Строка, 6).Value, «-«) = 0 И СтрЗаменить(Лист.Cells(Строка, 6).Value,» «,»») <> 0 Тогда

                    БДКонечная.CREDIT = «76/СРШ»;

                КонецЕсли;

                
                Если СтрЧислоВхождений(БДКонечная.CREDIT, «76/СРШ») > 0 Тогда

                БДКонечная.SUM = Лист.Cells(Строка, 6).Value;

                ИначеЕсли СтрЧислоВхождений(БДКонечная.DEBIT, «76/СРШ») > 0 Тогда

                БДКонечная.SUM = Лист.Cells(Строка, 5).Value;

                КонецЕсли;

                БДКонечная.VALUE = Лист.Cells(Строка, 7).Value;

                Если СтрЗаменить(БДКонечная.MISTK,» «,»») = «» Тогда

                    БДКонечная.MISTK = ОбработатьСтроку(Лист.Cells(Строка, 3).Value,»MISTKOST»);

                КонецЕсли;

                Лист.Cells(Строка, 3).Value = ЗапомнитьКоммент;

                БДКонечная.Записать();

                
                
                ОбработкаПрерыванияПользователя();

                
                
                
            КонецЕсли;

            Состояние(«Обрабатывается » + Строка(НомерЛиста) + » лист из » + Строка(КоличествоЛистов), Строка/ВсегоСтрок*100);

            
        КонецЦикла;

        
        
    КонецЦикла;

    БДНачальная.Quit();

    БДКонечная.ЗакрытьФайл();    

    
    
    
    
    
    
    
    
КонецПроцедуры // ОткрытьИзEXCEL()

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

Ссылки в Excel чаще всего используются вместе с такими функциями, как ВПР, для извлечения информации из другой книги. Это может быть специальная ссылка, содержащая адрес не только ячейки, но и книги, в которой находятся данные. В результате эта ссылка выглядит так: = VLOOKUP (A2; ‘[Sales 2018.xlsx] Report’! $ A: $ F; 4; 0). Или, для упрощения представления, представьте адрес в следующей форме: = ‘Report [Sales 2018.xlsx]’! $ A1. Давайте посмотрим на каждый из соединительных элементов этого типа:

  1. [Продажи 2018.xlsx]. Этот фрагмент содержит ссылку на файл, из которого вам нужно получить информацию. Его еще называют источником.
  2. Отношение. Мы использовали следующее имя, но это не обязательно. Этот блок содержит имя листа, на котором вы хотите найти информацию.
  3. $ A: $ F и $ A1 — это адрес ячейки или диапазона с данными, содержащимися в этом документе.

Фактически, процесс создания ссылки на внешний документ называется ссылкой. После регистрации адреса ячейки, содержащейся в другом файле, содержимое вкладки «Данные» изменяется. А именно: становится активной кнопка «Изменить ссылки», с помощью которой пользователь может изменять существующие ссылки.

Суть проблемы

Как правило, дополнительных сложностей в использовании подключений не возникает. Даже если есть ситуация, когда ячейки меняются, все ссылки обновляются автоматически. Но если вы уже переименуете саму книгу или переместите ее на другой адрес, Excel станет бессильным. Таким образом выдает следующее сообщение.

Здесь у пользователя есть два возможных варианта действий в этой ситуации. Он может нажать «Продолжить», и тогда изменения не будут обновлены, или он может нажать кнопку «Изменить ссылки», с помощью которой он сможет обновить их вручную. После нажатия на эту кнопку появится дополнительное окно, в котором вы можете редактировать ссылки, указав, где в данный момент находится нужный файл и как он называется.

Как разорвать ссылки в Excel

Кроме того, можно изменить ссылки, используя соответствующую кнопку, расположенную на вкладке «Данные». Пользователь также может узнать, что соединение разорвано, из-за ошибки #LINK, которая появляется, когда Excel не может получить доступ к информации, расположенной по определенному адресу, из-за того, что сам адрес недействителен.

Как разорвать связь в Эксель

Один из простейших способов разрешить описанную выше ситуацию, если вы не можете самостоятельно обновить расположение связанного файла, — удалить саму ссылку. Это особенно легко сделать, если документ содержит только одну ссылку. Для этого вам необходимо выполнить следующую последовательность действий:

  1. Откройте меню «Данные».
  2. Находим раздел «Подключения» и там — опцию «Изменить подключения».
  3. Затем нажмите «Отключить соединение».

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

Как разорвать связь со всеми книгами

Но если количество ссылок становится слишком большим, их удаление вручную может занять много времени. Решить эту проблему за один раз можно с помощью специального макроса. Он находится в надстройке VBA-Excel. Вам необходимо активировать его и перейти на одноименную вкладку. Будет раздел «Ссылки», в котором мы должны нажать кнопку «Разорвать все ссылки».

Как разорвать ссылки в Excel

Код на VBA

Если вы не можете активировать это дополнение, вы можете создать макрос самостоятельно. Для этого откройте редактор Visual Basic, нажав Alt + F11, и напишите следующие строки в поле ввода кода.

Sub UnlinkWorkBooks()

    Тусклый WbLink

    Тусклый я пока

    Выберите Case MsgBox («Все ссылки на другие книги будут удалены из этого файла, а формулы, которые ссылаются на другие книги, будут заменены значениями». & VbCrLf & «Вы уверены, что хотите продолжить?», 36, «Разорвать ссылку?»)

    Дело 7 «No

        Выйти ниже

    Конец выбора

    WbLinks = ActiveWorkbook.LinkSources (Тип: = xlLinkTypeExcelLinks)

    Если не пусто (WbLinks) Тогда

        Для i = 1 для UBound (WbLinks)

            ActiveWorkbook.BreakLink Имя: = WbLinks (i), Тип: = xlLinkTypeExcelLinks

        Следующий

    Другой

        MsgBox «В этом файле нет ссылок на другие книги.», 64, «Ссылки на другие книги»

    Конец, если

Конец подзаголовка

Как разорвать связи только в выделенном диапазоне

Время от времени количество ссылок очень велико и пользователь опасается, что после удаления одной из них он не сможет вернуть все без надобности. Но этой проблемы легко избежать. Для этого вам нужно выбрать диапазон, в котором нужно удалить ссылки, а затем удалить их. Для этого вам необходимо выполнить следующую последовательность действий:

  1. Выберите набор данных, в который вы хотите внести изменения.
  2. Установите надстройку VBA-Excel, затем перейдите на соответствующую вкладку.
  3. Затем найдите меню «Ссылки» и нажмите кнопку «Разорвать ссылки в выбранных диапазонах».

Как разорвать ссылки в Excel

После этого все ссылки в выбранном наборе ячеек будут удалены.

Что делать, если связи не разрываются

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

  1. Во-первых, вам нужно проверить, содержится ли какая-либо информация в названных диапазонах. Для этого нажмите комбинацию клавиш Ctrl + F3 или откройте вкладку «Формулы» — «Диспетчер имен». Если имя файла полное, вам просто нужно его отредактировать или удалить совсем. Перед удалением именованных диапазонов вам необходимо скопировать файл в другое место, чтобы вы могли вернуться к исходной версии, если вы сделаете что-то неправильно.
  2. Если вы не можете решить проблему, удалив имена, вы можете проверить условное форматирование. Вы можете ссылаться на ячейки из другой таблицы в правилах условного форматирования. Для этого нужно найти соответствующий пункт на вкладке «Главная», затем нажать кнопку «Диспетчер файлов». Как разорвать ссылки в Excel
    Обычно Excel не предлагает возможности предоставить адрес других книг в условном форматировании, но это делается путем ссылки на именованный диапазон со ссылкой на другой файл. Обычно даже после удаления ссылки ссылка остается. Удалить такую ​​ссылку не составит труда, потому что она фактически не работает. Поэтому ничего плохого не произойдет, если вы его удалите.

Вы также можете использовать функцию проверки данных, чтобы увидеть, нет ли ненужных ссылок. Ссылки обычно остаются, если используется тип проверки данных «Список». Но что делать, если ячеек много? Неужели нужно постоянно проверять каждую из них? Очевидно нет. В конце концов, это займет много времени. Поэтому необходимо использовать специальный код, чтобы сохранить его значимым образом.
Явный вариант

‘—————————————————————————————

Автор: The_Prist (Дмитрий Щербаков)

‘Профессиональная разработка приложений MS Office любой сложности

‘Проведение обучающих курсов в MS Excel

https://www.excel-vba.ru

‘info@excel-vba.ru

WebMoney — R298726502453; Яндекс.Деньги — 41001332272872

‘Сфера:

‘—————————————————————————————

Sub FindErrLink()

    ‘вам нужно посмотреть ссылку Data — Изменить ссылки на исходный файл

    ‘и напишите здесь ключевые слова в нижнем регистре (часть имени файла)

    ‘звездочка просто заменяет любое количество символов, поэтому вам не важно точное имя

    Const sToFndLink $ = «* продажи за 2018 год*»

    Dim rr As Range, rc As Range, rres As Range, s$

    ‘определить все ячейки с проверкой данных

    В случае ошибки Продолжить Далее

    Установите rr = ActiveSheet.UsedRange.SpecialCells (xlCellTypeAllValidation)

    Если rr ничего, тогда

        MsgBox «На активном листе нет ячеек с проверкой данных», vbInformation, «www.excel-vba.ru»

        Выйти ниже

    Конец, если

    При ошибке Перейти к 0

    ‘проверить каждую ячейку на наличие соединений

    Для каждого rc In rr

        ‘на всякий случай пропустим ошибки — это тоже может быть

        ‘но наши связи должны быть без них, и они обязательно будут найдены

        s = «»

        В случае ошибки Продолжить Далее

        s = rc.Convalida.Formula1

        При ошибке Перейти к 0

        ‘нашел — все собираем в отдельный ряд

        Если LCase (s) как sToFndLink, то

            Если ничего нет, то

                Установите rres = rc

            Другой

                Установить rres = Union (rc, rres)

            Конец, если

        Конец, если

    Следующий

    ‘если есть соединение, выберите все ячейки с этими элементами управления данными

    Если ничего нет, то

        rres.Select

‘rres.Interior.Color = vbRed’, если вам также нужно выделить цветом

    Конец, если

Конец подзаголовка

вам нужно создать стандартный модуль в редакторе макросов, а затем поместить туда этот текст. Далее вызываем окно макроса с помощью комбинации клавиш Alt + F8, затем выбираем наш макрос и нажимаем кнопку «Выполнить». При использовании этого кода необходимо учитывать несколько моментов:

  1. Прежде чем искать ссылку, которая больше не актуальна, вы должны сначала определить внешний вид ссылки, по которой она была создана. Для этого зайдите в меню «Данные» и найдите пункт «Редактировать ссылки». Далее нужно посмотреть имя файла и указать его в кавычках. Например, вот так: Const sToFndLink $ = «* 2018 продажи*»
  2. имя можно написать не полностью, а просто заменить ненужные символы звездочкой. И в кавычках пишите имя файла строчными буквами. В этом случае Excel найдет в конце все файлы, содержащие эту строку.
  3. Этот код может проверять ссылки только на текущем активном листе.
  4. С помощью этого макроса вы можете выбрать только найденные ячейки. Придется удалить все вручную. Это преимущество, потому что вы можете все перепроверить.
  5. Вы также можете выделить ячейки специальным цветом. Для этого удалите апостроф перед этой строкой rres.Interior.Color = vbRed

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

  1. Сделайте резервную копию документа.
  2. Откроем этот документ с помощью архиватора. Вы можете использовать любой формат, поддерживающий формат ZIP, но WinRar, а также тот, который встроен в Windows, будет.
  3. В появившемся архиве нужно найти папку xl и открыть там externalLinks.
  4. В этой папке находятся все внешние ссылки, каждая из которых соответствует файлу формата externalLink1.xml. Все только пронумерованы, поэтому пользователь не может понять, что это за соединение. Чтобы разобраться, что за подключение, нужно открыть папку _rels и посмотреть ее там.
  5. Затем мы удаляем все определенные ссылки на основе того, что мы узнали из файла externalLinkX.xml.rels.
  6. Далее открываем наш файл с помощью Excel. Появится информация об ошибке, например «Ошибка в части содержания книги». Даём согласие. После этого появится другое диалоговое окно. Закрываем.

После этого все ссылки необходимо удалить.

MS Excel давно стал стандартом для работы с электронными таблицами. В статье рассматриваются способы программной выгрузки и загрузки из 1С в файлы Excel.

Существует несколько способов программной работы с файлами Excel из 1С. Каждый из них имеет свои преимущества и недостатки.

Обмен через табличный документ

Данный способ простой. Его суть заключается в том, что объект ТабличныйДокумент имеет методы:

  • Записать ( ИмяФайла >, ТипФайлаТаблицы >) для выгрузки данных в файл;
  • Прочитать ( ИмяФайла >, СпособЧтенияЗначений >) для загрузки данных из файла.

Внимание!

Метод Записать () доступен как на клиенте, так и на сервере. Метод Прочитать () доступен только на стороне сервера. Необходимо помнить об этом
при планировании клиент-серверного взаимодействия.

Рассмотрим пример сохранения табличного документа в файл. Необходимо любым способом создать и заполнить объект ТабличныйДокумент, а выгрузка в файл осуществляется всего лишь одной строкой:

ТабДок . Записать ( ПутьКФайлу , ТипФайлаТабличногоДокумента . XLSX );

Здесь ТабДок — сформированный табличный документ, ПутьКФайлу — имя файла для выгрузки, ТипФайлаТабличногоДокумента.XLSX — формат создаваемого файла. Поддерживаются следующие форматы Excel:

  • XLS95 — формат Excel 95;
  • XLS97 — формат Excel 97;
  • XLSX — формат Excel 2007.

Загрузка из файла осуществляется также достаточно просто:

ТабДок = Новый ТабличныйДокумент ;
ТабДок . Прочитать ( ПутьКФайлу , СпособЧтенияЗначенийТабличногоДокумента.Значение );

Здесь ПутьКФайлу — путь к загружаемому файлу Excel. СпособЧтенияЗначенийТабличногоДокумента.Значение определяет, каким образом нужно интерпретировать данные, считываемые из исходного документа. Доступны варианты:

  • Значение;
  • Текст.

Обмен через OLE

Обмен через технологию OLE automation, пожалуй, самый распространенный вариант программной работы с файлами Excel. Он позволяет использовать весь функционал, предоставляемый Excel, но отличается медленной скоростью работы по сравнению с другими способами. Для обмена через OLE требуется установка MS Excel:

  • На компьютере конечного пользователя, если обмен происходит на стороне клиента;
  • На компьютере сервера 1С:Предприятие, если обмен происходит на стороне сервера.

Пример выгрузки:

// Создание COM-объекта
Эксель = Новый COMОбъект ( «Excel.Application» );
// Отключение вывода предупреждений и вопросов
Эксель . DisplayAlerts = Ложь;
// Создание новой книги
Книга = Эксель . WorkBooks . Add ();
// Позиционирование на первом листе
Лист = Книга . Worksheets ( 1 );

// Запись значения в ячейку
Лист . Cells ( НомерСтроки , НомерКолонки ). Value = ЗначениеЯчейки ;

// Сохранение файла
Книга . SaveAs ( ИмяФайла );

// Закрытие Эксель и освобождение памяти
Эксель . Quit ();
Эксель = 0 ;

Примеры чтения:

// —— ВАРИАНТ 1 ——

// Создание COM-объекта
Эксель = Новый COMОбъект ( «Excel.Application» );
// Открытие книги
Книга = Эксель . Workbooks . Open ( ПутьКФайлу );
// Позиционирование на нужном листе
Лист = Книга . Worksheets ( 1 );

// Чтение значения ячейки, обычно здесь располагается цикл обхода ячеек
ЗначениеЯчейки = Лист . Cells ( НомерСтроки , НомерКолонки ). Value ;

// Закрытие книги
Книга . Close ( 0 );

// Закрытие Эксель и освобождение памяти
Эксель . Quit ();
Эксель = 0 ;

// —— ВАРИАНТ 2 ——

// Открытие книги
Книга = ПолучитьCOMОбъект ( ПутьКФайлу );
// Позиционирование на нужном листе
Лист = Книга . Worksheets ( 1 );

// Чтение значения ячейки, обычно здесь располагается цикл обхода ячеек
ЗначениеЯчейки = Лист . Cells ( НомерСтроки , НомерКолонки ). Value ;

// Закрытие книги
Книга . Application . Qui t ();

Для обхода всех заполненных строк листа Excel можно использовать следующие приемы:

// —— ВАРИАНТ 1 ——
КоличествоСтрок = Лист . Cells ( 1 , 1 ). SpecialCells ( 11 ). Row ;
Для НомерСтроки = 1 По КоличествоСтрок Цикл
ЗначениеЯчейки = Лист . Cells ( НомерСтроки , НомерКолонки ). Value ;
КонецЦикла;

// —— ВАРИАНТ 2 ——
НомерСтроки = 0 ;
Пока Истина Цикл
НомерСтроки = НомерСтроки + 1 ;
ЗначениеЯчейки = Лист . Cells ( НомерСтроки , НомерКолонки ). Value ;
Если НЕ ЗначениеЗаполнено ( ЗначениеЯчейки ) Тогда
Прервать;
КонецЕсли;
КонецЦикла;

Вместо последовательного обхода всех строк листа можно выгрузить все данные в массив и работать с ним. Такой подход будет быстрее при чтении большого объема данных:

ВсегоКолонок = Лист . Cells ( 1 , 1 ). SpecialCells ( 11 ). Column ;
ВсегоСтрок = Лист . Cells ( 1 , 1 ). SpecialCells ( 11 ). Row ;

Область = Лист . Range ( Лист . Cells ( 1 , 1 ), Лист . Cells ( ВсегоСтрок , ВсегоКолонок ));
Данные = Область . Value . Выгрузить ();

В таблице ниже приведены наиболее востребованные свойства и методы для работы с Excel через OLE:

Действие Код Комментарий
Работа с приложением
Установка видимости окна приложения Эксель . Visible = Ложь;
Установка режима вывода предупреждений (выводить/не выводить) Эксель . DisplayAlerts = Ложь;
Закрытие приложения Эксель . Quit ();
Работа с книгой
Создание новой книги Книга = Эксель . WorkBooks . Add ();
Открытие существующей книги Книга = Эксель . WorkBooks . Open ( ИмяФайла );
Сохранение книги Книга . SaveAs ( ИмяФайла );
Закрытие книги Книга . Close ( 0 );
Работа с листом
Установка текущего листа Лист = Книга . WorkSheets ( НомерЛиста );
Установка имени Лист . Name = Имя ;
Установка защиты Лист . Protect ();
Снятие защиты Лист . UnProtect ();
Установка ориентации страницы Лист . PageSetup . Orientation = 2 ; 1 — книжная, 2 — альбомная
Установка левой границы Лист . PageSetup . LeftMargin = Эксель . CentimetersToPoints ( Сантиметры );
Установка верхней границы Лист . PageSetup . TopMargin = Эксель . CentimetersToPoints ( Сантиметры );
Установка правой границы Лист . PageSetup . RightMargin = Эксель . CentimetersToPoints ( Сантиметры );
Установка нижней границы Лист . PageSetup . BottomMargin = Эксель . CentimetersToPoints ( Сантиметры );
Работа со строками, колонками, ячейками
Установка ширины колонки Лист . Columns ( НомерКолонки ). ColumnWidth = Ширина ;
Удаление строки Лист . Rows ( НомерСтроки ). Delete ();
Удаление колонки Лист . Columns ( НомерКолонки ). Delete ();
Удаление ячейки Лист . Cells ( НомерСтроки , НомерКолонки ). Delete ();
Установка значения Лист . Cells ( НомерСтроки , НомерКолонки ). Value = Значение ;
Объединение ячеек Лист . Range ( Лист . Cells ( НомерСтроки , НомерКолонки ), Лист . Cells ( НомерСтроки1 , НомерКолонки1 )). Merge ();
Установка шрифта Лист . Cells ( НомерСтроки , НомерКолонки ). Font . Name = ИмяШрифта ;
Установка размера шрифта Лист . Cells ( НомерСтроки , НомерКолонки ). Font . Size = РазмерШрифта ;
Установка жирного шрифта Лист . Cells ( НомерСтроки , НомерКолонки ). Font . Bold = 1 ; 1 — жирный шрифт, 0 — нормальный
Установка курсива Лист . Cells ( НомерСтроки , НомерКолонки ). Font . Italic = 1 ; 1 — курсив, 0 — нормальный
Установка подчеркнутого шрифта Лист . Cells ( НомерСтроки , НомерКолонки ). Font . Underline = 2 ; 2 — подчеркнутый, 1 — нет

Для того, чтобы узнать какое свойство нужно менять или какой метод вызвать можно воспользоваться макросами Excel. Если записать макрос с требуемыми действиями, то после можно посмотреть программный код на VBA записанного макроса.

Использование COMSafeArray

При выгрузке больших объемов данных из 1С в Excel для ускорения можно использовать объект COMSafeArray. Согласно определению из синтакс-помощника, COMSafeArray — объектная оболочка над многомерным массивом SafeArray из COM. Позволяет создавать и использовать SafeArray для обмена данными между COM-объектами. Проще говоря, это массив значений, который можно использовать для обмена между приложениями по технологии OLE.

// Создание COMSafeArray
МассивКом = Новый COMSafeArray ( «VT_Variant» , ВсегоКолонок , ВсегоСтрок );
// Заполнение COMSafeArray
Для Стр = 0 По ВсегоСтрок — 1 Цикл
Для Кол = 0 По ВсегоКолонок — 1 Цикл
МассивКом . SetValue ( Кол , Стр , Значение );
КонецЦикла;
КонецЦикла;
// Присвоение области листа Excel значений из COMSafeArray
Лист . Range ( Лист . Cells ( 1 , 1 ), Лист . Cells ( ВсегоСтрок , ВсегоКолонок )). Value = МассивКом ;

Обмен через ADO

Файл Excel при обмене через ADO представляет собой базу данных, к которой можно обращаться при помощи SQL-запросов. Установка MS Excel не требуется, но обязательно наличие драйвера ODBC, при помощи которого будет осуществляться доступ. Используемый драйвер ODBC определяется при указании строки соединения к файлу. Обычно требуемый драйвер уже установлен на компьютере.

Обмен через ADO заметно быстрее обмена через OLE, но при выгрузке нет возможности использовать функционал Excel для оформления ячеек, разметки страниц, задания формул и т.д.

Пример выгрузки:

// Создание COM-объекта для соединения
Соединение = Новый COMОбъект ( «ADODB.Connection» );

// Установка строки соединения
Соединение . ConnectionString = «
|Provider=Microsoft.ACE.OLEDB.12.0;
|Data Source=» + ИмяФайла + «;
|Extended Properties=»»Excel 12.0 XML;HDR=YES»»;» ;
Соединение . Open (); // Открытие соединения

// Создание COM-объекта для команды
Команда = Новый COMОбъект ( «ADODB.Command» );
Команда . ActiveConnection = Соединение ;

// Присвоение текста команды для создания таблицы
Команда . CommandText = «CREATE TABLE [Лист1] (Колонка1 char(255), Колонка2 date, Колонка3 int, Колонка4 float)» ;
Команда . Execute (); // Выполнение команды

// Присвоение текста команды для добавления строки таблицы
Команда . CommandText = «INSERT INTO [Лист1] (Колонка1, Колонка2, Колонка3, Колонка4) values (‘абвгдеё’, ‘8/11/2017’, ‘12345’, ‘12345,6789’)» ;
Команда.Execute(); // Выполнение команды

// Удаление команды и закрытие соединения
Команда = Неопределено;
Соединение . Close ();
Соединение = Неопределено ;

Для создания нового листа и формирования его структуры можно воспользоваться объектами ADOX.Catalog и ADOX.Table. В этом случае код примет вид:

// Создание COM-объекта для работы с книгой
Книга = Новый COMОбъект ( «ADOX.Catalog» );
Книга . ActiveConnection = Соединение ;

// Создание COM-объекта для работы со структурой данных на листе
Таблица = Новый COMОбъект ( «ADOX.Table» );
Таблица . Name = «Лист1» ;
Таблица . Columns . Append ( «Колонка1» , 202 );
Таблица . Columns . Append ( «Колонка2» , 7 );
Таблица . Columns . Append ( «Колонка3» , 5 );
Таблица . Columns . Append ( «Колонка4» , 5 );

// Создание в книге листа с описанной структурой
Книга . Tables . Append ( Таблица );
Таблица = Неопределено;
Книга = Неопределено;

В приведенном примере в методе

Таблица . Columns . Append ( «Колонка1» , 202 );

во втором параметре указывается тип колонки. Параметр необязательный, вот некоторые значения типа колонки:

  • 5 — adDouble;
  • 6 — adCurrency;
  • 7 — adDate;
  • 11 — adBoolean;
  • 202 — adVarWChar;
  • 203 — adLongVarWChar.

Пример чтения:

// Создание COM-объекта для соединения
Соединение = Новый COMОбъект ( «ADODB.Connection» );

// Установка строки соединения
Соединение . ConnectionString = «
|Provider=Microsoft.ACE.OLEDB.12.0;
|Data Source=» + ИмяФайла + «;
|Extended Properties=»»Excel 12.0 XML;HDR=YES»»;» ;
Соединение . Open (); // Открытие соединения

// Создание COM-объекта для получения выборки
Выборка = Новый COMОбъект ( «ADODB.Recordset» );
ТекстЗапроса = «SELECT * FROM [Лист1$]» ;

// Выполнение запроса
Выборка . Open ( ТекстЗапроса , Соединение );

// Обход результата выборки
Пока НЕ Выборка . EOF () Цикл
ЗначениеКолонки1 = Выборка . Fields . Item ( «Колонка1» ). Value ; // Обращение по имени колонки
ЗначениеКолонки2 = Выборка . Fields . Item ( 0 ). Value ; // Обращение по индексу колонки
Выборка . MoveNext ();
КонецЦикла;

Выборка . Close ();
Выборка = Неопределено;
Соединение . Close ();
Соединение = Неопределено;

В строке соединения параметр HDR определяет как будет восприниматься первая строка на листе. Возможны варианты:

  • YES — первая строка воспринимается как названия колонок. К значениям можно обращаться по имени и по индексу колонки.
  • NO — первая строка воспринимается как данные. К значениям можно обращаться только по индексу колонки.

В приведенных примерах рассмотрено лишь несколько объектов ADO. Объектная модель ADO состоит из следующих объектов:

  • Connection;
  • Command;
  • Recordset;
  • Record;
  • Fields;
  • Stream;
  • Errors;
  • Parameters;
  • Properties.

Выгрузка без программирования

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

Для сохранения табличного документа (например, результата отчета) можно вызвать команду Сохранить или Сохранить как… главного меню.

Сохранение табличного документа 1С

В открывшемся окне требуется выбрать каталог, имя и формат сохраняемого файла.

Для сохранения данных динамических списков (например, списка номенклатуры) необходимо:

  1. Вывести данные в табличный документ при помощи команды Еще ⇒ Вывести список…;
  2. Сохранить табличный документ в требуемый формат.

Сохранение динамического списка

Остались вопросы?
Спросите в комментариях к статье.

Обучение программированию на 1С

  • Главная
  • Статьи
  • Жизнь 1С
  • Новости & Личное
  • Программирование
  • Полезное
    • Библиотека решений
    • Функции & Процедуры
    • Материалы
    • Скачать 1С
    • Контакты
    • Использование COM-соединения, выгрузка в Excel через COM-объект Excel.Application

      Вообще COM-объекты используют для соединения информационной базы 1С с файлом Word, Excel, Outlook или любой другой программой, поддерживающей данный интерфейс обмена данными. В этой статье рассмотрим задачу выгрузки/загрузки данных из/в MS Excel. Чтобы это осуществить воспользуемся COM-соединением и объектом Excel.Application. Для примера возьмём задачу выгрузки/загрузки данных о номенклатуре. Пример рассмотрим ниже.

      COM-соединение

      Что же такое COM-соединение? Component Object Model (или COM) – это технология (фирмы Microsoft) взаимодействующих компонентов, которые одновременно могут быть использованы в разных приложениях. При этом весь функционал соответствующего компонента наследуется внутрь разрабатываемого приложения. В нашем случае COM-объект Excel.Application используется внутри кода 1С для операций с файлом книги MS Excel.

      Объект Excel.Application

      У объекта Excel.Application существует ряд методов, которые нам могут пригодиться для реализации нижепоставленной задачи:

      • ОбъектExcel.WorkBooks.Open(ИмяФайла) – Открытие книги MS Excel
      • ОбъектExcel.ActiveWorkbook.Close() – Закрытие текущей книги
      • ОбъектExcel.Quit() – Закрытие COM-объекта
      • ОбъектExcel.Sheets(ИмяЛиста) – Получает лист книги
      • ЛистExcel.Cells(НачалоСтрока, НачалоСтолбец) – Ячейка таблицы на данном листе
      • ЛистExcel.Range(Ячейка1, Ячейка2) – Выделенная область
      • ЯчейкаExcel.Value – Значение ячейки таблицы
      • ЯчейкаExcel.Text – Текст ячейки таблицы

      Постановка задачи

      Итак, предположим, что в обработке 1С у нас имеется табличная часть, состоящая из следующих колонок:

      • Номенклатура
      • Количество
      • Цена
      • Сумма.

      Необходимо реализовать 2 функционала (сделать на форме 2 основные кнопки):

      1. Выгрузка табличной части в подготовленный файл MS Excel
      2. Загрузка табличной части из файла.

      Алгоритм выгрузки/загрузки в MS Excel

      Алгоритм выгрузки следующий:

      1. Выгружаем табличную часть в таблицу значений
      2. Создаём новый COM-объект Excel.Application
      3. Выбираем файл, открываем файл книги MS Excel
      4. Переходим на заданный лист книги
      5. Выгружаем данные в файл
      6. Закрываем книгу, выходим из COM-объекта.

      Алгоритм загрузки следующий:

      1. Создаём новый COM-объект Excel.Application
      2. Выбираем файл, открываем файл книги MS Excel
      3. Переходим на заданный лист книги
      4. Загружаем данные из файла в таблицу значений
      5. Закрываем книгу, выходим из COM-объекта
      6. Таблицу значений выгружаем в табличную часть.

      Операция выгрузки и загрузки данных о номенклатуре происходит в заранее подготовленный шаблон MS Excel.

      Пример кода 1С

      Код 1С я постарался разделить на отдельные функции, чтобы, скопировав, с ними можно было работать где угодно. На форме обработки 1С были созданы 3 кнопки:

      • Выгрузить
      • Загрузить
      • Очистить.

      В итоге в реализации алгоритма получились следующие основные процедуры и функции 1С:

      • ПолучитьExcel – Получает COM-объект MS Excel;
      • ЗакрытьExcel – Закрывает использование COM-объекта MS Excel;
      • ПолучитьЛистExcel – Получает лист книги Excel;
      • ДобавитьТабличныйДокументВExcel – Добавляет табличный документ на лист Excel (нужно для выгрузки данных);
      • ПрочитатьОбластьИзExcel – Читает область ячеек с листа Excel (нужно для загрузки данных);
      • ШиринаЛистаExcel – Ширина листа Excel;
      • ВысотаЛистаExcel – Высота листа Excel;
      • ПреобразоватьТДвТЗ – Преобразует табличный документ в таблицу значений;
      • ПреобразоватьТЗвТД – Преобразует таблицу значений в табличный документ;

      Для начала приведу вспомогательную функцию для открытия/сохранения файла на диске:

      #Если Клиент Тогда // Функция выбора файла. // // Параметры: // РежимВыбора — — Выбор каталога, открытие или сохранение файла; // Расширение — , — Список расширений файла. // // Возвращаемое значение: // — Путь к выбранному файлу. // Функция ВыбратьФайлДокумента(РежимВыбора, Расширение = «*») Экспорт ИмяФайла = «»; //ФорматМассив = РазобратьСтрокуВМассивПоРазделителю(Расширение); ФорматМассив = ПреобразоватьВМассив(Расширение); ДиалогФайла = Новый ДиалогВыбораФайла(РежимВыбора); Если РежимВыбора = РежимДиалогаВыбораФайла.Открытие Тогда ДиалогФайла.Заголовок = «Открыть документ»; ИначеЕсли РежимВыбора = РежимДиалогаВыбораФайла.Сохранение Тогда ДиалогФайла.Заголовок = «Сохранить документ»; ИначеЕсли РежимВыбора = РежимДиалогаВыбораФайла.ВыборКаталога Тогда ДиалогФайла.Заголовок = «Выбрать каталог»; КонецЕсли; Фильтр = «»; Для Каждого ЭлементМассив Из ФорматМассив Цикл Если ЭлементМассив = «*» Тогда Фильтр = Фильтр + «|» + НСтр(«ru = «»Все файлы»»; en = «»All files»»»); ИначеЕсли ВРег(ЭлементМассив) = ВРег(«TXT») Тогда Фильтр = Фильтр + «|» + НСтр(«ru = «»Текстовый документ»»; en = «»Text document»»»); ИначеЕсли ВРег(ЭлементМассив) = ВРег(«MXL») Тогда Фильтр = Фильтр + «|» + НСтр(«ru = «»Табличный документ»»; en = «»Table document»»»); ИначеЕсли ВРег(ЭлементМассив) = ВРег(«XLS») ИЛИ ВРег(ЭлементМассив) = ВРег(«XLSX») ИЛИ ВРег(ЭлементМассив) = ВРег(«XLSM») Тогда Фильтр = Фильтр + «|» + НСтр(«ru = «»Табличный документ MS Excel»»; en = «»Table document MS Excel»»»); ИначеЕсли ВРег(ЭлементМассив) = ВРег(«XML») Тогда Фильтр = Фильтр + «|» + НСтр(«ru = «»Документ XML»»; en = «»Document XML»»»); ИначеЕсли ВРег(ЭлементМассив) = ВРег(«HTML») ИЛИ ВРег(ЭлементМассив) = ВРег(«HTM») Тогда Фильтр = Фильтр + «|» + НСтр(«ru = «»HTML документ»»; en = «»HTML document»»»); Иначе Фильтр = Фильтр + «|» + НСтр(«ru = «»Файл » + ВРег(ЭлементМассив) + «»»; en = «»File » + ВРег(ЭлементМассив) + «»»»); КонецЕсли; Фильтр = Фильтр + » (*.» + НРег(ЭлементМассив) + «)|*.» + НРег(ЭлементМассив); КонецЦикла; Фильтр = Сред(Фильтр, 2); ДиалогФайла.Фильтр = Фильтр; ДиалогФайла.МножественныйВыбор = Ложь; Если ДиалогФайла.Выбрать() Тогда ИмяФайла = ?(РежимВыбора = РежимДиалогаВыбораФайла.ВыборКаталога, ДиалогФайла.Каталог, ДиалогФайла.ПолноеИмяФайла); Иначе Текст = «ru = «»Файл не выбран!»»; en = «»File(s) not selected!»»»; Предупреждение(НСтр(Текст)); КонецЕсли; Возврат ИмяФайла; КонецФункции #КонецЕсли

      Также в реализации алгоритма были задействованы следующие вспомогательные функции:

      // Преобразует в массив переменную любого типа данных. // // Параметры: // Объект — Произвольный — произвольный объект данных; // Проверка — — Осуществление проверки на заполненное значение. // // Возвращаемое значение: // — Массив с теми же данными. // Функция ПреобразоватьВМассив(Объект, Проверка = Ложь) Экспорт ОбъектМассив = Новый Массив; Если НЕ Проверка ИЛИ ЗначениеЗаполнено(Объект) Тогда Если ТипЗнч(Объект) = Тип(«Массив») Тогда ОбъектМассив = Объект; ИначеЕсли ТипЗнч(Объект) = Тип(«СписокЗначений») Тогда ОбъектМассив = Объект.ВыгрузитьЗначения(); ИначеЕсли ТипЗнч(Объект) = Тип(«Строка») Тогда ОбъектМассив = РазобратьСтрокуВМассивПоРазделителю(Объект); ИначеЕсли ТипЗнч(Объект) = Тип(«Структура») Тогда Для Каждого Элемент Из Объект Цикл ОбъектМассив.Добавить(Элемент.Значение); КонецЦикла; Иначе ОбъектМассив.Добавить(Объект); КонецЕсли; КонецЕсли; Возврат ОбъектМассив; КонецФункции;

      // Разбирает строку в массив подстрок по разделителю. // При этом пробелы между подстроками не учитываются. // // Параметры: // Стр — исходная строка; // СтрРазделитель — разделитель, по умолчанию «,»; // ИгнорироватьПустые — игнорировать ли пустые места между разделителями. // // Возвращаемое значение: // Массив строк // Функция РазобратьСтрокуВМассивПоРазделителю(Знач Стр, СтрРазделитель = «,», ИгнорироватьПустые = Ложь) Экспорт Результат = Новый Массив; ВхождениеРазделителя = Найти(Стр, СтрРазделитель); Пока ВхождениеРазделителя <> 0 Цикл ЧастьДоРазделителя = СокрЛП(Лев(Стр, ВхождениеРазделителя — 1)); Если НЕ (ИгнорироватьПустые И ПустаяСтрока(ЧастьДоРазделителя)) Тогда Результат.Добавить(ЧастьДоРазделителя); КонецЕсли; Стр = СокрЛП(Сред(Стр, ВхождениеРазделителя + 1)); ВхождениеРазделителя = Найти(Стр, СтрРазделитель); КонецЦикла; Если НЕ (ИгнорироватьПустые И ПустаяСтрока(Стр)) Тогда Результат.Добавить(СокрЛП(Стр)); КонецЕсли; Возврат Результат; КонецФункции;

      // Создаёт новую таблицу значений с заданными колонками. // // Параметры: // пКолонки — , , , , — // Набор колонок для таблицы значений. // // Возвращаемое значение: // — Созданная таблица. // Функция ПолучитьТаблицуВывода(пКолонки) Экспорт ТЗ = Новый ТаблицаЗначений; Если пКолонки <> Неопределено Тогда Если ТипЗнч(пКолонки) = Тип(«Строка») Тогда пКолонки = РазобратьСтрокуВМассивПоРазделителю(пКолонки); КонецЕсли; Если ТипЗнч(пКолонки) = Тип(«Структура») Тогда Для Каждого Поле Из пКолонки Цикл СтрокаТабл = ТЗ.Колонки.Добавить(Поле.Ключ, Поле.Значение); КонецЦикла; ИначеЕсли ТипЗнч(пКолонки) = Тип(«СписокЗначений») Тогда Для Каждого Поле Из пКолонки Цикл Если Поле.Пометка Тогда СтрокаТабл = ТЗ.Колонки.Добавить(Поле.Значение, пКолонки.ТипЗначения, Поле.Представление); КонецЕсли; КонецЦикла; ИначеЕсли ТипЗнч(пКолонки) = Тип(«ТаблицаЗначений») Тогда ЕстьНаименование = (пКолонки.Колонки.Найти(«Наименование») <> Неопределено); ЕстьТипЗначения = (пКолонки.Колонки.Найти(«ТипЗначения») <> Неопределено); ЕстьЗаголовок = (пКолонки.Колонки.Найти(«Заголовок») <> Неопределено); ЕстьШирина = (пКолонки.Колонки.Найти(«Ширина») <> Неопределено); Для Каждого Поле Из пКолонки Цикл СтрокаТабл = ТЗ.Колонки.Добавить(?(ЕстьНаименование, Поле.Наименование, «»), ?(ЕстьТипЗначения, Поле.ТипЗначения, Новый ОписаниеТипов), ?(ЕстьЗаголовок, Поле.Заголовок, «»), ?(ЕстьШирина, Поле.Ширина, 0)); КонецЦикла; Иначе Для Каждого Поле Из пКолонки Цикл СтрокаТабл = ТЗ.Колонки.Добавить(Поле); КонецЦикла; КонецЕсли; КонецЕсли; Возврат ТЗ; КонецФункции;

      // Создаёт структуру колонок из таблицы значений. // // Параметры: // ТабЗначений — — Любая таблица. // // Возвращаемое значение: // — Созданная таблица. // Функция ПолучитьСтруктуруКолонокИзТаблицы(ТабЗначений) Экспорт СтруктураКолонок = Новый Структура; Для Каждого ЭлементКолонка Из ТабЗначений.Колонки Цикл СтруктураКолонок.Вставить(ЭлементКолонка.Имя, ЭлементКолонка.ТипЗначения); КонецЦикла; Возврат СтруктураКолонок; КонецФункции;

      Основные функции обработки алгоритма следующие:

      // Получает объект файла MS Excel. // // Параметры: // ИмяФайла — — Путь к файлу XLS. // // Возвращаемое значение: // — Полученный объект. Если объект не найден, то возвращается «Неопределено». // Функция ПолучитьExcel(ИмяФайла) Экспорт ФайлНаДиске = Новый Файл(ИмяФайла); Excel = Неопределено; Если нРег(ФайлНаДиске.Расширение) = «.xls» ИЛИ нРег(ФайлНаДиске.Расширение) = «.xlsx» ИЛИ нРег(ФайлНаДиске.Расширение) = «.xlsm» Тогда Если НЕ ФайлНаДиске.Существует() Тогда Сообщить(«Файл не существует!», СтатусСообщения.Внимание); Возврат Неопределено; КонецЕсли; Попытка Excel = Новый COMОбъект(«Excel.Application»); Excel.WorkBooks.Open(ИмяФайла); Исключение Сообщить(«Не удалось инициализировать Excel!», СтатусСообщения.Внимание); Возврат Неопределено; КонецПопытки; КонецЕсли; Возврат Excel; КонецФункции;

      // Закрывает файл MS Excel. // // Параметры: // Excel — — Объект файла MS Excel; // Сохранить — — Указывает сохранять файл при закрытии или нет. По умолчанию // пользователю предлагается выбрать это самому. // Процедура ЗакрытьExcel(Excel, Сохранить = Неопределено) Экспорт Попытка #Если Клиент Тогда Состояние(«Закрытие файла Microsoft Excel. «); #КонецЕсли Если Сохранить = Неопределено Тогда Excel.ActiveWorkbook.Close(); Иначе Excel.ActiveWorkbook.Close(Сохранить); КонецЕсли; Excel.Quit(); Исключение Сообщить(«Ошибка закрытия Excel!», СтатусСообщения.Внимание); КонецПопытки; Excel = Неопределено; КонецПроцедуры;

      // Получает лист из файла книги MS Excel. // // Параметры: // Excel — — Объект файла MS Excel; // ИмяЛиста — — Имя листа книги MS Excel. // // Возвращаемое значение: // — Полученный лист. Если объект не найден, то возвращается «Неопределено». // Функция ПолучитьЛистExcel(Excel, ИмяЛиста) Экспорт Попытка ExcelЛист = Excel.Sheets(ИмяЛиста); Исключение Сообщить(«Не удалось прочитать лист Excel!», СтатусСообщения.Внимание); Возврат Неопределено; КонецПопытки; Возврат ExcelЛист; КонецФункции;

      // Записывает данные из табличного документа в файл MS Excel. // // Параметры: // ЛистExcel — — Лист из файла MS Excel; // Таблица — — Документ, по порядку следования колонок и строк // соответствующий листу файла MS Excel; // Шапка — — Количество первых строк для шапки в файле MS Excel; // СписокСтолбцов — , — Список номеров столбцов, которые будут выгружены // в файл MS Excel; // СписокСтрокЗапрета — , — Список номеров строк, которые не должны // выгружаться в файл MS Excel. Если этот параметр не задан, то выгружаются все строки; // ПроверятьЗначения — — Определяет будут ли проверяться ячейки табличного // документа на содержание в них значения, а не текстовое представление этого значения. // По умолчанию этот параметр «Ложь». // Процедура ДобавитьТабличныйДокументВExcel(ЛистExcel, Таблица, Шапка, СписокСтолбцов, СписокСтрокЗапрета = Неопределено, ПроверятьЗначения = Ложь) Экспорт Если ТипЗнч(СписокСтолбцов) = Тип(«Строка») Тогда СписокСтолбцов = РазобратьСтрокуВМассивПоРазделителю(СписокСтолбцов); КонецЕсли; Если ТипЗнч(СписокСтрокЗапрета) = Тип(«Строка») Тогда СписокСтрокЗапрета = РазобратьСтрокуВМассивПоРазделителю(СписокСтрокЗапрета); КонецЕсли; ЕстьМассив = (СписокСтрокЗапрета = Неопределено); Если ЕстьМассив Тогда Попытка МассивCOM = Новый COMSafeArray(«VT_VARIANT», 1, Таблица.ВысотаТаблицы — Шапка); Исключение ЕстьМассив = Ложь; КонецПопытки; КонецЕсли; Для Каждого НомерСтолбца Из СписокСтолбцов Цикл Для НомерСтроки = Шапка+1 По Таблица.ВысотаТаблицы Цикл Если СписокСтрокЗапрета = Неопределено ИЛИ (СписокСтрокЗапрета.Найти(Строка(НомерСтроки)) = Неопределено И СписокСтрокЗапрета.Найти(Число(НомерСтроки)) = Неопределено) Тогда Область = Таблица.Область(НомерСтроки, Число(НомерСтолбца)); Значение = ?(ПроверятьЗначения И Область.СодержитЗначение, Область.Значение, Область.Текст); Если ЕстьМассив Тогда МассивCOM.SetValue(0, НомерСтроки-Шапка-1, Значение); Иначе ЛистExcel.Cells(НомерСтроки, Число(НомерСтолбца)).Value = Значение; КонецЕсли; КонецЕсли; КонецЦикла; Если ЕстьМассив Тогда ЛистExcel.Range(ЛистExcel.Cells(Шапка+1, Число(НомерСтолбца)), ЛистExcel.Cells(Таблица.ВысотаТаблицы, Число(НомерСтолбца))).Value = МассивCOM; КонецЕсли; КонецЦикла; КонецПроцедуры;

      // Читает область ячеек из MS Excel в табличный документ. // // Параметры: // ЛистExcel — — Лист из файла MS Excel; // ТабДок — — Исходный табличный документ, поле табличного // документа или таблица значений. Если этот параметр не задан, то создаётся // новый табличный документ; // НачалоСтрока — — Начальная строка в файле MS Excel; // НачалоСтолбец — — Начальный столбец в файле MS Excel; // КонецСтрока — — Конечная строка в файле MS Excel; // КонецСтолбец — — Конечный столбец в файле MS Excel. // // Возвращаемое значение: // — Возвращает прочитанный из области в MS Excel табличный // документ, который передавался в эту функцию параметром «ТабДок». // Функция ПрочитатьОбластьИзExcel(ЛистExcel, ТабДок = Неопределено, НачалоСтрока, НачалоСтолбец, КонецСтрока, КонецСтолбец) Экспорт Если ТабДок = Неопределено Тогда ТабДок = Новый ТабличныйДокумент; КонецЕсли; Попытка МассивCOM = Новый COMSafeArray(«VT_VARIANT», КонецСтолбец — НачалоСтолбец + 1, КонецСтрока — НачалоСтрока + 1); ЕстьМассив = Истина; Исключение ЕстьМассив = Ложь; КонецПопытки; Если ЕстьМассив Тогда МассивCOM = ЛистExcel.Range(ЛистExcel.Cells(НачалоСтрока, НачалоСтолбец), ЛистExcel.Cells(КонецСтрока, КонецСтолбец)).Value; Для ИндексКолонка = НачалоСтолбец По КонецСтолбец Цикл Для ИндексСтрока = НачалоСтрока По КонецСтрока Цикл Значение = МассивCOM.GetValue(ИндексКолонка — НачалоСтолбец + 1, ИндексСтрока — НачалоСтрока + 1); ТабДок.Область(ИндексСтрока, ИндексКолонка).СодержитЗначение = Истина; ТабДок.Область(ИндексСтрока, ИндексКолонка).Значение = Значение; КонецЦикла; КонецЦикла; Иначе Для ИндексКолонка = НачалоСтолбец По КонецСтолбец Цикл Для ИндексСтрока = НачалоСтрока По КонецСтрока Цикл Значение = ЛистExcel.Cells(ИндексСтрока, ИндексКолонка).Value; ТабДок.Область(ИндексСтрока, ИндексКолонка).СодержитЗначение = Истина; ТабДок.Область(ИндексСтрока, ИндексКолонка).Значение = Значение; КонецЦикла; КонецЦикла; КонецЕсли; Возврат ТабДок; КонецФункции;

      // Определяет ширину листа MS Excel. // // Параметры: // ЛистExcel — — Лист из файла MS Excel. // // Возвращаемое значение: // — Количество столбцов в таблице. // Функция ШиринаЛистаExcel(ЛистExcel) Экспорт ЕстьЗащита = ЛистExcel.ProtectContents; Возврат ?(ЕстьЗащита, ЛистExcel.UsedRange.Columns.Count, ЛистExcel.Cells.SpecialCells(11).Column); КонецФункции;

      // Определяет высоту листа MS Excel. // // Параметры: // ЛистExcel — — Лист из файла MS Excel. // // Возвращаемое значение: // — Количество строк в таблице. // Функция ВысотаЛистаExcel(ЛистExcel) Экспорт ЕстьЗащита = ЛистExcel.ProtectContents; Возврат ?(ЕстьЗащита, ЛистExcel.UsedRange.Rows.Count, ЛистExcel.Cells.SpecialCells(11).Row); КонецФункции;

      // Преобразовать табличный документ в таблицу значений. // // Параметры: // ТабДок — — Исходный табличный документ; // СтруктураКолонок — , — Структура колонок; // НачалоСтрока — — Строка начала области; // НачалоСтолбец — — Столбец начала области; // КонецСтрока — — Строка конца области; // КонецСтолбец — — Столбец конца области. // // Возвращаемое значение: // — Полученная таблица значений. // Функция ПреобразоватьТДвТЗ(ТабДок, СтруктураКолонок, Знач НачалоСтрока = Неопределено, Знач НачалоСтолбец = Неопределено, Знач КонецСтрока = Неопределено, Знач КонецСтолбец = Неопределено) Экспорт // Определение габаритов таблицы Если НачалоСтрока = Неопределено И НачалоСтолбец = Неопределено Тогда НачалоСтрока = 1; НачалоСтолбец = 1; КонецЕсли; Если НачалоСтрока = Неопределено Тогда НачалоСтрока = 1; Пока НЕ ТабДок.Область(НачалоСтрока, НачалоСтолбец).СодержитЗначение И НачалоСтрока — Исходная таблица значений; // ТабДок — — Полученный табличный документ. Если параметр не задан, // то документ создаётся заново и возвращается функцией; // НачалоСтрока — — Строка начала области; // НачалоСтолбец — — Столбец начала области; // ВыводитьЗаголовки — — Определяет выводить ли имена колонок или нет. // // Возвращаемое значение: // — Полученный табличный документ (возвращает параметр «ТабДок»). // Функция ПреобразоватьТЗвТД(ТабЗначений, ТабДок = Неопределено, Знач НачалоСтрока = Неопределено, Знач НачалоСтолбец = Неопределено, ВыводитьЗаголовки = Ложь) Экспорт Если ТабДок = Неопределено Тогда ТабДок = Новый ТабличныйДокумент; КонецЕсли; // Определение габаритов таблицы НачалоСтрока = ?(НачалоСтрока = Неопределено, 1, НачалоСтрока); НачалоСтолбец = ?(НачалоСтолбец = Неопределено, 1, НачалоСтолбец); // Преобразование ИндексСтроки = НачалоСтрока; Если ВыводитьЗаголовки Тогда ИндексКолонки = НачалоСтолбец; Для Каждого Колонка Из ТабЗначений.Колонки Цикл ТабДок.Область(ИндексСтроки, ИндексКолонки).Текст = ?(ПустаяСтрока(Колонка.Заголовок), Колонка.Имя, Колонка.Заголовок); ИндексКолонки = ИндексКолонки + 1; КонецЦикла; ИндексСтроки = ИндексСтроки + 1; КонецЕсли; Для Каждого Элемент Из ТабЗначений Цикл ИндексКолонки = НачалоСтолбец; Для Каждого Колонка Из ТабЗначений.Колонки Цикл ТабДок.Область(ИндексСтроки, ИндексКолонки).СодержитЗначение = Истина; ТабДок.Область(ИндексСтроки, ИндексКолонки).ТипЗначения = Новый ОписаниеТипов(Колонка.ТипЗначения); ТабДок.Область(ИндексСтроки, ИндексКолонки).Значение = Элемент[Колонка.Имя]; ИндексКолонки = ИндексКолонки + 1; КонецЦикла; ИндексСтроки = ИндексСтроки + 1; КонецЦикла; Возврат ТабДок; КонецФункции;

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

      Целиком получившуюся обработку 1С, а также шаблон для загрузки/выгрузки можно скачать по ссылке ниже.

      Указанные здесь процедуры и функции я постарался сделать универсальными. Они могут быть применены для широкого круга прикладных задач.

      Joiner

      1 / 1 / 1

      Регистрация: 25.03.2014

      Сообщений: 65

      1

      24.05.2017, 17:40. Показов 618. Ответов 6

      Метки нет (Все метки)


      Студворк — интернет-сервис помощи студентам

      Возможно повторяюсь, но внятного ответа для моей ситуации так и не нашел.
      Есть программа на VB, которая открывает Excel и создает отчет. После этого пользователь может закрыть программу, но Excel оставить открытым. Либо наоборот, увидел, например, ошибку в отчете, закрыл отчет и вернулся в программу, что бы исправить ошибку.
      Сейчас при закрытии программы даже отладчик не прекращает работать, пока не прервешь в ручную в VS. Так же при закрытии Excel процесс продолжает висеть в памяти. Если составлять несколько отчетов, то при каждом запуске появляется новый процесс. Как правильно разорвать связь между программой и Excel, что бы можно было дальше автономно работать и там и там?

      Сейчас код такой

      VB.NET
      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      12
      13
      14
      15
      16
      17
      18
      19
      20
      21
      22
      23
      24
      25
      26
      27
      28
      29
      
              Dim objExcel As New Excel.Application ' Excel
              Dim wbSmeta As Excel.Workbook ' книга сметы 
              Dim lstSm As Excel.Worksheet ' лист сметы
              ' создаем книгу
              wbSmeta = objExcel.Workbooks.Add()
              lstSm = wbSmeta.ActiveSheet
              lstSm.Activate()
              ' начальные установки
              objExcel.DisplayAlerts = False
              objExcel.ScreenUpdating = False
       
      << формируем отчет >>
       
              Try
                  objExcel.Application.Visible = True
                  objExcel.DisplayAlerts = True
                  objExcel.ScreenUpdating = True
                  lstSm.Cells.Columns.AutoFit()
      ' тут пытаюсь разорвать все соединения с COM объектом
                  Do While System.Runtime.InteropServices.Marshal.ReleaseComObject(objExcel) > 0
                  Loop
                  objExcel = Nothing
                  wbSmeta = Nothing
                  lstSm = Nothing
              Catch ex As Exception
                  MsgBox(ex.Message)
              Finally
                  GC.Collect()
              End Try



      0



      Модератор

      Эксперт .NET

      3878 / 3200 / 482

      Регистрация: 27.01.2014

      Сообщений: 5,842

      24.05.2017, 18:07

      2

      разорвать соединение вам достаточно строками 22-24…
      и только после этого ReleaseComObject и GC.Collect, если понадобится



      0



      1 / 1 / 1

      Регистрация: 25.03.2014

      Сообщений: 65

      24.05.2017, 18:18

       [ТС]

      3

      Цитата
      Сообщение от Yury Komar
      Посмотреть сообщение

      разорвать соединение вам достаточно строками 22-24…

      Первоначально таки пробовал.

      Цитата
      Сообщение от Yury Komar
      Посмотреть сообщение

      и только после этого ReleaseComObject и GC.Collect, если понадобится

      Вот тут не понял. Если objExcel=Nothing, то к чему применится ReleaseComObject? — это вызовет ошибку.



      0



      1001 / 857 / 203

      Регистрация: 29.09.2015

      Сообщений: 982

      24.05.2017, 19:33

      4

      Цитата
      Сообщение от Joiner
      Посмотреть сообщение

      Так же при закрытии Excel процесс продолжает висеть в памяти

      На хрюнделе избавлялся таким образом — запуск, работу, завершение Excel производил в другом потоке. После завершения потока Excel окончательно пропадал из процессов



      0



      1 / 1 / 1

      Регистрация: 25.03.2014

      Сообщений: 65

      24.05.2017, 19:44

       [ТС]

      5

      Цитата
      Сообщение от Sklifosofsky
      Посмотреть сообщение

      На хрюнделе избавлялся таким образом — запуск, работу, завершение Excel производил в другом потоке. После завершения потока Excel окончательно пропадал из процессов

      Я тут где-то вычитал, что можно программно закрыть Excel, а потом опять открыть как стороннюю программу. Но такой вариант не очень. Долго получается, нервирует пользователя.
      Тут вычитал как делать.
      Нужно разорвать связь со всеми COM-объектами. Остался открытым вопрос как вычислить все связанные COM объекты?
      Удаление связей только с Excel, workbook и sheet результата не дало, ведь константы, линии бордюра, заливка ячеек — тоже COM объекты? Как узнать все связи?



      0



      1001 / 857 / 203

      Регистрация: 29.09.2015

      Сообщений: 982

      24.05.2017, 20:25

      6

      А еще. Вообще все норм работает в Realise версии сборки. То есть готовый продукт (В студии 2013 Сборка-Диспечер конфигураций…-Активная конфигурация решения)



      0



      1 / 1 / 1

      Регистрация: 25.03.2014

      Сообщений: 65

      24.05.2017, 23:21

       [ТС]

      7

      Да, без тела процедуры и у меня в VS2010 отрабатывает нормально и все закрывается. Буду разбираться, что в теле не так.



      0



      Понравилась статья? Поделить с друзьями:
    • Закрыть свою форму в excel
    • Закрыть редактирование ячеек в excel
    • Закрыть пользовательскую форму vba excel
    • Закрыть книгу не закрывая сам excel
    • Закрыть книгу excel клавиши