На главную Наши проекты:
Журнал   ·   Discuz!ML   ·   Wiki   ·   DRKB   ·   Помощь проекту
ПРАВИЛА FAQ Помощь Участники Календарь Избранное RSS
msm.ru
[!] Как относитесь к модерированию на этом форуме? Выскажите свое мнение здесь
Модераторы: Qraizer
  
> Работа с документами doc и docx без NET
    Хочу сделать программу в Visual C++ для работы с документами doc и docx без Net (поиск в таблицах и во всем документе, запись в файл нужной информации). С помощью каких средств это можно сделать?
      Цитата tumanovalex @
      Хочу сделать программу в Visual C++ для работы с документами doc и docx без Net (поиск в таблицах и во всем документе, запись в файл нужной информации)

      Чем шарп не понравился? Что то мне подсказывает, раз вы задаёте такой вопрос - то решить это в плюсах у вас вряд ли получится :unsure:

      Почему бы с таким вопросом не погуглить сначала, например тут и тут?
        VB6 - лучший язык для работы с DOC/DOCS. Пиши программу в ВБ6.
        А если оцень хочетцс использовать C++, то на ВБ6 напиши COM DLL, а оболочку напиши на C++.

        Добавлено
        Цитата
        Чем шарп не понравился?

        В шарпе с DOC файлами работать намного тяжелее, чем в VB6.

        Добавлено
        На ВБ6 и код писать не надо. Записал макрос в DOC. Почистил код макроса. Скопировал код в свой ВБ6 проект.
        Профит!
          Если просто без .NET, то может подойти MFC, например. Можно также поискать сторонние готовые библиотеки. У меня как-то стояла задача создать лицензионно чистую тулзу на бесплатных средствах разработки, был выбран Visual Studio Express... кажись, 2015-ый, не точно помню, и WinAPI. Написана несложная библиотека классов, и вышло что-то типа как тут. Там довольно просто всё, окаймляются Application, Property и Method без контроля типов, но с корректным подсчётом ссылок на COM-интерфейсы и абстракцией над VARIANT, так что мне хватило. Могу скинуть сырцы. В планах ещё было насоздавать на базе Property всяких там производных Paragraph, Selection etc, чтобы получить контроль типов, но забил. Если будет желание насоздавать сможешь и сам.
            Посоны! Походу вы издеваетесь?!!!
            Я на Perl'е посредством OLE решал кучу задач с Икселем.
            Просто уверен на 143% что можно сделать заявленное в связке C++ && OLE.
              Цитата VisualProg @
              Чем шарп не понравился? Что то мне подсказывает, раз вы задаёте такой вопрос - то решить это в плюсах у вас вряд ли получится

              В C# у меня получилось находить нужные строки в документах doc и docx. Хотел бы сравнить сложность и скорость решения этой задачи в C# и C++. Кроме того, в последнее время чаще пользуюсь C#, не хочу совсем забыть C++.

              Добавлено
              Цитата Qraizer @
              Если просто без .NET, то может подойти MFC, например. Можно также поискать сторонние готовые библиотеки. У меня как-то стояла задача создать лицензионно чистую тулзу на бесплатных средствах разработки, был выбран Visual Studio Express... кажись, 2015-ый, не точно помню, и WinAPI. Написана несложная библиотека классов, и вышло что-то типа как тут. Там довольно просто всё, окаймляются Application, Property и Method без контроля типов, но с корректным подсчётом ссылок на COM-интерфейсы и абстракцией над VARIANT, так что мне хватило. Могу скинуть сырцы. В планах ещё было насоздавать на базе Property всяких там производных Paragraph, Selection etc, чтобы получить контроль типов, но забил. Если будет желание насоздавать сможешь и сам.

              С MFC у меня не получилось разобраться, показалось очень сложно и непонятно. С WinAPI как-то работал, серьезных проблем не было. Скиньте, пожалуйста, исходники Вашего решения.
                Как-то так. Следует учесть, что office-приложения лучше запускать без видимого окна, кроме разве что во время отладки, т.к. производительность выше на порядок, однако в этом случае, если твоё приложение будет прервано насильственным образом, office останется висеть в памяти без окон. Прибить можно будет только из таск-менеджера. Если запускать с окнами, то прибить можно будет и штатно. Для консольных приложений желательно обрабатывать Ctrl-C, для чего в utils.h/.cpp уже есть необходимый функционал, для GUIных, возможно, аналогичный придётся написать самому.
                Прикреплённый файлПрикреплённый файлoleAuto.zip (9,92 Кбайт, скачиваний: 133)
                Решишь использовать и будут вопросы если, задавай. Всё-таки отдельную самодостаточную либу я писать не намеревался, так что с документированием там не очень.

                P.S. В utils можно найти лишнее, не относящееся к OLE AUTO, но нужное моему целевому приложению. Не обращая внимания или даже удали, если оно тебе не потребуется.

                Добавлено
                P.P.S. Абстракция над VARIANT не полна, реализовано только для тех типов, которые мне понадобились. Дописать самому, ежели вдруг, труда составить не должно.

                Добавлено
                Примерный сценарий использования можно посмотреть выше там по ссылке. Примерный консольный main() вот:
                ExpandedWrap disabled
                  int main(int argc, char *argv[])
                  {
                    setlocale(LC_ALL, "rus");     // правила преобразования русских имён файлов
                   
                    quit    = CreateEvent(NULL, TRUE, FALSE, NULL);       // события для отработки
                    confirm = CreateEvent(NULL, TRUE, FALSE, NULL);       // Ctrl-C и Ctrl-Break
                   
                    if (quit != NULL && confirm != NULL) SetConsoleCtrlHandler(BreakHandler, true);
                   
                    try
                    {
                      OLE      ole;               // Инициализировать OLE
                      WordApp  MSWord;            // Запустить Word
                      ExcelApp MSExcel;           // Запустить Excel
                   
                      if (shouldVisible()) MSWord.SetVal(L"Visible", L"True"), MSExcel.SetVal(L"Visible", L"True");
                   
                      processDocs(MSWord);
                      processSheets(MSExcel);
                    }
                    catch(break_event&)
                    {
                      // Просто выход. Деструкторы сами всё сделают.
                    }
                    catch(const COM_Error& exc)
                    {
                      std::cerr << exc.what() << ": " << exc.why() << " ("
                                << std::hex << std::uppercase << exc.why() << ')' << std::endl;
                      return EXIT_FAILURE;
                    }
                    catch(const std::runtime_error& exc)
                    {
                      std::cerr << exc.what() << std::endl;
                      return EXIT_FAILURE;
                    }
                    CloseHandle(quit);
                    SetEvent(confirm);
                   
                    return EXIT_SUCCESS;
                  }
                  Спасибо большое! Буду разбираться. А вопросы задавать лучше с помощью PM или в отдельной теме?
                    М-м-м... Сырцы тут, могут пригодиться ещё кому-то... лучше не в ПМ. И – да, лучше в отдельной теме, а тут пусть продолжается общее обсуждение изначального вопроса.

                    Добавлено
                    Ах да, забыл совсем. Там где-то в тулзе есть ещё такая функция:
                    ExpandedWrap disabled
                      /* Проверка на Ctrl-C и Ctrl-Break.
                         События отлавливаются в BreakHandler(), которая выставляет событие quit, здесь
                         проверяется наличие этого события, и при его наличии оно переводится в исключение.
                      */
                      static void CheckBreak()
                      {
                        if (WaitForSingleObject(quit, 0) == WAIT_OBJECT_0) throw break_event();
                      }
                    которая проверяет запрос на прерывание по Ctrl-C, взводимый BreakHandler()-ом, и её надо периодически вызывать. У меня это было в цикле парсинга параграфов в документах и колонок в таблицах книг.
                      Понял, спасибо.
                        Windows 10, Visual Studio 2012. По причине своего слабого знания C++ разобраться в исходниках Qraizer я не смог. Я попробовал разобраться с управлением Word, создав пустое консольное приложение, взяв за основу проект https://www.codeproject.com/Articles/34998/...omation-Using-C, но при этом решил не использовать созданные в этом проекте классы и обертки для функций COM. Вроде бы идеология понятна, но возникли следующие вопросы:
                        1. Какой параметр в Invoke в функции SetVisible я неправильно задал?
                        2. Как определить в отладчике, в каком из параметров Invoke возникает ошибка и какое значение параметра неправильное?
                        3. Как правильно выводить сообщение об ошибках при использовании функции Invoke в программе? Я попытался использовать
                        cout << excepinfo.bstrDescription << endl;
                        но выводится числовое значение.
                        4. Как определить, какие значения при вызове различных методов и установке (чтении) свойств нужно задавать в параметрах Invoke (в DISPPARAMS dp, VARIANT x и других) для вызова определенного метода или свойства (например, открытие документа, поиск строки во всем тексте документа, выделение таблиц, поиск строки в определенной колонке таблицы)? Это можно узнать из какого-то заголовочного файла или в каком-то разделе документации Microsoft?
                        В сообщении не привожу текст программы (она получилось большой), прикрепил проект.
                        Прикреплённый файлПрикреплённый файлCppWord.zip (4,03 Кбайт, скачиваний: 122)
                          Цитата tumanovalex @
                          По причине своего слабого знания C++ разобраться в исходниках Qraizer я не смог.
                          А зачем разбираться-то? Примеров достаточно, чтобы понять, как использовать. Разбираться – это если что-то пошло не так или нужно что-то подправить/дополнить.
                            Попробую использовать без полного понимания, если будут вопросы, буду задавать в отдельной теме
                              Должно получиться. Ты ж, в конце концов, не изучал исходники офисных интерфейсов .NET, когда на C# искал строки в документах. Разница лишь в том, что там тебе были даны готовые бинарники, а тут нет. Ну так разница невелика: подключаешь в проект вместо библиотеки её сырцы.
                                Спасибо, я тоже надеюсь, что получится. Хотя, учитывая мои "знания" C++, наверняка не сразу.
                                0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)
                                0 пользователей:


                                Рейтинг@Mail.ru
                                [ Script execution time: 0,0403 ]   [ 20 queries used ]   [ Generated: 28.03.24, 22:24 GMT ]