mirror of
https://github.com/ONLYOFFICE/core.git
synced 2026-04-07 13:55:33 +08:00
Bug 30461 - Ошибка "Conversion failed" при попытке экспорта в CSV. создавать папку надо даже при сохранении в csv, потому что когда читаем из бинарника тему, она записывается в файл. utf8
git-svn-id: svn://fileserver/activex/AVS/Sources/TeamlabOffice/trunk/ServerComponents@64939 954022d7-b5bf-4e40-9824-e11837661b57
This commit is contained in:
committed by
Alexander Trofimov
parent
029e9bcba4
commit
03bdaf1e22
@ -1,4 +1,4 @@
|
||||
#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 (<28><><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><> <20><><EFBFBD> <20><><EFBFBD><EFBFBD>, <20> <20><><EFBFBD><EFBFBD>, <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20> ReadFile <20><> <20><><EFBFBD><EFBFBD><EFBFBD>, <20> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>)
|
||||
BYTE fileType;
|
||||
UINT nCodePage;
|
||||
WCHAR wcDelimiter;
|
||||
BYTE saveFileType;
|
||||
SerializeCommon::ReadFileType(sXmlOptions, fileType, nCodePage, wcDelimiter, saveFileType);
|
||||
//создавать папку надо даже при сохранении в csv, потому что когда читаем из бинарника тему, она записывается в файл.
|
||||
OOX::CPath pathXlDir = sDstPath + FILE_SEPARATOR_STR + _T("xl");
|
||||
|
||||
if (c_oFileTypes::CSV != fileType)
|
||||
{
|
||||
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();
|
||||
|
||||
OOX::CPath pathThemeFile = pathThemeDir + FILE_SEPARATOR_STR + OOX::FileTypes::Theme.DefaultFileName().GetPath();
|
||||
|
||||
OOX::CPath pathThemeThemeRelsDir = pathThemeDir + FILE_SEPARATOR_STR + _T("_rels");
|
||||
OOX::CPath pathThemeFile = pathThemeDir + FILE_SEPARATOR_STR + OOX::FileTypes::Theme.DefaultFileName().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 pathThemeThemeRelsDir = pathThemeDir + FILE_SEPARATOR_STR + _T("_rels");
|
||||
|
||||
//Create Default Theme
|
||||
{
|
||||
Writers::DefaultThemeWriter oDefaultThemeWriter;
|
||||
oDefaultThemeWriter.Write(pathThemeFile.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()));
|
||||
|
||||
//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);
|
||||
|
||||
//<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
//папка с бинарников
|
||||
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();
|
||||
|
||||
//<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>
|
||||
//добавим мега шрифт
|
||||
pEmbeddedFontsManager->CheckFont(_T("Wingdings 3"), pFontManager);
|
||||
pEmbeddedFontsManager->CheckFont(_T("Arial"), pFontManager);
|
||||
//pEmbeddedFontsManager <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>
|
||||
//<EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
//pEmbeddedFontsManager добавляются все цифры
|
||||
//для заголовков
|
||||
pEmbeddedFontsManager->CheckFont(_T("Calibri"), pFontManager);
|
||||
pEmbeddedFontsManager->CheckString(CString(_T("ABCDEFGHIJKLMNOPQRSTUVWXYZ")));
|
||||
|
||||
//<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> "#NULL!", "#DIV/0!"...
|
||||
//дополнение для ошибок "#NULL!", "#DIV/0!"...
|
||||
pEmbeddedFontsManager->CheckString(CString(_T("#!/?")));
|
||||
//<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD> num <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20> id <EFBFBD><EFBFBD> 0 <EFBFBD><EFBFBD> 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 <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> 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();
|
||||
|
||||
//<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> sThemePath <EFBFBD><EFBFBD> bsFilename <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD> theme <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> bsFilename
|
||||
//получаем sThemePath из bsFilename предполагая что папка theme находится на уровень выше bsFilename
|
||||
CString sThemePath;
|
||||
CString sFilenameReverse = sFilepath;sFilenameReverse.MakeReverse();
|
||||
|
||||
|
||||
@ -1,4 +1,4 @@
|
||||
#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);
|
||||
//<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20> <20><><EFBFBD><EFBFBD><EFBFBD> 0, <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD> <20><><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> Excel <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>.
|
||||
//пишем в конце 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());
|
||||
//<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20> Excel <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
//важно иначе при редактировании и сохранении в 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)
|
||||
{
|
||||
//<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD> 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);
|
||||
//<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> error <EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>
|
||||
//текст 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;
|
||||
}
|
||||
}
|
||||
//<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
//Проверяем что файл существует
|
||||
FILE* pFileNative = oFile.GetFileNative();
|
||||
if(NULL != pFileNative)
|
||||
{
|
||||
@ -3039,7 +3039,7 @@ namespace BinXlsxRW {
|
||||
oFile.ReadFile(pBase64Data, oFile.GetFileSize(), nBase64DataSize);
|
||||
oFile.CloseFile();
|
||||
|
||||
//<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
//проверяем формат
|
||||
bool bValidFormat = false;
|
||||
CString sSignature(g_sFormatSignature);
|
||||
int nSigLength = sSignature.GetLength();
|
||||
@ -3053,7 +3053,7 @@ namespace BinXlsxRW {
|
||||
}
|
||||
if(bValidFormat)
|
||||
{
|
||||
//<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><> <20><><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20> <20><><EFBFBD><EFBFBD><EFBFBD> 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);
|
||||
// <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD> CSV <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>, <20><><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD> <20> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD> (<28><><EFBFBD> rels) <20> <20><><EFBFBD><EFBFBD> <20><> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>.
|
||||
// Делаем для 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());
|
||||
|
||||
Reference in New Issue
Block a user