OpenXML SDK - Преобразование C # в C ++ / CLI - PullRequest
2 голосов
/ 03 мая 2011

У меня есть код C # для создания документа, я хочу написать то же самое на C ++ / CLI.

private void HelloWorld(string documentFileName) 
{
    // Create a Wordprocessing document. 
    using (WordprocessingDocument myDoc =
           WordprocessingDocument.Create(documentFileName, 
               WordprocessingDocumentType.Document)) 
    { 
        // Add a new main document part. 
        MainDocumentPart mainPart = myDoc.AddMainDocumentPart(); 
        //Create Document tree for simple document. 
        mainPart.Document = new Document(); 
        //Create Body (this element contains
        //other elements that we want to include 
        Body body = new Body(); 
        //Create paragraph 
        Paragraph paragraph = new Paragraph(); 
        Run run_paragraph = new Run(); 
        // we want to put that text into the output document 
        Text text_paragraph = new Text("Hello World!"); 
        //Append elements appropriately. 
        run_paragraph.Append(text_paragraph); 
        paragraph.Append(run_paragraph); 
        body.Append(paragraph); 
        mainPart.Document.Append(body); 
        // Save changes to the main document part. 
        mainPart.Document.Save(); 
    } 
}

Также, пожалуйста, предложите мне любые ссылки, где я могу найти пример C ++ / CLI для OpenXML SDK

Ответы [ 4 ]

3 голосов
/ 03 мая 2011

Вот прямой перевод:

private:
    void HelloWorld(String^ documentFileName)
    {
        msclr::auto_handle<WordprocessingDocument> myDoc(
            WordprocessingDocument::Create(
                documentFileName, WordprocessingDocumentType::Document
            )
        );
        MainDocumentPart^ mainPart = myDoc->AddMainDocumentPart();
        mainPart->Document = gcnew Document;
        Body^ body = gcnew Body;
        Paragraph^ paragraph = gcnew Paragraph;
        Run^ run_paragraph = gcnew Run;
        Text^ text_paragraph = gcnew Text(L"Hello World!");
        run_paragraph->Append(text_paragraph);
        paragraph->Append(run_paragraph);
        body->Append(paragraph);
        mainPart->Document->Append(body);
        mainPart->Document->Save();
    }

msclr::auto_handle<> обычно следует считать более идиоматическим, чем try..finally, так же как std::shared_ptr<> и std::unique_ptr<> в C ++.

2 голосов
/ 03 мая 2011

Я так понимаю, вы что-то пробовали? У меня нет доступа к компилятору

http://en.wikipedia.org/wiki/C%2B%2B/CLI должны начать работу.

Если вас интересует перевод конструкции using (хороший вопрос, если бы вы ее задали!), Я предлагаю что-то вроде следующего (обратите внимание на try {} finally { delete ... } idom)

private:

void HelloWorld(String^ documentFileName) 
{ 
    // Create a Wordprocessing document. 
    WordprocessingDocument ^myDoc = WordprocessingDocument::Create(documentFileName, WordprocessingDocumentType::Document);
    try
    {
        // Add a new main document part. 
        MainDocumentPart mainPart = myDoc::AddMainDocumentPart(); 
        //Create Document tree for simple document. 
        mainPart->Document = gcnew Document(); 
        //Create Body (this element contains
        //other elements that we want to include 
        Body body = gcnew Body(); 
        //Create paragraph 
        Paragraph paragraph = gcnew Paragraph(); 
        Run run_paragraph = gcnew Run(); 
        // we want to put that text into the output document 
        Text text_paragraph = gcnew Text("Hello World!"); 
        //Append elements appropriately. 
        run_paragraph->Append(text_paragraph); 
        paragraph->Append(run_paragraph); 
        body->Append(paragraph); 
        mainPart->Document->Append(body); 
        // Save changes to the main document part. 
        mainPart->Document->Save(); 
    } finally
    {
        delete myDoc;
    }   
}

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

1 голос
/ 03 мая 2011

Синтаксис в основном тот же. «new» необходимо заменить на gcnew, «.» by -> (например, body.Append (параграф) будет body-> Append (параграф). Сложной частью будет директива using. Чтобы сделать это способом C ++, вам нужен какой-то умный указатель, который «удаляет» объект в конце блока (с удалением означает вызов интерфейса IDisposable) - это называется RAII.

1 голос
/ 03 мая 2011
...