Имя: Пароль:
1C
1С v8
Запись в существующий файл Excel
0 zippygrill
 
28.04.20
16:14
Всем привет!
Прошу вашего совета. Дано файл эксель xlsx. Построчно надо пройтись и заполнить столбец.
Делаю так:

    Попытка
        Книга = ПолучитьCOMОбъект(ИмяФайла);
    Исключение
        ПоказатьПредупреждение(,ОписаниеОшибки());
        Возврат;
    КонецПопытки;
    Лист = Книга.Worksheets(1);
    Для Сч = НомерСтрНачало по ФайлСтрок Цикл
        Лист.Cells(Сч, НомерСтолбцаКоличество).Value = Количество;
    КонецЦикла;

    Попытка
        Книга.SaveAs(Путь);
        Книга.Application.DisplayAlerts = False;
        Книга.Close(0);
        Исключение
        КонецПопытки;


В результате файл сохраняется, даже заполняется столбец, но открываю его через Excel и там вот так https://www.screencast.com/t/Z4P4rlMFF
Причем файл весит 9мб. Что я пропустил..
Раньше, работа с xls делал через Новый COMОбъект("Excel.Application"), но в силу того что стала возникать проблема с _filterDatabase переписал на ПолучитьCOMОбъект(ИмяФайла)
1 zippygrill
 
28.04.20
16:48
апну
2 zippygrill
 
28.04.20
17:28
Создал пустой файл excel. Открываю норм, сетка видна, все команды на месте.

написал 4 строки работы с ним. Выполняю код:

                Книга = ПолучитьCOMОбъект(ИмяФайла);
                Лист = Книга.Worksheets(1);
                Лист.Cells(1, 1).Value = 99;
                Лист.SaveAs(ИмяФайла);
                Книга.Application.Quit();

Открываю заново файл, и там уже пустота. Я так понимаю что то с функцией SAveAs
3 ChMikle
 
28.04.20
17:45
(2) он его в режиме "только для чтения" не открывает случаем ?
4 zippygrill
 
29.04.20
08:57
(3) Вот хз. Да даже если в таком режиме - ячейки то я должен увидеть
5 ChMikle
 
29.04.20
08:59
(4) попробуйте не указывая лист запись сделать
6 zippygrill
 
29.04.20
09:37
т.е. без изменения листа, просто сделать запись?
7 ChMikle
 
29.04.20
09:38
(6) угу , была у меня как-то такая несуразица, может поможет
8 zippygrill
 
29.04.20
09:41
Книга = ПолучитьCOMОбъект(ИмяФайла);
                Лист = Книга.Worksheets(1);
                //Лист.Cells(1, 1).Value = 99;
                Лист.SaveAs(ИмяФайла);
                Книга.Application.Quit();

Все равно, пустой получается после записи.
9 zippygrill
 
29.04.20
09:43
а если убрать SAveAs и оставить Quit - предложить сохранить сам эксель..
10 ChMikle
 
29.04.20
09:44
(8)
Книга = ПолучитьCOMОбъект(ИмяФайла);
                //Лист = Книга.Worksheets(1);
                //Лист.Cells(1, 1).Value = 99;
                Книга.Cells(1, 1).Value = 99;
                Книга.SaveAs(ИмяФайла);
                Книга.Application.Quit();
11 zippygrill
 
29.04.20
09:47
откуда у Книги Cells..
12 ИУБиПовиц
 
29.04.20
09:49
А если вставить Книга.ActiveWindow.DisplayWorkbookTabs = 1;
сколько листов будет? может он кудато не тудать пишет?:)
И у saveas вроде еще второй параметр есть, попробуйте его указать (https://docs.microsoft.com/ru-ru/office/vba/api/excel.xlfileformat)
13 zippygrill
 
29.04.20
09:51
(12) Ну у SaveAS вагон параметров))
14 ИУБиПовиц
 
29.04.20
09:53
(13) не ну остальные то точно не в тему:)
15 zippygrill
 
29.04.20
09:53
нет у него ActiveWindow
16 ChMikle
 
29.04.20
09:56
попробуйте, там по умолчанию в первый лист пишет
17 zippygrill
 
29.04.20
09:59
(16) пробовал. Книга.Cells не знает
18 zippygrill
 
29.04.20
09:59
Книга.SaveAs(ИмяФайла, "–4143");
Книга.SaveAs(ИмяФайла, "xlWorkbookNormal");

Оба завершают операию сохранения аварийно
19 ChMikle
 
29.04.20
10:02
(19) файл на сервере лежит ?
20 ChMikle
 
29.04.20
10:03
может проблема с правами доступа пользователя к этому файлу
21 zippygrill
 
29.04.20
10:11
(19) клиент
22 ChMikle
 
