Files
core/ASCOfficeRtfFile/OOXDocumentWriter.h

128 lines
4.3 KiB
C++

#pragma once
#include "stdafx.h"
#include "RtfDocument.h"
#include "OOXWriter.h"
#include "../Common/FileWriter.h"
class OOXDocumentWriter
{
private: OOXWriter& m_oWriter;
private: RtfDocument& m_oDocument;
private: NFileWriter::CBufferedFileWriter* m_oFileWriter;
private: bool m_bFirst; //îäèí ïàðàãðàô ïèøåì äðóãîé õðàíèì â ïàìÿòè
public: OOXDocumentWriter( OOXWriter& oWriter,RtfDocument& oDocument ): m_oWriter(oWriter), m_oDocument(oDocument)
{
m_oFileWriter = NULL;
m_bFirst = true;
}
public: ~OOXDocumentWriter()
{
RELEASEOBJECT( m_oFileWriter );
}
public: CString CreateXmlStart();
public: CString CreateXmlEnd( );
public: bool SaveByItemStart( CString sFolder )
{
CreateDirectory( sFolder + _T("\\word"), NULL);
try
{
CString sFilename = sFolder + _T("\\word\\document.xml");
BSTR bstrFilename = sFilename.AllocSysString();
m_oFileWriter = new NFileWriter::CBufferedFileWriter( bstrFilename );
SysFreeString( bstrFilename );
}
catch(...)
{
return false;
}
m_oWriter.m_oRels.AddRelationship( _T("http://schemas.openxmlformats.org/officeDocument/2006/relationships/officeDocument"), _T("word/document.xml") );
m_oWriter.m_oContentTypes.AddContent( _T("application/vnd.openxmlformats-officedocument.wordprocessingml.document.main+xml"), _T("/word/document.xml") );
CString sXml = CreateXmlStart( );
CStringA sXmlUTF = Convert::UnicodeToUtf8( sXml );
m_oFileWriter->Write( (LPBYTE)(LPCSTR)sXmlUTF, sXmlUTF.GetLength() );
return true;
}
public: bool SaveByItem()
{
if( true == m_bFirst )
m_bFirst = false;
else
{
RenderParameter oNewParam;
oNewParam.poDocument = &m_oDocument;
oNewParam.poWriter = &m_oWriter;
oNewParam.poRels = &m_oWriter.m_oDocRels;
oNewParam.nType = RENDER_TO_OOX_PARAM_UNKNOWN;
if( m_oDocument.GetCount() > 1 && m_oDocument[1]->GetCount() > 0 )//åñëè ÷òî-òî åñòü â ñëåäóþùåé ñåêöèè çíà÷èò ïðåäóäóùàÿ çàêîí÷èëàñü
{
if( m_oDocument[0]->GetCount() > 0 )
{
CString sXml = m_oDocument[0]->operator[](0)->RenderToOOX(oNewParam);
//ïèøåì âñòàâëÿåì ñâîéñòâà ñåêöèè
CString sSectPr = m_oDocument[0]->m_oProperty.RenderToOOX(oNewParam);
CString sFindStr = _T("</w:pPr>");
int nIndexpPr = sXml.Find( sFindStr );
if( -1 != nIndexpPr )
{
sXml.Insert( nIndexpPr, sSectPr );
}
else
{
sFindStr = _T("<w:p>");
int nIndexP = sXml.Find( _T("<w:p>") );
if( -1 != nIndexP )
sXml.Insert( nIndexP + sFindStr.GetLength(), _T("<w:pPr>") + sSectPr + _T("</w:pPr>") );
}
//óäàëÿåì ïåðâûé ïàðàãðàô
m_oDocument[0]->RemoveItem( 0 );
CStringA sXmlUTF = Convert::UnicodeToUtf8( sXml );
m_oFileWriter->Write( (LPBYTE)(LPCSTR)sXmlUTF, sXmlUTF.GetLength() );
}
//óäàëÿåì ñåêöèþ
m_oDocument.RemoveItem( 0 );
}
else if( m_oDocument.GetCount() > 0 && m_oDocument[0]->GetCount() > 0 )//ïèøåì ïàðàãðàô
{
CString sXml = m_oDocument[0]->operator[](0)->RenderToOOX(oNewParam);
//óäàëÿåì ïåðâûé ïàðàãðàô
m_oDocument[0]->RemoveItem( 0 );
CStringA sXmlUTF = Convert::UnicodeToUtf8( sXml );
m_oFileWriter->Write( (LPBYTE)(LPCSTR)sXmlUTF, sXmlUTF.GetLength() );
}
}
return true;
}
public: bool SaveByItemEnd()
{
RenderParameter oNewParam;
oNewParam.poDocument = &m_oDocument;
oNewParam.poWriter = &m_oWriter;
oNewParam.poRels = &m_oWriter.m_oDocRels;
oNewParam.nType = RENDER_TO_OOX_PARAM_UNKNOWN;
if( m_oDocument.GetCount() > 0 && m_oDocument[0]->GetCount() > 0 )//äîïèñûâàåì ïîñëåäíèé ïàðàãðàô
{
CString sXml = m_oDocument[0]->operator[](0)->RenderToOOX(oNewParam);
//óäàëÿåì ïåðâûé ïàðàãðàô
m_oDocument[0]->RemoveItem( 0 );
CStringA sXmlUTF = Convert::UnicodeToUtf8( sXml );
m_oFileWriter->Write( (LPBYTE)(LPCSTR)sXmlUTF, sXmlUTF.GetLength() );
}
CString sXml = CreateXmlEnd( );
CStringA sXmlUTF = Convert::UnicodeToUtf8( sXml );
m_oFileWriter->Write( (LPBYTE)(LPCSTR)sXmlUTF, sXmlUTF.GetLength() );
RELEASEOBJECT( m_oFileWriter );
return true;
}
public: int GetCount()
{
int nCount = 0;
for( int i = 0; i < m_oDocument.GetCount(); i++ )
nCount += m_oDocument[i]->GetCount();
return nCount;
}
};