Имя: Пароль:
1C
1С v8
Excel. Чтение и запись в один раз
0 Mandel
 
07.11.12
20:39
Здравствуйте. Вопрос такой: происходит чтение данных из Excel, дозаписывается информация в открытый файл.
При saveas происходит ошибка, что файл уже занят, т.к. он открыт, что естественно: как это обойти?

   Попытка
       Excel = Новый COMОбъект("Excel.Application");
       Excel.WorkBooks.Open(ИмяФайла);
       Состояние("Обработка файла Microsoft Excel...");
       ExcelЛист = Excel.Sheets(НомерЛистаExcel);
   Исключение      
       Сообщить("Ошибка. Возможно неверно указан номер листа книги Excel.");
       Возврат ложь;
       

...

   Для Row = 1 По RowCount Цикл
       
       ФИО = ExcelЛист.Cells(Row,НомерКолонкиФИО).Text;
       НайденнаяСтрока = Задачи.Строки.Найти(ФИО,"ФизЛицо");
       Если НайденнаяСтрока<>Неопределено Тогда
           ExcelЛист.Cells(Row,НомерКолонки).Text = НайденнаяСтрока.Сумма;
       КонецЕсли;
   КонецЦикла;

   ExcelЛист.Saveas(ИмяФайла);
       
   Excel.WorkBooks.Close();
1 Mandel
 
07.11.12
20:57
Какие есть варианты?
2 Undefined vs NULL
 
07.11.12
20:58
(0) закрыть файл
3 kotletka
 
07.11.12
20:58
(2)+1 ))
+com не кошерно, адо надо
4 Маленький Вопросик
 
07.11.12
21:00
а нет возможности читать из csv?
5 Mandel
 
07.11.12
21:07
Стоп. Как я же закрою файл, но у меня будут в файле измененные данные:

       Если НайденнаяСтрока<>Неопределено Тогда
           ExcelЛист.Cells(Row,НомерКолонки).Text = НайденнаяСтрока.Сумма;
       КонецЕсли;
6 МихаилМ
 
07.11.12
21:11
что за ерунда

Сообщить("Ошибка. Возможно неверно указан номер листа книги Excel.");

----------------------------------

нормально все пишется и читается
укажите версии ПО ос, office , к которому подсключаетесь (visible = true) (help , about)  , 1с

-----------------------------
и полный код

--------------

скорее всего из-за неправильного закрытия ole.excel
в памяти осталась висеть копия, которая и не даёт открыть
файл на чтение.
7 Mandel
 
07.11.12
21:21
Офис 2007. Вот полный код:

Процедура КнопкаЗаписатьВФайлНажатие(Элемент)
   ДиалогВыбораФайла = Новый ДиалогВыбораФайла(РежимДиалогаВыбораФайла.Открытие);
   
   ДиалогВыбораФайла.Заголовок = "Записать результат из файла";
   //ДиалогВыбораФайла.Фильтр    = "Лист Excel (*.xls,*.xlsx)|*.xls|*.xlsx";
   ДиалогВыбораФайла.Фильтр    = "Лист Excel (*.xlsx)|*.xlsx";
   Если ДиалогВыбораФайла.Выбрать() Тогда
       
       ФайлНаДиске = Новый Файл(ДиалогВыбораФайла.ПолноеИмяФайла);
       ИмяФайла = СтрЗаменить(ДиалогВыбораФайла.ПолноеИмяФайла,ДиалогВыбораФайла.Каталог,"");
       мЗаписатьДанныеExcel(ДиалогВыбораФайла.ПолноеИмяФайла);        
       
   КонецЕсли;
КонецПроцедуры



Функция мЗаписатьДанныеExcel(ИмяФайла, НомерЛистаExcel = 1) Экспорт        
   xlLastCell = 11;
   
   ВыбФайл = Новый Файл(ИмяФайла);
   Если НЕ ВыбФайл.Существует() Тогда
       Сообщить("Файл не существует!");
       Возврат Ложь;
   КонецЕсли;
   
   Попытка
       Excel = Новый COMОбъект("Excel.Application");
       Excel.WorkBooks.Open(ИмяФайла);
       Состояние("Обработка файла Microsoft Excel...");
       ExcelЛист = Excel.Sheets(НомерЛистаExcel);
   Исключение      
       Сообщить("Ошибка. Возможно неверно указан номер листа книги Excel.");
       Возврат ложь;
       
   КонецПопытки;
                         
   
   НомерКолонкиСумма = 3;
   
   
   ActiveCell = Excel.ActiveCell.SpecialCells(xlLastCell);
   RowCount = ActiveCell.Row;
   ColumnCount = ActiveCell.Column;
   
   
   
   Для Row = 1 По RowCount Цикл
       
       ФИО = ExcelЛист.Cells(Row,НомерКолонкиФИО).Text;
       НайденнаяСтрока = Задачи.Строки.Найти(ФИО,"ФизЛицо");
       Если НайденнаяСтрока<>Неопределено Тогда
           ExcelЛист.Cells(Row,НомерКолонкиСумма).Text = НайденнаяСтрока.Сумма;
       КонецЕсли;
   КонецЦикла;
   
   
   Попытка
   ExcelЛист.Close(Истина, ИмяФайла);
Исключение
   Сообщить(ОписаниеОшибки());
КонецПопытки;

   Excel.WorkBooks.Close();
   Excel = 0;

               
   Возврат Истина;
   
КонецФункции // ()
8 Mandel
 
07.11.12
21:22
До этого файл открывалая для чтения информации и был закрыт так:

   Excel.WorkBooks.Close();
   Excel = 0;
9 Mandel
 
07.11.12
21:24
Вместо  ExcelЛист.Close(Истина, ИмяФайла); писал  ExcelЛист.SaveAs(ИмяФайла);
10 Mandel
 
07.11.12
21:42
Что делаю не так?
11 Mandel
 
07.11.12
21:52
сделал сам вот так:

СохранениеФайла.Close();
   //Excel.WorkBooks.Close();
    Excel.Application.Quit();
12 sttt
 
07.11.12
22:26
чем бы дитя не тешилось...
13 МихаилМ
 
07.11.12
22:50
вроде все честно

кроме

2 раза

ВыбФайл = Новый Файл(ИмяФайла);
=
ФайлНаДиске = Новый Файл(ДиалогВыбораФайла.ПолноеИмяФайла);