29.04.20
10:16
(21) перекиньте на сервер что ли , может правда дело в доступе
23 zippygrill
 
29.04.20
10:21
а там нет Эксель
24 Василий Алибабаевич
 
29.04.20
10:23
(0) Нельзя делать Save и тут же Close. Нужно все-таки подождать пока файл запишется.
А вот это вот "DisplayAlerts = False;" все равно что набрать разгон перед стеной и закрыть глаза в надежде, что пронесет.
25 zippygrill
 
29.04.20
10:27
Нельзя делать Save и тут же Close. Нужно все-таки подождать пока файл запишется. >> Откуда инфа? звучит бредово!
26 ИУБиПовиц
 
29.04.20
10:32
У себя переделал так, ексель стал открываться. Попробуйте тоже так
Команда1НаСервере();
     ИмяФАйла = "C:\Users\E.Sknarev\Desktop\1.xlsx";
     НомерСтолбцаКоличество = 1;
    
    Книга=Новый COMОбъект("Excel.Application");
    Книга.Application.Workbooks.Open(ИмяФАйла);
    
    Лист = Книга.Worksheets(1);
    /

    Для Сч = 1 по 10 Цикл
        Лист.Cells(Сч, НомерСтолбцаКоличество).Value = 99;
    КонецЦикла;

    Попытка
        
        Книга.ActiveWorkbook.SaveAs(ИмяФАйла);
        Книга.Application.DisplayAlerts = False;
        Книга.Quit();
    Исключение
        Сообщить(ОписаниеОшибки());
        КонецПопытки;
27 ChMikle
 
29.04.20
10:32
(23) а подключение к екселю идет на сервере ?
28 zippygrill
 
29.04.20
11:01
(27) Нет -  все на клиенте делается.
29 zippygrill
 
29.04.20
11:02
Книга=Новый COMОбъект("Excel.Application"); - вот так SaveAs  то у меня работает

А надо чтобы

Книга = ПолучитьCOMОбъект(ИмяФайла);
30 ChMikle
 
29.04.20
11:28
(29) может забить тогда и делать как получается :))
31 zippygrill
 
30.04.20
09:46
(30) для этого нужно пересохранять в excel 2007 или какой то там старый
32 ChMikle
 
30.04.20
09:49
(31) м.б. с версией екселя что-то связанно
33 Fedor-1971
 
30.04.20
10:06
(29) попробуй так:
Книга.Save(0); - если правильно помню, то это записать без выдачи вопросов, возможно без параметра 0. Только нужно учесть, что файл будет один

Книга.Display(1) - если делаешь на клиенте, то, на время отладки, просто покажи заполняемую книгу

Смотри отладчиком процесс заполнения, как минимум, пишешь в каком-то другом формате (например, .XLS вместо .XLSx)
34 zippygrill
 
30.04.20
10:54
(33)
Вот так?

                Книга = ПолучитьCOMОбъект(ИмяФайла);
                Лист = Книга.Worksheets(1);
                Лист.Cells(1, 1).Value = 99;
                Книга.Save(0);
                Книга.Application.Quit();
35 zippygrill
 
30.04.20
10:59
Вот так сохраняет, но файл при открытии в эксель опять пустой, книги нет

                Книга = ПолучитьCOMОбъект(ИмяФайла);
                Лист = Книга.Worksheets(1);
                Лист.Cells(1, 1).Value = 99;
                Книга.Save();
                //Книга.SaveAs(ИмяФайла, "–4143");
                Книга.Application.Quit();
36 zippygrill
 
30.04.20
11:00
здесь вообще SAve указывают что без параметров https://docs.microsoft.com/ru-ru/office/vba/api/excel.workbook.save
37 Fedor-1971
 
30.04.20
11:13
(35) тогда включай отображение Exel и смотри как заполняется файл и как записывается
38 Fedor-1971
 
30.04.20
11:43
37+ Я правильно понимаю?
Существует (!!!) файл, например, D:\ИмяФайла.XLSx, в нём есть листы
Открываем его кодом, изменяем, записываем, закрываем

При открытии через ексель: листы пропали, файл гнутый?

Посмотри, на всякий случай, есть ли в каталоге скрытый файл с тильдой (символ "~")
dir d:\*ИмяФайла*.* /A

это признак, что файл изменяется и не закрыт
39 zippygrill
 
30.04.20
11:44
(37) Не нахожу такого метода у COM
40 zippygrill
 
30.04.20
11:44
(38) При открытии через ексель: листы пропали, файл гнутый? - да
41 zippygrill
 
30.04.20
11:46
(38) Посмотри, на всякий случай, есть ли в каталоге скрытый файл с тильдой (символ "~") - нет таких.
Появляются только когда непосредственно открываю в excel
42 Fedor-1971
 
