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