Commit b9411dfb authored by Alexander.Trofimov's avatar Alexander.Trofimov Committed by Alexander Trofimov

(1.0.0.51): FileConverter2

(1.0.0.99): FileConverterUtils2
(2.0.0.261): ASCOfficeDocxFile2
Реализовал чтение файла (формата таблиц) и конвертацию его в json + получение его на клиенте (для mail-merge).

git-svn-id: svn://fileserver/activex/AVS/Sources/TeamlabOffice/trunk/ServerComponents@61160 954022d7-b5bf-4e40-9824-e11837661b57
parent 025f8a95
......@@ -64,7 +64,8 @@ public:
BYTE fileType;
UINT nCodePage;
WCHAR wcDelimiter;
SerializeCommon::ReadFileType(CString(bstrXMLOptions), fileType, nCodePage, wcDelimiter);
BYTE saveFileType;
SerializeCommon::ReadFileType(CString(bstrXMLOptions), fileType, nCodePage, wcDelimiter, saveFileType);
if (BinXlsxRW::c_oFileTypes::CSV != fileType)
{
......
......@@ -2,6 +2,6 @@
//2
//0
//0
//260
#define INTVER 2,0,0,260
#define STRVER "2,0,0,260\0"
//261
#define INTVER 2,0,0,261
#define STRVER "2,0,0,261\0"
......@@ -15,7 +15,8 @@ namespace BinXlsxRW
namespace c_oFileTypes{enum c_oFileTypes
{
XLSX = 1,
CSV = 2
CSV = 2,
JSON = 3
};}
......
......@@ -73,13 +73,16 @@ namespace SerializeCommon
return sSourcePath.Left(nIndex + 1) + sTargetExt;
return sSourcePath;
}
void ReadFileType(CString& sXMLOptions, BYTE& result, UINT& nCodePage, WCHAR& wcDelimiter)
void ReadFileType(CString& sXMLOptions, BYTE& result, UINT& nCodePage, WCHAR& wcDelimiter, BYTE& cSaveFileType)
{
result = BinXlsxRW::c_oFileTypes::XLSX;
nCodePage = CP_UTF8;
wcDelimiter = _T(',');
cSaveFileType = BinXlsxRW::c_oFileTypes::XLSX;
nullable<SimpleTypes::CUnsignedDecimalNumber<>> fileType;
nullable<SimpleTypes::CUnsignedDecimalNumber<>> codePage;
nullable<SimpleTypes::CUnsignedDecimalNumber<>> saveFileType;
nullable<CString> delimiter;
// Read options
......@@ -102,12 +105,21 @@ namespace SerializeCommon
WritingElement_ReadAttributes_Read_if (oReader, _T("fileType"), fileType)
WritingElement_ReadAttributes_Read_else_if (oReader, _T("codePage"), codePage)
WritingElement_ReadAttributes_Read_else_if (oReader, _T("delimiter"), delimiter)
WritingElement_ReadAttributes_Read_else_if (oReader, _T("saveFileType"), saveFileType)
WritingElement_ReadAttributes_End(oReader)
result = (BYTE)fileType->GetValue();
nCodePage = (UINT)codePage->GetValue();
const CString& sDelimiter = delimiter.get();
if (0 < sDelimiter.GetLength())
wcDelimiter = sDelimiter.GetAt(0);
if (fileType.IsInit())
result = (BYTE)fileType->GetValue();
if (codePage.IsInit())
nCodePage = (UINT)codePage->GetValue();
if (saveFileType.IsInit())
cSaveFileType = (BYTE)saveFileType->GetValue();
if (delimiter.IsInit())
{
const CString& sDelimiter = delimiter.get();
if (0 < sDelimiter.GetLength())
wcDelimiter = sDelimiter.GetAt(0);
}
break;
}
}
......
......@@ -46,7 +46,7 @@ namespace SerializeCommon
aReplies.clear();
}
};
void ReadFileType(CString& sXMLOptions, BYTE& result, UINT& nCodePage, WCHAR& wcDelimiter);
void ReadFileType(CString& sXMLOptions, BYTE& result, UINT& nCodePage, WCHAR& wcDelimiter, BYTE& saveFileType);
}
#endif //SERIALIZER_COMMON
\ No newline at end of file
......@@ -3219,7 +3219,8 @@ namespace BinXlsxRW {
BYTE fileType;
UINT nCodePage;
WCHAR wcDelimiter;
SerializeCommon::ReadFileType(sXMLOptions, fileType, nCodePage, wcDelimiter);
BYTE saveFileType;
SerializeCommon::ReadFileType(sXMLOptions, fileType, nCodePage, wcDelimiter, saveFileType);
OOX::Spreadsheet::CXlsx *pXlsx = NULL;
switch(fileType)
......@@ -3234,21 +3235,30 @@ namespace BinXlsxRW {
break;
}
pXlsx->PrepareWorkbook();
intoBindoc(*pXlsx, oBufferedStream, pEmbeddedFontsManager, pOfficeDrawingConverter);
BYTE* pbBinBuffer = oBufferedStream.GetBuffer();
int nBinBufferLen = oBufferedStream.GetPosition();
int nBase64BufferLen = Base64::Base64EncodeGetRequiredLength(nBinBufferLen, Base64::B64_BASE64_FLAG_NOCRLF);
BYTE* pbBase64Buffer = new BYTE[nBase64BufferLen];
if(TRUE == Base64::Base64Encode(pbBinBuffer, nBinBufferLen, (LPSTR)pbBase64Buffer, &nBase64BufferLen, Base64::B64_BASE64_FLAG_NOCRLF))
if (BinXlsxRW::c_oFileTypes::JSON == saveFileType)
{
CFile oFile;
oFile.CreateFile(sFileDst);
oFile.WriteStringUTF8(WriteFileHeader(nBinBufferLen));
oFile.WriteFile(pbBase64Buffer, nBase64BufferLen);
oFile.CloseFile();
CSVWriter::WriteFromXlsxToCsv(sFileDst, *pXlsx, CP_UTF8, _T(','), TRUE);
}
RELEASEARRAYOBJECTS(pbBase64Buffer);
else
{
intoBindoc(*pXlsx, oBufferedStream, pEmbeddedFontsManager, pOfficeDrawingConverter);
BYTE* pbBinBuffer = oBufferedStream.GetBuffer();
int nBinBufferLen = oBufferedStream.GetPosition();
int nBase64BufferLen = Base64::Base64EncodeGetRequiredLength(nBinBufferLen, Base64::B64_BASE64_FLAG_NOCRLF);
BYTE* pbBase64Buffer = new BYTE[nBase64BufferLen];
if(TRUE == Base64::Base64Encode(pbBinBuffer, nBinBufferLen, (LPSTR)pbBase64Buffer, &nBase64BufferLen, Base64::B64_BASE64_FLAG_NOCRLF))
{
CFile oFile;
oFile.CreateFile(sFileDst);
oFile.WriteStringUTF8(WriteFileHeader(nBinBufferLen));
oFile.WriteFile(pbBase64Buffer, nBase64BufferLen);
oFile.CloseFile();
}
RELEASEARRAYOBJECTS(pbBase64Buffer);
}
RELEASEOBJECT(pXlsx);
}
private:
......
......@@ -3036,7 +3036,8 @@ namespace BinXlsxRW {
BYTE fileType;
UINT nCodePage;
WCHAR wcDelimiter;
SerializeCommon::ReadFileType(sXMLOptions, fileType, nCodePage, wcDelimiter);
BYTE saveFileType;
SerializeCommon::ReadFileType(sXMLOptions, fileType, nCodePage, wcDelimiter, saveFileType);
// CSV , ( rels) .
if (BinXlsxRW::c_oFileTypes::CSV == fileType)
sDstPath += _T("Temp");
......@@ -3057,7 +3058,7 @@ namespace BinXlsxRW {
switch(fileType)
{
case BinXlsxRW::c_oFileTypes::CSV:
CSVWriter::WriteFromXlsxToCsv(sDstPathCSV, oXlsx, nCodePage, wcDelimiter);
CSVWriter::WriteFromXlsxToCsv(sDstPathCSV, oXlsx, nCodePage, wcDelimiter, FALSE);
break;
case BinXlsxRW::c_oFileTypes::XLSX:
default:
......
......@@ -59,7 +59,7 @@ namespace CSVWriter
nCurrentIndex += nCountChars;
}
}
void WriteFromXlsxToCsv(CString &sFileDst, OOX::Spreadsheet::CXlsx &oXlsx, UINT nCodePage, const WCHAR wcDelimiter)
void WriteFromXlsxToCsv(CString &sFileDst, OOX::Spreadsheet::CXlsx &oXlsx, UINT nCodePage, const WCHAR wcDelimiter, BOOL bJSON)
{
NSFile::CFileBinary oFile;
oFile.CreateFileW(string2std_string(sFileDst));
......@@ -101,13 +101,17 @@ namespace CSVWriter
}
}
// Get active sheet rId
// Get active sheet rId (для конвертации в CSV нужно использовать name, т.к. это наш бинарник из js-скриптов и еще нет rId
// А для json-а нужно пользовать rId, т.к. при открытии они используются
if (pWorkbook->m_oSheets.IsInit() && 0 <= pWorkbook->m_oSheets->m_arrItems.size())
{
OOX::Spreadsheet::CSheet *pSheet;
if (lActiveSheet <= pWorkbook->m_oSheets->m_arrItems.size())
sSheetRId = pWorkbook->m_oSheets->m_arrItems[lActiveSheet]->m_oName.get2();
pSheet = pWorkbook->m_oSheets->m_arrItems[lActiveSheet];
else
sSheetRId = pWorkbook->m_oSheets->m_arrItems[0]->m_oName.get2();
pSheet = pWorkbook->m_oSheets->m_arrItems[0];
sSheetRId = bJSON ? pSheet->m_oRid->GetValue() : pSheet->m_oName.get2();
}
std::map<CString, OOX::Spreadsheet::CWorksheet*> &arrWorksheets = oXlsx.GetWorksheets();
......@@ -119,9 +123,14 @@ namespace CSVWriter
{
OOX::Spreadsheet::CSharedStrings *pSharedStrings = oXlsx.GetSharedStrings();
CString sDelimiter = _T(""); sDelimiter += wcDelimiter;
const WCHAR wcQuote = _T('"');
CString sEscape = _T("\"\n");
sEscape += wcDelimiter;
CString sEndJson = CString(_T("]"));
CString sQuote = _T("\"");
CString sDoubleQuote = _T("\"\"");
if (bJSON)
WriteFile(&oFile, &pWriteBuffer, nCurrentIndex, CString(_T("[")), nCodePage);
INT nRowCurrent = 1;
for (INT i = 0; i < pWorksheet->m_oSheetData->m_arrItems.size(); ++i)
......@@ -129,14 +138,20 @@ namespace CSVWriter
OOX::Spreadsheet::CRow *pRow = static_cast<OOX::Spreadsheet::CRow *>(pWorksheet->m_oSheetData->m_arrItems[i]);
INT nRow = pRow->m_oR.IsInit() ? pRow->m_oR->GetValue() : 0 == i ? nRowCurrent : nRowCurrent + 1;
while (nRow > nRowCurrent)
if (bJSON)
WriteFile(&oFile, &pWriteBuffer, nCurrentIndex, CString(0 == i ? _T("[") : _T(",[")), nCodePage);
else
{
// Write new line
++nRowCurrent;
WriteFile(&oFile, &pWriteBuffer, nCurrentIndex, sNewLineN, nCodePage);
while (nRow > nRowCurrent)
{
// Write new line
++nRowCurrent;
WriteFile(&oFile, &pWriteBuffer, nCurrentIndex, sNewLineN, nCodePage);
}
}
INT nColCurrent = 1;
BOOL bIsWriteCell = FALSE; // Нужно только для записи JSON-а
for (INT j = 0; j < pRow->m_arrItems.size(); ++j)
{
INT nRowTmp = 0;
......@@ -146,9 +161,15 @@ namespace CSVWriter
while (nCol > nColCurrent)
{
if (bJSON && FALSE == bIsWriteCell)
{
// Запишем пустые строки (для JSON-а)
WriteFile(&oFile, &pWriteBuffer, nCurrentIndex, sDoubleQuote, nCodePage);
}
// Write delimiter
++nColCurrent;
WriteFile(&oFile, &pWriteBuffer, nCurrentIndex, sDelimiter, nCodePage);
bIsWriteCell = FALSE;
}
OOX::Spreadsheet::CCell *pCell = static_cast<OOX::Spreadsheet::CCell *>(pRow->m_arrItems[j]);
......@@ -182,22 +203,35 @@ namespace CSVWriter
}
// Escape cell value
if (-1 != sCellValue.FindOneOf(sEscape))
if (bJSON || -1 != sCellValue.FindOneOf(sEscape))
{
sCellValue.Replace(_T("\""), _T("\"\""));
sCellValue = wcQuote + sCellValue + wcQuote;
sCellValue.Replace(sQuote, sDoubleQuote);
sCellValue = sQuote + sCellValue + sQuote;
}
// Write cell value
WriteFile(&oFile, &pWriteBuffer, nCurrentIndex, sCellValue, nCodePage);
bIsWriteCell = TRUE;
}
if (bJSON)
WriteFile(&oFile, &pWriteBuffer, nCurrentIndex, sEndJson, nCodePage);
}
if (bJSON)
{
WriteFile(&oFile, &pWriteBuffer, nCurrentIndex, sEndJson, nCodePage);
WriteFile(&oFile, &pWriteBuffer, nCurrentIndex, sEndJson, nCodePage, TRUE);
}
}
}
}
// Теперь мы пишем как MS Excel (новую строку записываем в файл)
WriteFile(&oFile, &pWriteBuffer, nCurrentIndex, sNewLineN, nCodePage);
WriteFile(&oFile, &pWriteBuffer, nCurrentIndex, sNewLineN, nCodePage, TRUE);
if (!bJSON)
{
WriteFile(&oFile, &pWriteBuffer, nCurrentIndex, sNewLineN, nCodePage);
WriteFile(&oFile, &pWriteBuffer, nCurrentIndex, sNewLineN, nCodePage, TRUE);
}
RELEASEARRAYOBJECTS(pWriteBuffer);
oFile.CloseFile();
}
......
......@@ -17,7 +17,7 @@
namespace CSVWriter
{
void WriteFile(NSFile::CFileBinary *pFile, WCHAR **pWriteBuffer, INT &nCurrentIndex, CString &sWriteString, UINT &nCodePage, BOOL bIsEnd = FALSE);
void WriteFromXlsxToCsv(CString &sFileDst, OOX::Spreadsheet::CXlsx &oXlsx, UINT nCodePage, const WCHAR wcDelimiter);
void WriteFromXlsxToCsv(CString &sFileDst, OOX::Spreadsheet::CXlsx &oXlsx, UINT nCodePage, const WCHAR wcDelimiter, BOOL bJSON);
}
#endif //CSV_WRITER
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment