Компьютерный форум OSzone.net  

Компьютерный форум OSzone.net (http://forum.oszone.net/index.php)
-   Программирование и базы данных (http://forum.oszone.net/forumdisplay.php?f=21)
-   -   [решено] свойства *.dwg файла в документ Word (http://forum.oszone.net/showthread.php?t=242935)

Sta1917 18-09-2012 20:55 1991061

свойства *.dwg файла в документ Word
 
Здравствуйте, помогите пожалуйста с решением следующей задачи: в папке есть Паспорт.doc и Название_файла.dwg (единственный *.dwg в директории) , в паспорте нужно отобразить тремя полями: дату и время последнего изменения (до секунд), полный объем в байтах (размер, а не на "диске") и название файла *.dwg. Нашел макрос но только для экселя
К сожалению связка word-exсel не подходит.

Iska 18-09-2012 22:02 1991120

Sta1917, выложите образец файла «Паспорт.doc», в котором будет указано, куда конкретно нужно поместить:
Цитата:

Цитата Sta1917
тремя полями: дату и время последнего изменения (до секунд), полный объем в байтах »

Как это должно работать — заполнять «поля» в момент открытия документа или как иначе?

Sta1917 18-09-2012 22:09 1991125

В момент открытия, т.е. в word должны быть последние данные об изменениях.

Iska 18-09-2012 23:44 1991184

Sta1917, не хотите выкладывать — дело Ваше.

Вот Вам код:
читать дальше »
Код:

Option Explicit

Private Sub Document_Open()
    Dim objRange As Range
    Dim objFSO As Object
    Dim objFile As Object
   
    Set objFSO = CreateObject("Scripting.FileSystemObject")
   
    With ThisDocument
        If .Bookmarks.Exists("_DwgProp") Then
            With .Bookmarks.Item("_DwgProp").Range
                .Expand Unit:=wdTable
                .Tables.Item(1).Delete
            End With
        End If
       
        Set objRange = .Content
        objRange.Collapse Direction:=wdCollapseStart
       
        With .Tables.Add(Range:=objRange, NumRows:=3, NumColumns:=2)
            .Cell(1, 1).Range.Text = "Название файла"
            .Cell(2, 1).Range.Text = "Дата и время последнего изменения"
            .Cell(3, 1).Range.Text = "Объем файла"
           
            For Each objFile In objFSO.GetFolder(.Parent.Path).Files
                If UCase(objFSO.GetExtensionName(objFile.Name)) = UCase("dwg") Then
                    .Cell(1, 2).Range.Text = objFile.Name
                    .Cell(2, 2).Range.Text = CStr(objFile.DateLastModified)
                    .Cell(3, 2).Range.Text = CStr(objFile.Size)
                   
                    Exit For
                End If
            Next objFile
           
            Set objRange = .Range
        End With
       
        .Bookmarks.Add Name:="_DwgProp", Range:=objRange
       
        Set objRange = Nothing
    End With
   
    Set objFSO = Nothing
End Sub


Добавляйте его в модуль «ThisDocument» Вашего документа «Паспорт.doc» и правьте по собственному усмотрению.

Sta1917 19-09-2012 00:36 1991211

Спасибо, за внимание к вопросу. Не думал что там все так сложно. Завтра с работы принесу - выложу.

Iska 19-09-2012 01:39 1991228

Sta1917, опробовать можете и сейчас, создав рядом с документом, в который Вы поместите код, любой файл с расширением «.dwg».

Sta1917 19-09-2012 22:58 1991779

Работает как надо, только:
1. можно чтобы данные оставались, если в папке нет dwg, или преобразовать макрос в текст;
2. убрать расширение файла (см. вложение)?

Iska 20-09-2012 06:44 1991863

Sta1917, появился ряд вопросов:

1. Вы создаёте этот документ сами?
2. Если 1 — «да», то: этот документ основан на каком-то шаблоне или Вы просто создаёте новые копированием старого документа в новый?
3. Если 1 — «да», то: какова дальнейшая судьба документа: только распечатать или он как-то участвует в электронном документообороте и в дальнейшем?

4. Стоит ли сделать заполнение строк таблицы №2 данными по всем найденным файлам *.dwg в том же каталоге документа, а не только данными первого найденного файла *.dwg?

Судя по заголовку таблицы №2, мы делаем заполнение следующих столбцов:
  • Полное название формата
  • Директория
  • Файлы
  • Расширения
  • Дата и время последнего обновления
  • Размер (в байтах)

5. «Полное название формата» — скажите, какой текст у Вас отображается в Проводнике в режиме \Вид\Таблица в столбце «Тип» для файлов *.dwg?
6. «Директория» — что здесь должно быть? Имя родительской папки, в которой находится документ (без полного пути)?
7. Отчего в примере в «Размер (в байтах)» между разрядами мегабайт и килобайт использован неразрывный пробел, а между разрядами килобайт и байт — обычный пробел?

Цитата:

Цитата Sta1917
или преобразовать макрос в текст; »

Ваш Вопрос не понятен. Уточните.

Sta1917 22-09-2012 19:23 1993183

1-3. Документ получается копированием старого, с последующей печатью и передачей заказчику (Папки с паспортом и *.dwg). В СЭД не участвует.
4. Стоит, оказывается мне всегда попадались частные случаи с одним файлом. В основном нужно как в прикрепленном файле, с вложенными папками.
5. Тип элементов "файл DWG", вы правы, не очень корректная формулировка, но пусть будет такой.
6. Да.
7. Это не принципиально, видимо чтобы не мегабайты не сползали.
Цитата:

Цитата Iska
Ваш Вопрос не понятен. Уточните. »

Вопрос снимается. Чтобы можно передать паспорт отдельно от *.dwg. Решил копированием текста.

Iska 23-09-2012 09:35 1993391

Вложений: 1
Цитата:

Цитата Sta1917
1-3. Документ получается копированием старого, с последующей печатью и передачей заказчику (Папки с паспортом и *.dwg). В СЭД не участвует. »

1. Так сам документ дальше Вас куда-то идёт или после распечатки его дальнейшая судьба не важна?
2. Есть ли возможность перейти на использование шаблона?

Цитата:

Цитата Sta1917
4. Стоит, оказывается мне всегда попадались частные случаи с одним файлом. В основном нужно как в прикрепленном файле, с вложенными папками. »

Ищем только в папках первого уровня? Не ищем ни в каталоге документа, ни в папках второго и более уровней — так?

Цитата:

Цитата Sta1917
Вопрос снимается. Чтобы можно передать паспорт отдельно от *.dwg. Решил копированием текста. »

А всё-таки, что?

Попробуйте такой шаблон: Файл 87881 (поместите его в «%AppData%\Microsoft\Шаблоны» или где у Вас хранятся личные шаблоны). После создания документа на его основе появится панель инструментов с единственной кнопкой.

Sta1917 24-09-2012 19:38 1994121

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

Цитата:

Цитата Iska
Ищем только в папках первого уровня? Не ищем ни в каталоге документа, ни в папках второго и более уровней — так? »

Да, только 1-го уровня. Можно сделать 2-ю кнопку, чтобы искал только в каталоге документа?

Цитата:

Цитата Iska
А всё-таки, что? »

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

Iska 24-09-2012 20:01 1994130

Цитата:

Цитата Sta1917
Да, только 1-го уровня. Можно сделать 2-ю кнопку, чтобы искал только в каталоге документа? »

Можно. Но есть встречное предложение: попробовать обойтись одной кнопкой.

Сначала ищем *.dwg-файлы в текущем каталоге (кстати, что в этом случае помещать в колонку «Директория»?). Если таковые найдены — заполняем таблицу и останавливаемся. Если в текущем каталоге таковые файлы отсутствуют — ищем в подкаталогах первого уровня. Так устроит? Можно в обратном порядке.

Цитата:

Цитата Sta1917
Некорректно выразился, попробую еще раз: … Шаблон работает как надо. »

Спасибо, ясно.

Sta1917 24-09-2012 20:13 1994140

Цитата:

Цитата Iska
Можно.. обойтись одной кнопкой. »

Можно.

Устроит, есть 1 из 2 случаев: либо в родительской папке, либо в подпапках 1-го уровня. Если *.dwg найден в текущем каталоге, в "Директория" писать название каталога. Порядок неважен.

Iska 24-09-2012 21:12 1994172

Вложений: 1
Sta1917, пробуйте: Файл 87930. Сначала ищем в каталоге документа, затем — во вложенных первого уровня.

Sta1917 24-09-2012 23:44 1994251

Все работает. Буду тестировать на практике. Огромное спасибо.

Iska 25-09-2012 01:35 1994276

Цитата:

Цитата Sta1917
Буду тестировать на практике. »

Отпишитесь по результатам практического применения: как показывает опыт, даже самые грандиозные воплощения резво рушатся под рутиной самых обычных дел. А уж про наше с Вами — и говорить нечего, наверняка найдутся упущенные моменты и неверно интерпретированные детали.

Sta1917 25-09-2012 01:49 1994285

Хорошо, но это дело не быстрое, не каждый день выпуск объектов=)

Iska 25-09-2012 02:31 1994300

Ничего страшного. Конференция помирать не собирается, а я подпишусь на эту тему.

Sta1917 25-09-2012 02:43 1994304

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

firstarey 05-06-2013 09:13 2162531

Iska, подскажите, как добавить вывод автора последних изменений ?

.Item(7).Range.Text = CStr(objFile.DateLastModified)

что тут должно быть ?:)

Iska 05-06-2013 11:29 2162631

Цитата:

Цитата firstarey
как добавить вывод автора последних изменений ? »

firstarey, нет такого свойства. Может быть просто «Автор».

Если а) данное свойство поддерживается документом и б) если Проводник имеет доступ к этому свойству, то можно попробовать.

