|
Количество страниц в Word'е | ☑ | ||
---|---|---|---|---|
0
Baloven
17.08.11
✎
07:35
|
Собственно проблема следующая:
перебираю файлы с обчитыванием количества страниц с Tiff и mdi разобрался, вот наткнулся на doc и docx и не могу нигде получить толкового объяснения как получить количество страниц все-таки??? вот кусок кода: Макет = ПолучитьМакет("ДоговорНаУслуги"); КомОбъект = Макет.Получить(); КомОбъект.Variables.Item("ДатаДоговора").Value = Формат(ДатаДоговора,"ДФ=дд ММММ гггг") + "г."; КомОбъект.Fields.UpDate(); КомОбъект.SaveAS(ИмяКаталога + "\Договор на услуги.docx"); Строка = ЭлементыФормы.ТаблицаПриложений.Значение.Добавить(); Строка.НомерПП = ЭлементыФормы.ТаблицаПриложений.Значение.Количество(); Строка.Наименование = "Договор на услуги"; Строка.Экземпляров = 2; Строка.Страниц = ??? //КомОбъект.ActiveDocument.PageSetup.Pages.Count; PageSetup.Pages.Count - это в екселе там количество страниц лежит, а где в ворде? |
|||
1
Wobland
17.08.11
✎
07:39
|
чей-то чужой код:
w := CreateOleObject('Word.Application'); w.Documents.Open (FileName:=Doc); PageCount := w.Documents.Item(DocName).ComputeStatistics(Statistic:=wdStatisticPages); |
|||
2
Baloven
17.08.11
✎
08:10
|
я видел этот код - я его не могу под 1с адаптировать :(
|
|||
3
vde69
17.08.11
✎
08:13
|
(2) в 1с НЕТ ворда, если хочешь получить что-то от ворда - сначало его открой в 1с
|
|||
4
Baloven
17.08.11
✎
08:16
|
ПолучитьМакет("ДоговорНаУслуги"); - это и есть документ ворда
|
|||
5
Wobland
17.08.11
✎
08:27
|
странно как-то. макрос из документа
c = ActiveDocument.ComputeStatistics(wdStatisticPages) говорит, что пять. код в 1С
говорит, что 2 тысячи... |
|||
6
Wobland
17.08.11
✎
08:27
|
глюкануло что-то. код в 1С:
w=Новый COMОбъект("Word.Application"); w.Documents.Open("D:\home\00.doc"); pages=w.ActiveDocument.ComputeStatistics(wdStatisticPages); |
|||
7
Baloven
17.08.11
✎
08:30
|
сомневаюсь - сругнется на wdStatisticPages что неопределена.... но попробую
|
|||
8
Wobland
17.08.11
✎
08:30
|
(7) ну да, я Перем сделал
|
|||
9
vde69
17.08.11
✎
08:32
|
WCount:=WordDocument1.ComputeStatistics($00000000);
CCount:=WordDocument1.ComputeStatistics($00000003); SCount:=WordDocument1.ComputeStatistics($00000005); PCount:=WordDocument1.ComputeStatistics($00000002); |
|||
10
Baloven
17.08.11
✎
08:33
|
(8) угу с таким успехом можно и пустое значение передать... так что прошу другие варианты
|
|||
11
Baloven
17.08.11
✎
08:36
|
(9) извини поясни... я так понимаю это и есть одно из них wdStatisticPages
|
|||
12
vde69
17.08.11
✎
08:39
|
(11) в зависимости от параметра (число от 0 и выше) возращает разные данные
$00000000 - wdStatisticWords - Количество слов $00000001 - wdStatisticLines - Количество строк $00000002 - wdStatisticPages - Количество страниц $00000003 - wdStatisticCharacters - Знаки без пробелов $00000004 - wdStatisticParagraphs - Количество абзацев $00000005 - wdStatisticCharactersWithSpaces - Знаки с пробелами |
|||
13
Baloven
17.08.11
✎
08:41
|
(12) спасибо огромное щас буду пробовать
|
|||
14
vde69
17.08.11
✎
08:43
|
(13) вообще-то это ПЕРВАЯ ссылка в яндексе по слову "wdStatisticPages"
|
|||
15
Baloven
17.08.11
✎
08:44
|
попробовал... интересно что строка
КомОбъект.Application.Documents.Item("Документ в Без имени").ComputeStatistics("wdStatisticWords") не работает а то же самое но вот так по числовым значениям: КомОбъект.Application.Documents.Item("Документ в Без имени").ComputeStatistics(0) прекрасно работает всем спасибо |
|||
16
Baloven
17.08.11
✎
08:46
|
(14) спасибо, огромное я просто искал аналогию по PageSetup.Pages.Count и не мог понять как водру передать строковые параметры переменных просто когда увидел посты тогда и дошло что они имеют какие-то предопределенные числовые значения
|
|||
17
vde69
17.08.11
✎
08:55
|
(16) сразу видно что никогда с языками высокого уровня не работал :)
это тип данных такой (примерно можно сравнить с колекцией в 1с, конечно очень условно) к нему можно обращатся по имени или по индексу, число это и есть индекс. |
|||
18
Baloven
17.08.11
✎
08:59
|
другой вопрос возник... как получить из моего кода первого поста имя документа чтобы его поставить в Item?
PS просто ни разу не приходилось сталкивался с VBA |
|||
19
smaharbA
17.08.11
✎
09:00
|
(14) а можно еще нажать альт+ф11 и ф2
|
|||
20
vde69
17.08.11
✎
09:01
|
(18) открою страшную тайну, вместо имени документо можно использовать индекс (число)
|
|||
21
smaharbA
17.08.11
✎
09:01
|
.Name
.Caption |
|||
22
Baloven
17.08.11
✎
09:07
|
(20) хм наверно не вариант.... просто а если будет открыт ворд и в нем будет 10 документов открыто???? думаю тут 2 варианта, 1й по уникальному индексу а лучше все же по пути я же его сохраняю предварительно
|
|||
23
smaharbA
17.08.11
✎
09:10
|
(22) КомОбъект у тебя - это и есть Документ и ненадо тебе .апликешн.документс()
|
|||
24
Baloven
17.08.11
✎
09:15
|
(23) да Спасибо действительно
КомОбъект.ComputeStatistics(2); тоже имеет место быть |
|||
25
Baloven
17.08.11
✎
10:45
|
.... проблема не связанная с данной проблемой, но может кто подскажет:
у меня открывается из макета и заполняется договор и потом сохраняется... по чекпоинтам я получаю полный доступ к документу.... но после его сохранения - файл не открывается и выдает ошибку предлагая попытаться его вовсстановить... где может быть ошибка? |
|||
26
dka80
17.08.11
✎
11:30
|
(25) Процесс Word.exe не висит в памяти?
|
|||
27
dka80
17.08.11
✎
11:31
|
+26 в смысле до момента открытия файла
|
|||
28
Baloven
17.08.11
✎
12:02
|
причину нашел оказалось я принудительно указывал расширение docx а сам оригинал в макете был из источника в формате 2003 ворда, т.е. поменял расширение при сохранении на doc и все встало на свои места и файл нормально открывается: отсюда вопрос как правильно сохранить файл с указанием принудительно формата выходного файла?
|
|||
29
Baloven
17.08.11
✎
12:05
|
(26) (27) сам уже разобрался - просто в я работаю (как видно в тексте с образцом взятым из макета - и посути нормально все отрабатывается, пока не попытаешься его открыть, а вот попытки открытия из-за ассоциаций - уже не получается так как 2007 формат ворду нужно разархивировать :) потому и вылазила ошибка...
|
|||
30
Baloven
17.08.11
✎
12:59
|
в общем как-то так:
КомОбъект.SaveAS(ИмяКаталога + "\Договор на услуги.docx",12); 12 = wdFormatXMLDocument собственно я глупость сморозил все есть в VB редакторе в обжект браузере и в том числе все числовые если это необходимо соответсвия :) |
|||
31
Baloven
17.08.11
✎
16:45
|
Возникла следующая проблема :(
с вордом прокатывает следующая конструкция: doc.Documents.Open(Файл); doc.ActiveDocument.PrintOut(,,Количество); //Ожидание окончания отправки на печать... Пока doc.Application.BackgroundPrintingStatus<>0 Цикл Предупреждение("Ожидание идет печать",1); КонецЦикла; doc.ActiveDocument.Close(); doc.Application.Quit(); А как аналогичную схему сделать с екселем? |
|||
32
Baloven
17.08.11
✎
16:47
|
(31) Я имею ввиду организовать паузу пока файл будет отправлен на печать?
|
|||
33
Baloven
17.08.11
✎
16:51
|
.... и еще вопрос:
как сделаь приостановку пока ексель записывает файл в седующей конструкции перед закрытием листа: doc = новый COMОбъект("Excel.Application"); doc.Workbooks.Open(Строка.Файл); doc.ActiveSheet.PageSetup.FitToPagesWide = 1; doc.ActiveWorkbook.Save(); doc.ActiveWorkbook.Close(); doc.Application.Quit(); doc = 0; |
|||
34
Baloven
17.08.11
✎
16:56
|
... и до кучи....
собственно опять же вопрос по экселю: doc = новый COMОбъект("Excel.Application"); doc.Workbooks.Open(Строка.Файл); doc.ActiveSheet.PageSetup.FitToPagesWide = 1; doc.ActiveWorkbook.Save(); doc.ActiveWorkbook.Close(); doc.Application.Quit(); doc = 0; данная конструкция не работает в части устанвки параметра размещения данных по ширине 1го листа |
|||
35
smaharbA
17.08.11
✎
18:28
|
|
|||
36
Baloven
18.08.11
✎
02:49
|
так у меня то же самое только я с активным листом работаю ActiveSheet и это не работает :(
и это неправильно: Лист.Close(); Лист.Quit(); вот так нужно: Книга.Close(); Ексель.Quit(); |
|||
37
Baloven
18.08.11
✎
06:59
|
(35) за подсказку все же спасибо - беру свои слова обратно
эта конструкция в моем случае работает: doc = новый COMОбъект("Excel.Application"); doc.Workbooks.Open(Строка.Файл); doc.ActiveSheet.PageSetup.Zoom = ЛОЖЬ; doc.ActiveSheet.PageSetup.FitToPagesWide = 1; doc.ActiveWorkbook.Save(); doc.ActiveWorkbook.Close(); doc.Application.Quit(); doc = 0; Все дело как оказалось в строке doc.ActiveSheet.PageSetup.Zoom = ЛОЖЬ; Всем спасибо |
|||
38
smaharbA
18.08.11
✎
07:05
|
(37) переписывай код, а то рано или поздно банан упадет
|
|||
39
Baloven
18.08.11
✎
07:11
|
(38) сорри не понял?
|
|||
40
smaharbA
18.08.11
✎
07:46
|
doc = новый COMОбъект("Excel.Application");
doc.Workbooks.Open(Строка.Файл); "завис" адинес, в это время активируется другая книга и после этого банан, объект уже не твой, а какой то другой |
|||
41
Baloven
18.08.11
✎
07:52
|
вполне согласен... однако и строка
Лист = Листы.Item(1); не показатель, что это именно открытый вами лист... так что если есть предложение получить ссылку именно на открытую книгу - то выслушаю |
|||
42
smaharbA
18.08.11
✎
08:10
|
(41) это именно показатель
Ексель - Книги - Открытая книга - листы - конкретный лист - ... все связано однозначно а в конструкции Ексель - Ексель.активныйлист(книга) абсолютно хаос |
|||
43
smaharbA
18.08.11
✎
08:11
|
в (35) самое верное написание
|
|||
44
Baloven
18.08.11
✎
08:44
|
я так думаю что однозначная идентификация будет все же по ссылке на файл, т.е. прежде чем присваивать ссылку - перебрать все книги и сверить ссылку с открытым... Вот тогда будет однозначно :) а то опять же получится да же по Вашему коду после строки:
Книга = Книги.Open(Строка.Файл); ""завис" адинес, в это время активируется другая книга"... я это все понимаю и вопрос в принципе решен и решение стабилизации я так понимаю мы оба знаем :) как минмум в каком направлении двигаться :) |
|||
45
smaharbA
18.08.11
✎
08:47
|
(44) открытием уже открытой вполне можно активировать уже открытую, а про банан о другом
|
|||
46
Baloven
18.08.11
✎
09:59
|
нет ну я-то согласен - и описанная мной ситуация - тоже в принципе имеет место быть жизненной - собственно это уже полемика и не по текущему вопросу - тогда можно проверить ссылку на файл у Лист = Листы.Item(1); ну и в конце концов если уж она не соответствует - тогда и делать перебор открытых книг....
|
|||
47
Baloven
21.08.11
✎
04:19
|
и опять проблемы с маштабированием страниц в екселе :(
конструкция: doc.ActiveSheet.PageSetup.Zoom = Ложь; doc.ActiveSheet.PageSetup.FitToPagesWide = 1; масштабирует все данные на Один лист, а мне нужно чтобы масштаб был по ширине на одну страницу, а по высоте - сколько получится...вручную я просто удаляю значение второй графы - и все ок.... попробовал записать макрос - мне отобразилось вот такое FitToPagesTall = 0 изменяю свою конструкцию doc.ActiveSheet.PageSetup.Zoom = Ложь; doc.ActiveSheet.PageSetup.FitToPagesWide = 1; doc.ActiveSheet.PageSetup.FitToPagesTall = 0; не работает так и ругается на ошибку с Zoom и если его поставить в Истину, тогда ругается на ошибку с установкой значения FitToPagesTall . Где грабли? |
|||
48
Baloven
21.08.11
✎
04:55
|
Вроде получилось вот так:
doc.ActiveSheet.PageSetup.FitToPagesTall = Ложь; |
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |