Commit 03bdaf1e authored by Sergey.Konovalov's avatar Sergey.Konovalov Committed by Alexander Trofimov

Bug 30461 - Ошибка "Conversion failed" при попытке экспорта в CSV. создавать...

Bug 30461 - Ошибка "Conversion failed" при попытке экспорта в CSV. создавать папку надо даже при сохранении в csv, потому что когда читаем из бинарника тему, она записывается в файл. utf8

git-svn-id: svn://fileserver/activex/AVS/Sources/TeamlabOffice/trunk/ServerComponents@64939 954022d7-b5bf-4e40-9824-e11837661b57
parent 029e9bcb
#include "XlsxSerializer.h" #include "XlsxSerializer.h"
#include "../../DesktopEditor/common/Directory.h" #include "../../DesktopEditor/common/Directory.h"
#include "../../DesktopEditor/common/File.h" #include "../../DesktopEditor/common/File.h"
...@@ -25,15 +25,7 @@ namespace BinXlsxRW{ ...@@ -25,15 +25,7 @@ namespace BinXlsxRW{
OOX::CPath pathMediaDir = sDstPath + FILE_SEPARATOR_STR + _T("xl") + FILE_SEPARATOR_STR + _T("media"); OOX::CPath pathMediaDir = sDstPath + FILE_SEPARATOR_STR + _T("xl") + FILE_SEPARATOR_STR + _T("media");
OOX::CPath pathEmbedDir = sDstPath + FILE_SEPARATOR_STR + _T("xl") + FILE_SEPARATOR_STR + _T("embeddings"); OOX::CPath pathEmbedDir = sDstPath + FILE_SEPARATOR_STR + _T("xl") + FILE_SEPARATOR_STR + _T("embeddings");
// File Type ( , , ReadFile , ) //создавать папку надо даже при сохранении в csv, потому что когда читаем из бинарника тему, она записывается в файл.
BYTE fileType;
UINT nCodePage;
WCHAR wcDelimiter;
BYTE saveFileType;
SerializeCommon::ReadFileType(sXmlOptions, fileType, nCodePage, wcDelimiter, saveFileType);
if (c_oFileTypes::CSV != fileType)
{
OOX::CPath pathXlDir = sDstPath + FILE_SEPARATOR_STR + _T("xl"); OOX::CPath pathXlDir = sDstPath + FILE_SEPARATOR_STR + _T("xl");
OOX::CPath pathThemeDir = pathXlDir + FILE_SEPARATOR_STR + OOX::FileTypes::Theme.DefaultDirectory().GetPath(); OOX::CPath pathThemeDir = pathXlDir + FILE_SEPARATOR_STR + OOX::FileTypes::Theme.DefaultDirectory().GetPath();
...@@ -53,7 +45,6 @@ namespace BinXlsxRW{ ...@@ -53,7 +45,6 @@ namespace BinXlsxRW{
Writers::DefaultThemeWriter oDefaultThemeWriter; Writers::DefaultThemeWriter oDefaultThemeWriter;
oDefaultThemeWriter.Write(pathThemeFile.GetPath()); oDefaultThemeWriter.Write(pathThemeFile.GetPath());
} }
}
sMediaPath = pathMediaDir.GetPath(); sMediaPath = pathMediaDir.GetPath();
sEmbedPath = pathEmbedDir.GetPath(); sEmbedPath = pathEmbedDir.GetPath();
...@@ -64,7 +55,7 @@ namespace BinXlsxRW{ ...@@ -64,7 +55,7 @@ namespace BinXlsxRW{
oOfficeDrawingConverter.SetMediaDstPath(sMediaDir); oOfficeDrawingConverter.SetMediaDstPath(sMediaDir);
oOfficeDrawingConverter.SetEmbedDstPath(sEmbedDir); oOfficeDrawingConverter.SetEmbedDstPath(sEmbedDir);
// //папка с бинарников
std::wstring strFileInDir = NSSystemPath::GetDirectoryName(string2std_string(sSrcFileName)); std::wstring strFileInDir = NSSystemPath::GetDirectoryName(string2std_string(sSrcFileName));
CString sFileInDir = strFileInDir.c_str(); CString sFileInDir = strFileInDir.c_str();
...@@ -99,17 +90,17 @@ namespace BinXlsxRW{ ...@@ -99,17 +90,17 @@ namespace BinXlsxRW{
pFontPicker->SetEmbeddedFontsDirectory(m_sEmbeddedFontsDir); pFontPicker->SetEmbeddedFontsDirectory(m_sEmbeddedFontsDir);
pEmbeddedFontsManager = pFontPicker->GetNativeCutter(); pEmbeddedFontsManager = pFontPicker->GetNativeCutter();
// //добавим мега шрифт
pEmbeddedFontsManager->CheckFont(_T("Wingdings 3"), pFontManager); pEmbeddedFontsManager->CheckFont(_T("Wingdings 3"), pFontManager);
pEmbeddedFontsManager->CheckFont(_T("Arial"), pFontManager); pEmbeddedFontsManager->CheckFont(_T("Arial"), pFontManager);
//pEmbeddedFontsManager //pEmbeddedFontsManager добавляются все цифры
// //для заголовков
pEmbeddedFontsManager->CheckFont(_T("Calibri"), pFontManager); pEmbeddedFontsManager->CheckFont(_T("Calibri"), pFontManager);
pEmbeddedFontsManager->CheckString(CString(_T("ABCDEFGHIJKLMNOPQRSTUVWXYZ"))); pEmbeddedFontsManager->CheckString(CString(_T("ABCDEFGHIJKLMNOPQRSTUVWXYZ")));
// "#NULL!", "#DIV/0!"... //дополнение для ошибок "#NULL!", "#DIV/0!"...
pEmbeddedFontsManager->CheckString(CString(_T("#!/?"))); pEmbeddedFontsManager->CheckString(CString(_T("#!/?")));
// num id 0 49 //дополнение для num форматов по умолчанию с id от 0 до 49
pEmbeddedFontsManager->CheckString(CString(_T(".%E+-():"))); pEmbeddedFontsManager->CheckString(CString(_T(".%E+-():")));
} }
...@@ -127,7 +118,7 @@ namespace BinXlsxRW{ ...@@ -127,7 +118,7 @@ namespace BinXlsxRW{
bool CXlsxSerializer::loadChart(CString& sChartPath, NSBinPptxRW::CBinaryFileWriter& oBufferedStream, long& lDataSize) bool CXlsxSerializer::loadChart(CString& sChartPath, NSBinPptxRW::CBinaryFileWriter& oBufferedStream, long& lDataSize)
{ {
bool bRes = false; bool bRes = false;
//todo oRootPath //todo передать нормальный oRootPath
OOX::CPath oRootPath; OOX::CPath oRootPath;
OOX::Spreadsheet::CChartSpace oChart(oRootPath, sChartPath); OOX::Spreadsheet::CChartSpace oChart(oRootPath, sChartPath);
if(NULL != m_pExternalDrawingConverter) if(NULL != m_pExternalDrawingConverter)
...@@ -157,7 +148,7 @@ namespace BinXlsxRW{ ...@@ -157,7 +148,7 @@ namespace BinXlsxRW{
{ {
m_pExternalDrawingConverter->SetDstContentRels(); m_pExternalDrawingConverter->SetDstContentRels();
// sThemePath bsFilename theme bsFilename //получаем sThemePath из bsFilename предполагая что папка theme находится на уровень выше bsFilename
CString sThemePath; CString sThemePath;
CString sFilenameReverse = sFilepath;sFilenameReverse.MakeReverse(); CString sFilenameReverse = sFilepath;sFilenameReverse.MakeReverse();
......
#ifndef BINARY_READER #ifndef BINARY_READER
#define BINARY_READER #define BINARY_READER
#include "../../Common/Base64.h" #include "../../Common/Base64.h"
...@@ -1633,7 +1633,7 @@ namespace BinXlsxRW { ...@@ -1633,7 +1633,7 @@ namespace BinXlsxRW {
sSignature.ReleaseBuffer(); sSignature.ReleaseBuffer();
memcpy(pWriteBuffer + nSignatureSize, &length, nDataLengthSize); memcpy(pWriteBuffer + nSignatureSize, &length, nDataLengthSize);
memcpy(pWriteBuffer + nSignatureSize + nDataLengthSize, pSourceBuffer, length); memcpy(pWriteBuffer + nSignatureSize + nDataLengthSize, pSourceBuffer, length);
// 0, Excel . //пишем в конце 0, потому что при редактировании Excel меняет посление байты.
memset(pWriteBuffer + nSignatureSize + nDataLengthSize + length, 0, nJunkSize); memset(pWriteBuffer + nSignatureSize + nDataLengthSize + length, 0, nJunkSize);
int nBase64BufferLen = Base64::Base64EncodeGetRequiredLength(nWriteBufferLength, Base64::B64_BASE64_FLAG_NONE); int nBase64BufferLen = Base64::Base64EncodeGetRequiredLength(nWriteBufferLength, Base64::B64_BASE64_FLAG_NONE);
...@@ -1644,7 +1644,7 @@ namespace BinXlsxRW { ...@@ -1644,7 +1644,7 @@ namespace BinXlsxRW {
{ {
std::wstring strGfxdata = NSFile::CUtf8Converter::GetUnicodeStringFromUTF8(pbBase64Buffer, nBase64BufferLen); std::wstring strGfxdata = NSFile::CUtf8Converter::GetUnicodeStringFromUTF8(pbBase64Buffer, nBase64BufferLen);
sGfxdata = CString(strGfxdata.c_str()); sGfxdata = CString(strGfxdata.c_str());
// Excel //важно иначе при редактировании и сохранении в Excel перетирается
sGfxdata.Append(_T("\r\n")); sGfxdata.Append(_T("\r\n"));
} }
RELEASEARRAYOBJECTS(pbBase64Buffer); RELEASEARRAYOBJECTS(pbBase64Buffer);
...@@ -2473,7 +2473,7 @@ namespace BinXlsxRW { ...@@ -2473,7 +2473,7 @@ namespace BinXlsxRW {
int res = c_oSerConstants::ReadOk; int res = c_oSerConstants::ReadOk;
if(c_oSer_DrawingType::Chart2 == type) if(c_oSer_DrawingType::Chart2 == type)
{ {
// rels //создаем папку для rels
OOX::CPath pathChartsDir = m_sDestinationDir + FILE_SEPARATOR_STR + _T("xl") + FILE_SEPARATOR_STR + _T("charts"); OOX::CPath pathChartsDir = m_sDestinationDir + FILE_SEPARATOR_STR + _T("xl") + FILE_SEPARATOR_STR + _T("charts");
OOX::CSystemUtility::CreateDirectories(pathChartsDir.GetPath()); OOX::CSystemUtility::CreateDirectories(pathChartsDir.GetPath());
...@@ -2693,7 +2693,7 @@ namespace BinXlsxRW { ...@@ -2693,7 +2693,7 @@ namespace BinXlsxRW {
{ {
OOX::Spreadsheet::CCell* pCell = new OOX::Spreadsheet::CCell(); OOX::Spreadsheet::CCell* pCell = new OOX::Spreadsheet::CCell();
res = Read1(length, &BinaryWorksheetsTableReader::ReadCell, this, pCell); res = Read1(length, &BinaryWorksheetsTableReader::ReadCell, this, pCell);
// error //текст error и формул пишем
if(NULL != m_pSharedStrings && pCell->m_oType.IsInit() && pCell->m_oValue.IsInit()) if(NULL != m_pSharedStrings && pCell->m_oType.IsInit() && pCell->m_oValue.IsInit())
{ {
SimpleTypes::Spreadsheet::ECellTypeType eCellType = pCell->m_oType->GetValue(); SimpleTypes::Spreadsheet::ECellTypeType eCellType = pCell->m_oType->GetValue();
...@@ -2900,7 +2900,7 @@ namespace BinXlsxRW { ...@@ -2900,7 +2900,7 @@ namespace BinXlsxRW {
res = Read1(length, &BinaryOtherTableReader::ReadMediaContent, this, poResult); res = Read1(length, &BinaryOtherTableReader::ReadMediaContent, this, poResult);
else if(c_oSer_OtherType::Theme == type) else if(c_oSer_OtherType::Theme == type)
{ {
CString sThemePath;sThemePath.Format(_T("%ls/%ls"), m_oSaveParams.sThemePath, OOX::FileTypes::Theme.DefaultFileName().GetPath()); CString sThemePath = m_oSaveParams.sThemePath + FILE_SEPARATOR_STR + OOX::FileTypes::Theme.DefaultFileName().GetPath();
long nCurPos = m_oBufferedStream.GetPos(); long nCurPos = m_oBufferedStream.GetPos();
m_pOfficeDrawingConverter->SaveThemeXml(nCurPos, length, sThemePath); m_pOfficeDrawingConverter->SaveThemeXml(nCurPos, length, sThemePath);
m_oBufferedStream.Seek(nCurPos + length); m_oBufferedStream.Seek(nCurPos + length);
...@@ -2963,7 +2963,7 @@ namespace BinXlsxRW { ...@@ -2963,7 +2963,7 @@ namespace BinXlsxRW {
sImageSrc = m_sFileInDir + _T("media/") + sImage; sImageSrc = m_sFileInDir + _T("media/") + sImage;
} }
} }
// //Проверяем что файл существует
FILE* pFileNative = oFile.GetFileNative(); FILE* pFileNative = oFile.GetFileNative();
if(NULL != pFileNative) if(NULL != pFileNative)
{ {
...@@ -3039,7 +3039,7 @@ namespace BinXlsxRW { ...@@ -3039,7 +3039,7 @@ namespace BinXlsxRW {
oFile.ReadFile(pBase64Data, oFile.GetFileSize(), nBase64DataSize); oFile.ReadFile(pBase64Data, oFile.GetFileSize(), nBase64DataSize);
oFile.CloseFile(); oFile.CloseFile();
// //проверяем формат
bool bValidFormat = false; bool bValidFormat = false;
CString sSignature(g_sFormatSignature); CString sSignature(g_sFormatSignature);
int nSigLength = sSignature.GetLength(); int nSigLength = sSignature.GetLength();
...@@ -3053,7 +3053,7 @@ namespace BinXlsxRW { ...@@ -3053,7 +3053,7 @@ namespace BinXlsxRW {
} }
if(bValidFormat) if(bValidFormat)
{ {
// base64 //Читаем из файла версию и длину base64
int nIndex = nSigLength; int nIndex = nSigLength;
int nType = 0; int nType = 0;
CStringA version = ""; CStringA version = "";
...@@ -3105,9 +3105,9 @@ namespace BinXlsxRW { ...@@ -3105,9 +3105,9 @@ namespace BinXlsxRW {
WCHAR wcDelimiter; WCHAR wcDelimiter;
BYTE saveFileType; BYTE saveFileType;
SerializeCommon::ReadFileType(sXMLOptions, fileType, nCodePage, wcDelimiter, saveFileType); SerializeCommon::ReadFileType(sXMLOptions, fileType, nCodePage, wcDelimiter, saveFileType);
// CSV , ( rels) . // Делаем для CSV перебивку пути, иначе создается папка с одинаковым имеем (для rels) и файл не создается.
if (BinXlsxRW::c_oFileTypes::CSV == fileType) if (BinXlsxRW::c_oFileTypes::CSV == fileType)
sDstPath += _T("Temp"); sDstPath = NSSystemPath::GetDirectoryName(sDstPath);
OOX::Spreadsheet::CXlsx oXlsx; OOX::Spreadsheet::CXlsx oXlsx;
SaveParams oSaveParams(sDstPath + FILE_SEPARATOR_STR + OOX::Spreadsheet::FileTypes::Workbook.DefaultDirectory().GetPath() + FILE_SEPARATOR_STR + OOX::FileTypes::Theme.DefaultDirectory().GetPath()); SaveParams oSaveParams(sDstPath + FILE_SEPARATOR_STR + OOX::Spreadsheet::FileTypes::Workbook.DefaultDirectory().GetPath() + FILE_SEPARATOR_STR + OOX::FileTypes::Theme.DefaultDirectory().GetPath());
......
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