Re: прочитать содержание 3 объектов ворда | |
---|---|
of63 Сообщений: 25256 Откуда: Н.Новгород Дата регистрации: 13.02.2008 |
> так как там нет смысловых тегов
Так просто обычно не бывает ) Но вот триггерный механизм - ждем (среди шума тэгов) последовательность поступления только вот этих тэгов: (по хорошему надо заталкивать тэги в стек, и выталкивать при приеме завершающего тэга, совпадающего с верхушкой стека, а может будет детектироваться и просто просто ловлей указанной последовательности... Только сбрасывать детектор при поступлении сигнала <w:p и <\w:p чтобы как-то синхронизироваться с целевым сигналом). Ниже ловимая последовательность, некоторые можно не ловить, но <v:shape - обязательно - это собственно шейп - w:p (блок с шейпом, и наименованием) - w:r (тэг с текстом шейпа) - w:pict - v:shape (собственно шейп) - v:textbox (причем с текстом) - v:txbxContent - w:p - w:r - w:t содержит "Умная Василиса Премудрая" - (завершающие тэги) - w:r - w:t содержит "Фамилия, Имя, Отчество_____________________________________________________________________________________________________" ... кстати, он с каким-то особенным атрибутом xml:space="preserve" ... - (завершающие тэги) - \w:p (конц блока с шейпом и наименованием) Доб. Видно, что некоторые тэги повторяются, поэтому на каждое имя тэга заведем счетчики. Все счетчики сбрасываются по сигналу синхронизации (первый тэг чтобы узнавать который из них первый, счетчик тэгов w:p надо декрементировать на тэге \w:p тогда тэг w:p при состоянии счетчика 0 и будет "первый". Остальные счетчики, например, тэгов w:t, можно упростить, а именно считать только начальные тэги, тогда: - w:t первый - содержит "Умная Василиса Премудрая" - w:t второй - содержит "Фамилия, Имя, Отчество_____________________________________________________________________________________________________" Надеюсь, не слишком путано обьяснил. Так строятся микропрограммы (для т.н. сигнальных процессоров), из элементарных соображений, в соответствии с видом сигнала, элементарными аппаратными средствами (только счетчики, и сравнители в данном случае). И на фоксе можно писать микропрограммы, Исправлено 3 раз(а). Последнее : of63, 11.05.17 20:21 |
Re: прочитать содержание 3 объектов ворда | |
---|---|
Igor Korolyov Автор Сообщений: 34580 Дата регистрации: 28.05.2002 |
Владимир, скажу по простому. Фокс для такой задачи просто не самый подходящий инструмент (даже если нарисовать всё то о чём пишет Олег - а это уйма ненужных буковок программного кода). Равно как и доступ к документу через OLE ворда - далеко не лучший вариант. Я взял приложенный документ из первого сообщения и в ворде просто "размножил" его на 4000 страниц (это даёт 28000 шейпов). docx занимает 640Кб, document.xml внутри "весит" примерно 29Мб. Мой несчастный ворд просто открывает такой документ с минуту (CPU time в таскменеджере), и кушает порядка 300Мб памяти... Я никогда не писал ручных парсеров для такого рода XML файлов, и вообще ни разу "программно" не разбирал docx файлы. Но тем не менее за пару часов при помощи гугла и толики здравого смысла написал следующий код (скомпилировано под 4-й .net framework): Я не вижу в нём ничего "ужасно сложного". Если убрать служебные конструкции, то "основа" это 10-15 достаточно прямолинейных, даже можно сказать "примитивных" строк кода. Эта программка отрабатывает вышеописанный "тяжёлый" docx файл (естественно не "распаковывая" его предварительно никуда - т.е. прямо на лету вынимая нужные части из архива) за время меньшее 500мс - т.е. за ПОЛ СЕКУНДЫ. Потребляя при этом, согласно профилировщику, около 20Мб памяти (ну да, дотнет достаточно прожорлив до памяти даже в Hello World приложении), и генерируя на выходе 530Кб текстового файла с содержимым этих самых 28000 шейпов. Я даже заморочился на извлечение "сложно форматированного текста" - когда внутри шейпа будет текст с переносами (т.е. разные абзацы-параграфы в терминологии ворда) и/или форматированием. Конечно же сделал это максимально примитивно - просто сцепляя все элементы в одну строку... Для полноты статистики - полученный exe файл "весит" 7680 байт. Я ни к чему не призываю, просто ещё раз повторюсь - следует искать для решения задачи подходящий инструмент, а не пытаться кувалдой "англицкую блоху" подковать. ------------------ WBR, Igor |
Re: прочитать содержание 3 объектов ворда | |
---|---|
of63 Сообщений: 25256 Откуда: Н.Новгород Дата регистрации: 13.02.2008 |
> Я не вижу в нём ничего "ужасно сложного". Если убрать служебные конструкции, то "основа" это 10-15 достаточно прямолинейных, даже можно сказать "примитивных" строк кода.
XmlReader.Create(documentPart.GetStream())) Синтаксис непонятен (То, что в конторе МС ХМЛ разбирают без встроенного общедоступного средства - это верю Доб. Что оно возвращает (оно ничего не возвращает). И что делает? Исправлено 1 раз(а). Последнее : of63, 12.05.17 00:43 |
Re: прочитать содержание 3 объектов ворда | |
---|---|
Igor Korolyov Автор Сообщений: 34580 Дата регистрации: 28.05.2002 |
Ну, это кому как. Мне лично всё понятно Статический метод - чем-то похож на фоксовую "отдельноживущую" процедуру/функцию.
Впрочем, хозяин-барин. Можно и дальше прятать голову в песок аки страус Цитата:Возвращает - ссылку на объект XMLReader. Делает - ну этот самый объект что возвращает и "делает". Это "фабричный" метод. ------------------ WBR, Igor Исправлено 1 раз(а). Последнее : Igor Korolyov, 12.05.17 00:49 |
Re: прочитать содержание 3 объектов ворда | |
---|---|
of63 Сообщений: 25256 Откуда: Н.Новгород Дата регистрации: 13.02.2008 |
...если оно возвращает (что?), то вроде должен быть оператор = ... Может я неверно списал с исходного текста...
Доб. Что вы называете "фабрика" ? (почитаю в интернете) Доб2. Игорь, шейпы прочитаны... Владимир и так их читал при помощи ворда, это не проблема. В программе на шарпе не потеряна связь шейп-заголовок?: - "Умная Василиса Премудрая" - шейп - "Фамилия, Имя, Отчество_____________________________________________________________________________________________________" - заголовок шейпа Исправлено 2 раз(а). Последнее : of63, 12.05.17 08:48 |
Re: прочитать содержание 3 объектов ворда | |
---|---|
Simple777 Сообщений: 33855 Дата регистрации: 05.11.2006 |
К кому вопрос - к AdamAry? |
Re: прочитать содержание 3 объектов ворда | |
---|---|
boba Сообщений: 6269 Откуда: Медвежьи озера- Дата регистрации: 26.03.2001 |
system.io.pakages
vs 2015 сборки у себя на компе нигде не обнаружил Без этого use с таким содержанием просит добавить ссылку, иначе сборка проекта не идет |
Re: прочитать содержание 3 объектов ворда | |
---|---|
Igor Korolyov Автор Сообщений: 34580 Дата регистрации: 28.05.2002 |
system.io.pakages находится в WindowsBase.dll
Он там есть
Никакой связи с текстом нет и быть не может, т.к. это совершенно независимые сущности. Это НЕ заголовок шейпа, это просто текст, поверх которого весьма хаотически размещены шейпы. В ворде, кстати, тоже никакой связи соорудить не получится. Да и какая может быть связь, если над одним параграфом нарисованы два разных шейпа Шейпы на то и шейпы что плавают где хотят, и к тексту не привязаны. Впрочем, если документ генерирует софт, то скорее всего можно просто определить "шаблон повторяемости" - через сколько шейпов будут повторяться искомые. Ну или, если уж совсем всё плохо, вынимать координаты шейпов (может быть все "ФИО" на определённом расстоянии от левого края листа находятся). Никакой другой связи с "прочим текстом" я не вижу. В любом случае я писал не решение для задачи Владимира, а простой тест - показать насколько быстро можно разбирать "xml из docx файлов". ------------------ WBR, Igor |
Re: прочитать содержание 3 объектов ворда | |
---|---|
of63 Сообщений: 25256 Откуда: Н.Новгород Дата регистрации: 13.02.2008 |
В тексте файла XML шейпы состоят в группе (в тэге w:p) вместе с текстами (w:t), например "ФИО" и шейп с "Умная Василиса" в одном тэге. Я подумал, может это что-то означает. В ворде связи шейпа и текста не нашел, хотя в интернете пишут про какие-то группы...
|
Re: прочитать содержание 3 объектов ворда | |
---|---|
Igor Korolyov Автор Сообщений: 34580 Дата регистрации: 28.05.2002 |
Может и состоят - это, видимо, от настроек "обтекания" и "привязки" зависит (типа где "якорёк" нарисован, в то <p> и будет шейп вложен в xml-файле). Я пока баловался, так они так поразъезжались, что никакой связи и не осталось
Если на это опираться, ну можно начать разбор с <p> (абзацев) верхнего уровня (т.к. внутри самих шейпов тоже есть свои абзацы - в примере по одному короткому абзацу, но может то быть хоть целый роман ). Не имея "настоящего" файла (а точнее нескольких разных файлов, т.к. вероятно там есть различия) даже не предположу на что стоит опираться. М.б. вообще на размер (ширину и высоту) каждого шейпа Или даже на их шрифт... ------------------ WBR, Igor |
Re: прочитать содержание 3 объектов ворда | |
---|---|
Гулин Федор Сообщений: 4640 Откуда: Минск Дата регистрации: 24.10.2002 |
Игорю РЕСПЕКТ как обычно
было бы время сам бы глянул правильно я понял что это нельзя засунуть в VFP Как вызовы com объекта Word потому что это сидит в using System.IO.Packaging; using System.Xml;
зы я вот такие фичи в ворде делал черзе поля (F9) так что каждый придумывает что хочет но у меня больше было ексел. шаблонов а там есть именованные ячейки |
Re: прочитать содержание 3 объектов ворда | |
---|---|
Igor Korolyov Автор Сообщений: 34580 Дата регистрации: 28.05.2002 |
Почему ж нельзя? Оформляй данный код как ком-сервер (утилитой regasm регистрируй), или используй wwDotNetBridge и вперёд. Только смысл?
------------------ WBR, Igor |
© 2000-2024 Fox Club  |