Перейти к содержанию

Как автоматически посчитать число страниц в разных файлах?


Рекомендуемые сообщения

Всем привет!

 

Есть техническая проблема, прошу помощи в автоматизации.

 

Ситуация: мне принесли жесткий диск с разрозненными файлами. Там могут быть договоры и прочие документы в формате doc, docx, xls, xlsx и подобные (пока сам не знаю точно какие, еще не видел диск). Некоторые документы могут быть по одной странице, некоторые по 1000 страниц. Допустим, на диске будет 5123 документа (наугад написал, скорее всего будет больше).

 

Мне нужно узнать объём выполняемой работы в страницах. Каждый понимает, что оплатить труд по анализу 50 страниц дешевле, чем по анализу 5000 страниц. Кроме того, чем больше страниц, тем больше время требуется на работу.

Стандартный вариант: открыть вордом или экселем документ, нажать кнопку "печать" и в предпросмотре увидеть количество страниц в данном документе при выводе на печать. И сделать это 5123 раза подряд, суммируя результаты. Это труд, который может занять море времени.

 

Как посчитать автоматически количество страниц во всех документах при выводе их на печать, не открывая каждый из них отдельно?

Ссылка на комментарий
Поделиться на другие сайты

Поиск подсказал один из способов
Как посчитать количество страниц сразу в нескольких документах Word

сам не проверял, нет образцов файлов Word

  • Like (+1) 1
Ссылка на комментарий
Поделиться на другие сайты

  В 03.12.2020 в 12:55, kmscom сказал:
Показать  

Так всё равно надо будет сидеть и потом на калькуляторе плюсовать страницы, так что под условия задачи не подходит.

  В 03.12.2020 в 12:55, kmscom сказал:

Поиск подсказал один из способов

Показать  

В поиске можно найти это https://www.sql.ru/forum/953973/kak-poschitat-obshhee-kolichestvo-stranic-teksta-v-nabore-faylov-word-a

Вроде как раз то что нужно, но там делалось для старого ворда. Так что если для .doс и будет работать (не проверял), то для docx и так ясно, что работать не будет. Ибо это уже по структуре это документ внутри архива. На всякий случай код .vbs скрипта из последнего вложения там

With CreateObject("word.application")
  For Each x In CreateObject("scripting.filesystemobject").getfile(wscript.scriptfullname).parentfolder.Files
    If LCase(Mid(x.Name, InStrRev(x.Name, ".") + 1, 3)) = "doc" Then
      With .documents.open(x.Path, , True) 'ReadOnly
        numDocs = numDocs + 1
        sumPages = sumPages + .Content.ComputeStatistics(2) 'wdStatisticPages
'        sumPages = sumPages + .BuiltInDocumentProperties(14) 'wdPropertyPages 'считает неправильно!
        .Close False 'don't save changes
      End With
    End If
  Next
  .Quit
End With
wscript.echo "Всего страниц " & sumPages & Chr(13) & "Документов " & numDocs

 

Изменено пользователем regist
  • Like (+1) 1
  • Спасибо (+1) 1
Ссылка на комментарий
Поделиться на другие сайты

  В 03.12.2020 в 13:13, regist сказал:

Так всё равно надо будет сидеть и потом на калькуляторе плюсовать страницы, так что под условия задачи не подходит.

Показать  

Зачем? Там ведь отобразиться количество страниц сразу нескольких документов.

Ссылка на комментарий
Поделиться на другие сайты

  В 03.12.2020 в 12:55, kmscom сказал:

Поиск подсказал один из способов

Показать  

Там есть один момент: "Замечание: Если в списке присутствуют файлы, в которых нет подсчёта страниц, то в столбце Число страниц (Pages) указано ничего не будет."

 

  В 03.12.2020 в 13:13, regist сказал:

Так всё равно надо будет сидеть и потом на калькуляторе плюсовать страницы, так что под условия задачи не подходит.

  В 03.12.2020 в 12:55, kmscom сказал:
Показать  

Их хотя бы не надо открывать каждый, уже хорошо.

Ссылка на комментарий
Поделиться на другие сайты

Не вижу, где там показывает сразу у нескольких документов.

 

Попробовал способ через колонку "Число страниц" на MS Office 2019, Windows 10 x64,

система корректно показывает кол-во страниц только у документов, созданных этим же Office 2019 (как doc, так и docx),

у других doc, например, созданных в Office 2003, показывает всегда число 1.

А еще часто бывают rtf, там вообще не отображается.

 

Попробовал способ через vbs, считает долго (т.к. открывает в скрытом виде каждый документ), но посчитало правильно.

Для docx тебе ничего исправлять в скрипте не надо, т.к. во первых проверяются только первые 3 буквы после последней точки в имени файла,

во-вторых, документ открывается точно также как и doc, не смотря на другую его структуру, ведь скрипт берёт значение от самого Word-а,

не анализируя внутренности файла самостоятельно.

 

Сделал обобщённый вариант vbs, с подсчетом раздельно и в сумме DOC*, XLS*, RTF со сканом рекурсивно (с подкаталогами):

 

Dim numXDocs, sumXSheets, sumXPages, numWDocs, sumWPages

set oExcel = CreateObject("excel.application")
set oWord = CreateObject("word.application")
set root = CreateObject("scripting.filesystemobject").getfile(wscript.scriptfullname).parentfolder
Analysis(root)

oExcel.Quit: oWord.Quit
set oExcel = Nothing: set oWord = Nothing: set root = Nothing

wscript.echo _
	"DOC*, RTF:" & Chr(13) & _
	"Всего страниц: " & sumWPages & Chr(13) & "Документов: " & numWDocs & _
	Chr(13) & Chr(13) & "XLS*" & Chr(13) & _
	"Всего страниц: " & sumXPages & Chr(13) & "Всего листов: " & sumXSheets & Chr(13) & "Документов: " & numXDocs & _
	Chr(13) & Chr(13) & "-----------------" & Chr(13) & "Общее:" & Chr(13) & Chr(13) & _
	"Страниц: " & sumXPages + sumWPages & Chr(13) & "Документов: " & numXDocs + numWDocs
	
Sub Analysis(root)

	With oExcel
	  For Each x In root.Files
		If LCase(Mid(x.Name, InStrRev(x.Name, ".") + 1, 3)) = "xls" Then
		  With .workbooks.open(x.Path, , True) 'ReadOnly
			numXDocs = numXDocs + 1
			sumXSheets = sumXSheets + .sheets.count
			For Each sheet in .sheets
			  sumXPages = sumXPages + (sheet.HPageBreaks.Count + 1) * (sheet.VPageBreaks.Count + 1)
			Next
			.Close False 'don't save changes
		  End With
		End If
	  Next
	  .Quit
	End With
	
	With oWord
	  For Each x In root.Files
	    ext = LCase(Mid(x.Name, InStrRev(x.Name, ".") + 1, 3))
		if ext = "doc" or ext = "rtf" then
          With .documents.open(x.Path, , True) 'ReadOnly
            numWDocs = numWDocs + 1
            sumWPages = sumWPages + .Content.ComputeStatistics(2) 'wdStatisticPages
            .Close False 'don't save changes
          End With
		end if
	  Next
    End With

	For Each x in root.SubFolders: Analysis(x): Next

End Sub

 

Изменено пользователем Dragokas
  • Like (+1) 2
  • Спасибо (+1) 1
Ссылка на комментарий
Поделиться на другие сайты

  В 03.12.2020 в 16:59, Dragokas сказал:

Сделал обобщённый вариант vbs, с подсчетом раздельно и в сумме DOC*, XLS*, RTF со сканом рекурсивно (с подкаталогами):

 

Показать  

Спасибо! А как его запускать? В блокнот скопировать и сменить расширение на *.vbs? 

Ссылка на комментарий
Поделиться на другие сайты

  В 03.12.2020 в 14:37, Воронцов сказал:

Зачем? Там ведь отобразиться количество страниц сразу нескольких документов.

Показать  

Нескольких, но число то выводится для каждого отдельно, а не суммарное в папке.

 

  В 03.12.2020 в 18:42, Mrak сказал:

В блокнот скопировать и сменить расширение на *.vbs? 

Показать  

да.

  • Спасибо (+1) 1
Ссылка на комментарий
Поделиться на другие сайты

  • 1 год спустя...
  В 03.12.2020 в 16:59, Dragokas сказал:

Не вижу, где там показывает сразу у нескольких документов.

 

Попробовал способ через колонку "Число страниц" на MS Office 2019, Windows 10 x64,

система корректно показывает кол-во страниц только у документов, созданных этим же Office 2019 (как doc, так и docx),

у других doc, например, созданных в Office 2003, показывает всегда число 1.

А еще часто бывают rtf, там вообще не отображается.

 

Попробовал способ через vbs, считает долго (т.к. открывает в скрытом виде каждый документ), но посчитало правильно.

Для docx тебе ничего исправлять в скрипте не надо, т.к. во первых проверяются только первые 3 буквы после последней точки в имени файла,

во-вторых, документ открывается точно также как и doc, не смотря на другую его структуру, ведь скрипт берёт значение от самого Word-а,

не анализируя внутренности файла самостоятельно.

 

Сделал обобщённый вариант vbs, с подсчетом раздельно и в сумме DOC*, XLS*, RTF со сканом рекурсивно (с подкаталогами):

 

Dim numXDocs, sumXSheets, sumXPages, numWDocs, sumWPages

set oExcel = CreateObject("excel.application")
set oWord = CreateObject("word.application")
set root = CreateObject("scripting.filesystemobject").getfile(wscript.scriptfullname).parentfolder
Analysis(root)

oExcel.Quit: oWord.Quit
set oExcel = Nothing: set oWord = Nothing: set root = Nothing

wscript.echo _
	"DOC*, RTF:" & Chr(13) & _
	"Всего страниц: " & sumWPages & Chr(13) & "Документов: " & numWDocs & _
	Chr(13) & Chr(13) & "XLS*" & Chr(13) & _
	"Всего страниц: " & sumXPages & Chr(13) & "Всего листов: " & sumXSheets & Chr(13) & "Документов: " & numXDocs & _
	Chr(13) & Chr(13) & "-----------------" & Chr(13) & "Общее:" & Chr(13) & Chr(13) & _
	"Страниц: " & sumXPages + sumWPages & Chr(13) & "Документов: " & numXDocs + numWDocs
	
Sub Analysis(root)

	With oExcel
	  For Each x In root.Files
		If LCase(Mid(x.Name, InStrRev(x.Name, ".") + 1, 3)) = "xls" Then
		  With .workbooks.open(x.Path, , True) 'ReadOnly
			numXDocs = numXDocs + 1
			sumXSheets = sumXSheets + .sheets.count
			For Each sheet in .sheets
			  sumXPages = sumXPages + (sheet.HPageBreaks.Count + 1) * (sheet.VPageBreaks.Count + 1)
			Next
			.Close False 'don't save changes
		  End With
		End If
	  Next
	  .Quit
	End With
	
	With oWord
	  For Each x In root.Files
	    ext = LCase(Mid(x.Name, InStrRev(x.Name, ".") + 1, 3))
		if ext = "doc" or ext = "rtf" then
          With .documents.open(x.Path, , True) 'ReadOnly
            numWDocs = numWDocs + 1
            sumWPages = sumWPages + .Content.ComputeStatistics(2) 'wdStatisticPages
            .Close False 'don't save changes
          End With
		end if
	  Next
    End With

	For Each x in root.SubFolders: Analysis(x): Next

End Sub

 

Показать  

Drakokas, спасибо тебе большущее! Твой скрипт меня очень выручил. Случайно наткнулся на этот форум, когда гуглил способ подсчёта страниц огромного пакета документов. В моём случае вышло 113238 страниц. Как бы я считал это вручную - хз.

Ссылка на комментарий
Поделиться на другие сайты

Пожалуйста, войдите, чтобы комментировать

Вы сможете оставить комментарий после входа в



Войти
  • Похожий контент

    • Gistap
      Автор Gistap
      Здравствуйте. Виндовс 11. При запуске таймера на автоматическое выключение  через - выполнить, (shutdown -s -t 4000) мелькает окошко терминала и ничего не происходит. В чём проблема? Причём если поставить таймер на 10 секунд, то он его вырубит.
        CollectionLog-2025.03.11-16.27.zip
    • SOL.
      Автор SOL.
      пицот

    • ska79
      Автор ska79
      Не работают кнопки страниц в магазине. Если навести курсор и кликнуть. Если открыть в новой вкладке посредством ПКМ на кнопке. то открывается

    • BeckOs
      Автор BeckOs
      На компьютере зашифрованы все файлы. Атака была ночью 
      FRST.txt files.7z
    • Taker1993
      Автор Taker1993
      Добрый день. Борюсь с этим майнером уже приличное время, пробовал разные антивирусы и думал что он пропал, так как используя несколько разных антивирусов от основной части майнера я вроде избавился, но заметил ещё тогда что много ошибок в системе 0xc0000017 при исполнении команд dism в командной строке (которую я вчера исправил), при обновлении всех компонентов windows и т.п. (пробовал откатывать удаляя по гайдам папку с апдейтами используя утилиты для активации обнов - но безрезультатно), также есть ошибка с безопасностью, в начале была проблема с целостностью ядра и я удалил два мешающих файла исправив проблему, но ошибка с этим так до конца и  не решилась и он пишет про отсутствие TPM - а конкретно NET HELPMSG 2182 Problem with BITS; также есть проблема с невозможностью запуска диспетчера устройств и других подобных окон и некоторых команд в комбинации Win+R. Почему я думал, что избавился от майнера полностью: грузить систему перестало на постоянке и сильных нагрузок не было, а с остальным думал уже ничего не сделаешь и нужно переустанавливать Windows, оставил на потом, так как есть немало сторонних лицензионных программ,, которые шли вместе с ноутбуком и я боялся к ним потерять доступ, ну и так как не было точек восстановления и если даже они были я не могу к ним получить доступ, а оказывается всё-таки нет майнер на месте.
      Несколько месяцев спустя заметил, а конкретно вчера: что изменилась возможность администрирования и я не могу получить доступ к системным файлам, не мог удалить, изменять, переименовывать файлы которые вызывали нарушение целостности ядра (xusb21.sys и STTub30.sys), но по итогу через стороннюю утилиту я их удалил (один из них STTub30.sys я потом воcстановил найдя на github). Вернул также сегодня в ночь через реестр доступ к DISM и сделал успешный запуск и восстановление по команде Dism /Online /Cleanup-Image /RestoreHealth, а SFC и прежде работала, но это ничего не поменяло; вообще все последние именно операции делал по одному гайду и там после восстановления DISM советовали воспользоваться Farbar Recovery Scan Tool 64-бит, но наткнулся поздновато и это не помогло, так как нужен составленный fixlist.txt, да и Fabar раз 6 выдал ошибку при сканировании bcdedit.exe (в процессе написания текста сделал повторное сканирование c Fabar и ошибок было уже штуки 3-4 bcdedit.exe, а результаты этого сканирования прикрепил в качестве файлов Addition.txt и FRST.txt вдруг пригодятся).
      Сегодня заметил, что даже с включённым лицензионным Касперычем майнер снова поменял и ограничил что-то там в брандмауэре Windows - было уведомление (понимаю, что он уже давно в исключениях, но всё же). Ни Kaspersky Virus Removal Tool, ни Dr.Web Cruelt! ни нашли ничего, вероятно майнер добавил их уже в исключения, так как при удалении основных компонентов майнера я уже пользовался ими раньше, но до этого я пользовался AV block Remover и он удалял майнер, но спустя время он появляется снова. 
      Был бы очень рад если бы получилось решить данную проблему, Windows лицензионный шедший вместе с ноутом переустанавливать всё же не хочется и я не уверен что и там не будет ошибок в процессе.
      Заранее всем откликвнушимся большое спасибо и с пасхой!
      CollectionLog-2025.04.20-14.19.zip Addition.txt FRST.txt
×
×
  • Создать...