Вот пример получения значения свойства:
читать дальше »
Код:

Option Explicit

WScript.Echo GetProperty("E:\Песочница\0264\марк.xlsx", "Автор")

WScript.Quit 0
'=============================================================================

'=============================================================================
Function GetProperty(strPath, strProperty)
        Dim objFile
       
        Dim objFolder
        Dim objFolderItem
       
        Dim intPropertyNumber
       
        With WScript.CreateObject("Scripting.FileSystemObject")
                If Not .FileExists(strPath) Then
                        WScript.Echo "Can't find file [" & strPath & "]."
                       
                        Exit Function
                End If
               
                Set objFile = .GetFile(strPath)
        End With
               
        With WScript.CreateObject("Shell.Application")
                Set objFolder = .NameSpace(objFile.ParentFolder.Path)
               
                If Not objFolder Is Nothing Then
                        Set objFolderItem = objFolder.ParseName(objFile.Name)
                       
                        If Not objFolderItem Is Nothing Then
                                intPropertyNumber = GetPropertyNumberByName(strProperty)
                               
                                If IsEmpty(intPropertyNumber) Then
                                        WScript.Echo "Can't find property name [" & strProperty & "]."
                                       
                                        Exit Function
                                End If
                               
                                GetProperty = objFolder.GetDetailsOf(objFolderItem, intPropertyNumber)
                        Else
                                WScript.Echo "Can't parse file name [" & objFile.Name & "]."
                        End If
                Else
                        WScript.Echo "Can't get folder [" & objFile.ParentFolder.Path & "]."
                End If
        End With