30.04.20
11:50
(39) Что-то типа:
   Книга.Application.DisplayAlerts = true
   Книга.Visible
43 Fedor-1971
 
30.04.20
11:57
Попробуй сравнить в отладчике
    Книга=Новый COMОбъект("Excel.Application");
    Книга.Application.Workbooks.Open(ИмяФАйла);

и
    Книга = ПолучитьCOMОбъект(ИмяФайла); - тут может прихватиться какой-нить просмотрщик файлов, а не ексель

Возможно, что получать объект надо так: ПолучитьCOMОбъект(ИмяФайла, "Excel.Application");
44 zippygrill
 
30.04.20
12:03
(43) если указать ПолучитьCOMОбъект(ИмяФайла, "Excel.Application") то: Ошибка получения объекта COM: -2147467262(0x80004002): Интерфейс не поддерживается
45 zippygrill
 
30.04.20
12:03
(43) тут может прихватиться какой-нить просмотрщик файлов, а не ексель - там точно эксель, потому как вижу его свойства и методы
46 Fedor-1971
 
30.04.20
12:08
(44) тогда у меня идеи закончились
47 zippygrill
 
30.04.20
12:11
спс что поделился ими ))
48 v77
 
30.04.20
13:03
(0) Выложил бы файл. Люди бы глянули и сказали сразу. А так гадать не перегадать.
49 zippygrill
 
30.04.20
13:20
файл до обработки https://yadi.sk/i/FWu4zCXh4uG-Uw
файл после обработки https://yadi.sk/i/5AOIVq3pLzGQ7w

вот выполняемый код на клиенте

                Книга = ПолучитьCOMОбъект(ИмяФайла); //, "Excel.Application");
                Книга.Application.DisplayAlerts = true;
                Книга.Application.Visible = true;
                Лист = Книга.Worksheets(1);
                Лист.Cells(1, 1).Value = 99;
                Книга.Save();
50 v77
 
30.04.20
13:46
А попробуй
Лист.Visible = True;
Книга.Save();
51 v77
 
30.04.20
13:47
Сделай лист видимым перед сохранением
52 v77
 
30.04.20
13:49
Ну и не забывай

Лист = 0;
Книга = 0;
53 zippygrill
 
30.04.20
13:59
(52) все равно белый эксель

                Книга = ПолучитьCOMОбъект(ИмяФайла); //, "Excel.Application");
                Книга.Application.DisplayAlerts = true;
                Книга.Application.Visible = true;
                Лист = Книга.Worksheets(1);
                Лист.Cells(1, 1).Value = 99;
                Лист.Visible = true;
                Книга.Save();
                Лист = 0;
                Книга = 0;
54 v77
 
30.04.20
14:11
Ну как бы суть в том, что лист скрывается. Капать в эту сторону надо.
55 v77
 
30.04.20
15:13
А так?

Лист.Activate();
Лист.Visible = true;
Книга.Save();
56 zippygrill
 
30.04.20
15:17
(55) Нет к сожалнию
57 zippygrill
 
30.04.20
15:17
сожалению
58 v77
 
30.04.20
15:20
фигня какая то. у меня всё работает
59 zippygrill
 
30.04.20
15:21
Вот так?

                Книга = ПолучитьCOMОбъект(ИмяФайла); //, "Excel.Application");
                Книга.Application.DisplayAlerts = true;
                Книга.Application.Visible = true;
                Лист = Книга.Worksheets(1);
                Лист.Cells(1, 1).Value = 99;
                Лист.Activate();
                Лист.Visible = true;
                Книга.Save();
                Лист = 0;
                Книга = 0;
60 v77
 
30.04.20
16:11
вот так

&НаКлиенте
Процедура Команда1(Команда)
ИмяФайла = "c:\temp\99.xlsx";
Книга = ПолучитьCOMОбъект(ИмяФайла);
Лист = Книга.Worksheets(1);
Книга.Windows(1).Visible = True;
Лист.Cells(1, 1).Value = 99;
Книга.Close(True);
Лист = 0;
Книга = 0;
КонецПроцедуры
61 zippygrill
 
30.04.20
16:16
у тебя Close у меня Save))
62 v77
 
30.04.20
16:21
не. дело в
Книга.Windows(1).Visible = True;
63 v77
 
30.04.20
16:21
ну и закрывать книгу тоже надо
64 zippygrill
 
30.04.20
16:24
Книга.Windows(1).Visible = False; - тоже плохо будет закрыватся7
65 v77
 
30.04.20
16:24
(64) не знаю. знаю что (60) работает
66 v77
 
30.04.20
16:28
короче, прятались не листы, а вся книга
67 zippygrill
 
01.05.20
18:35
отлично, спс!