End Function
'=============================================================================

'=============================================================================
Function GetPropertyNumberByName(strProperty)
        Dim objFolder
        Dim i
       
        With WScript.CreateObject("Shell.Application")
                Set objFolder = .NameSpace("shell:System")
               
                If Not objFolder Is Nothing Then
                        For i = 0 To 2^8 - 1
                                If LCase(objFolder.GetDetailsOf(, i)) = LCase(strProperty) Then
                                        GetPropertyNumberByName = i
                                       
                                        Exit For
                                End If
                        Next
                End If
        End With
End Function
'=============================================================================


firstarey 05-06-2013 14:30 2162772

Iska, благодарю за ответ.
отчего то думал что авторство последних изменений сохраняется *pardon*

Iska 05-06-2013 16:26 2162816

firstarey, всё возможно — я этого попросту не знаю, поскольку у меня нет ни развёрнутого AutoCad'а, ни его «тёзок» (если речь по прежнему о документах формата dwg; если найдёте. что-таки есть — дайте знать, попробую почитать документацию на предмет доступа посредством Automation). Потому я привёл пример из доступных мне.

Sta1917 05-06-2013 17:20 2162849

Есть такое свойство, %<\AcVar LastSavedBy>% это данные для вставки в текст AutoCad
Как получить к нему доступ не знаю, но есть решения экспорта данных из открытого AutoCAD. Также это может быть полезным.

Iska 05-06-2013 17:57 2162871

Sta1917, понятно.

Теоретически, сделать можно. Но желания заниматься подсчётом смещений нет ни малейшего.

У Вас вообще что? Какой продукт установлен?

Sta1917 06-06-2013 03:00 2163051

Думаю лучше воспользоваться готовым решением экспорта в эксель с dwg.ru

Iska 06-06-2013 03:11 2163052

Воспользуйтесь.

firstarey 06-06-2013 08:42 2163088

Изначально полагалось что это расположено в свойствах файла, как например дата последнего изменения документа и, соответственно, возможно доработать предложенный в этой теме скрипт.

На данный момент остановился на том, что изменил предложенный Iska шаблон под свои нужды (полный путь до файла, имя, дата последнего изменения, последнего доступа, размер. не хватает лишь автора последнего изменения).

Раз уж все не так просто, то на том и остановимся, спасибо откликнувшимся.

Iska 06-06-2013 10:03 2163124

Цитата:

Цитата firstarey
Изначально полагалось что это расположено в свойствах файла, как например дата последнего изменения документа и, соответственно, возможно доработать предложенный в этой теме скрипт. »

Увы, нет. Это внутреннее свойство документа, и, судя по общедоступной информации, не транслируется Проводнику (кое-кто предлагает купить библиотеку, которая будет это делать).


Время: 07:43.

Время: 07:43.
© OSzone.net 2001-