mirror of
https://github.com/ONLYOFFICE/core.git
synced 2026-03-21 07:52:02 +08:00
Compare commits
1 Commits
core-win-3
...
core-win-6
| Author | SHA1 | Date | |
|---|---|---|---|
| 578327bab6 |
@ -513,7 +513,23 @@ const std::wstring tab2sheet_name(const short tabid, std::vector<std::wstring>&
|
||||
}
|
||||
return L"#REF";
|
||||
}
|
||||
|
||||
const std::wstring name2sheet_name(std::wstring name, const std::wstring prefix)
|
||||
{
|
||||
static boost::wregex correct_sheet_name(L"^\\'.+?\\'$");
|
||||
static boost::wregex test_sheet_name(L"[\\s)(\\'&:-]+"); //.??? 6442946.xls
|
||||
|
||||
std::wstring sheet_first = prefix + name;
|
||||
|
||||
if(!boost::regex_search(sheet_first.begin(), sheet_first.end(), correct_sheet_name))
|
||||
{
|
||||
if(boost::regex_search(sheet_first.begin(), sheet_first.end(), test_sheet_name))
|
||||
{
|
||||
sheet_first = boost::algorithm::replace_all_copy(sheet_first, L"'", L"''");
|
||||
sheet_first = std::wstring(L"'") + sheet_first + std::wstring(L"'");
|
||||
}
|
||||
}
|
||||
return sheet_first;
|
||||
}
|
||||
const std::wstring xti_indexes2sheet_name(const short tabFirst, const short tabLast, std::vector<std::wstring>& names, const std::wstring prefix)
|
||||
{
|
||||
if(-1 == tabFirst)
|
||||
@ -538,7 +554,7 @@ const std::wstring xti_indexes2sheet_name(const short tabFirst, const short tabL
|
||||
std::wstring sheet_last;
|
||||
if (tabLast != tabFirst)
|
||||
{
|
||||
sheet_last = prefix + tab2sheet_name(tabLast, names);
|
||||
sheet_last = std::wstring(L":") + prefix + tab2sheet_name(tabLast, names);
|
||||
|
||||
if(!boost::regex_search(sheet_last.begin(), sheet_last.end(), correct_sheet_name))
|
||||
{
|
||||
@ -548,7 +564,6 @@ const std::wstring xti_indexes2sheet_name(const short tabFirst, const short tabL
|
||||
sheet_last = std::wstring(L"\'") + sheet_last + std::wstring(L"\'");
|
||||
}
|
||||
}
|
||||
sheet_last = std::wstring(L":") + sheet_last;
|
||||
}
|
||||
|
||||
return sheet_first + sheet_last;
|
||||
|
||||
@ -95,6 +95,7 @@ namespace STR
|
||||
namespace XMLSTUFF
|
||||
{;
|
||||
|
||||
const std::wstring name2sheet_name(std::wstring name, const std::wstring prefix);
|
||||
const std::wstring xti_indexes2sheet_name(const short tabFirst, const short tabLast, std::vector<std::wstring>& names, const std::wstring prefix = L"");
|
||||
|
||||
}
|
||||
|
||||
@ -79,7 +79,7 @@ void BoundSheet8::readFields(CFRecord& record)
|
||||
hsState = std::wstring (L"hidden");
|
||||
break;
|
||||
case 2:
|
||||
hsState = std::wstring (L"hidden");//(L"veryHidden");
|
||||
hsState = std::wstring (L"veryHidden");
|
||||
break;
|
||||
}
|
||||
if (name_.length() > 31)
|
||||
@ -91,9 +91,11 @@ void BoundSheet8::readFields(CFRecord& record)
|
||||
{//file(6).xls
|
||||
name_ = L"Sheet_" + boost::lexical_cast<std::wstring>(record.getGlobalWorkbookInfo()->current_sheet + 1);
|
||||
}
|
||||
|
||||
record.getGlobalWorkbookInfo()->sheets_names.push_back(name_);
|
||||
record.getGlobalWorkbookInfo()->sheets_state.push_back(hsState);
|
||||
|
||||
GlobalWorkbookInfo::_sheet_info sheet_info;
|
||||
sheet_info.state = hsState;
|
||||
sheet_info.name = name_;
|
||||
record.getGlobalWorkbookInfo()->sheets_info.push_back(sheet_info);
|
||||
|
||||
dt = GETBITS(flags, 8, 15);
|
||||
}
|
||||
|
||||
@ -122,9 +122,9 @@ void DConRef::check_external()
|
||||
{
|
||||
bool bFound = false;
|
||||
|
||||
for (size_t i = 0; !bFilePath && i < global_info_->sheets_names.size(); i++)
|
||||
for (size_t i = 0; !bFilePath && i < global_info_->sheets_info.size(); i++)
|
||||
{
|
||||
if (global_info_->sheets_names[i] == sheet_name)
|
||||
if (global_info_->sheets_info[i].name == sheet_name)
|
||||
{
|
||||
bFound = true;
|
||||
break;
|
||||
|
||||
@ -55,9 +55,9 @@ void DefColWidth::readFields(CFRecord& record)
|
||||
GlobalWorkbookInfoPtr global_info = record.getGlobalWorkbookInfo();
|
||||
record >> cchdefColWidth;
|
||||
|
||||
if (!global_info->sheet_size_info.empty())
|
||||
if (!global_info->sheets_info.empty())
|
||||
{
|
||||
global_info->sheet_size_info.back().defaultColumnWidth = cchdefColWidth ;
|
||||
global_info->sheets_info.back().defaultColumnWidth = cchdefColWidth ;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@ -65,9 +65,9 @@ void DefaultRowHeight::readFields(CFRecord& record)
|
||||
|
||||
record >> miyRw;
|
||||
|
||||
if (!global_info->sheet_size_info.empty())
|
||||
if (!global_info->sheets_info.empty())
|
||||
{
|
||||
global_info->sheet_size_info.back().defaultRowHeight = miyRw / 20.;
|
||||
global_info->sheets_info.back().defaultRowHeight = miyRw / 20.;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@ -35,17 +35,14 @@
|
||||
namespace XLS
|
||||
{
|
||||
|
||||
WsBool::WsBool(const bool is_dialog_sheet)
|
||||
: fDialog(is_dialog_sheet)
|
||||
WsBool::WsBool(bool & is_dialog_sheet) : fDialog(is_dialog_sheet)
|
||||
{
|
||||
}
|
||||
|
||||
|
||||
WsBool::~WsBool()
|
||||
{
|
||||
}
|
||||
|
||||
|
||||
BaseObjectPtr WsBool::clone()
|
||||
{
|
||||
return BaseObjectPtr(new WsBool(*this));
|
||||
@ -56,16 +53,17 @@ void WsBool::readFields(CFRecord& record)
|
||||
{
|
||||
unsigned short flags;
|
||||
record >> flags;
|
||||
|
||||
fShowAutoBreaks = GETBIT(flags, 0);
|
||||
fDialog = GETBIT(flags, 4);
|
||||
fApplyStyles = GETBIT(flags, 5);
|
||||
fRowSumsBelow = GETBIT(flags, 6);
|
||||
fColSumsRight = GETBIT(flags, 7);
|
||||
fFitToPage = GETBIT(flags, 8);
|
||||
fDspGuts = GETBIT(flags, 10);
|
||||
fSyncHoriz = GETBIT(flags, 12);
|
||||
fSyncVert = GETBIT(flags, 13);
|
||||
fAltExprEval = GETBIT(flags, 14);
|
||||
fDialog = GETBIT(flags, 4);
|
||||
fApplyStyles = GETBIT(flags, 5);
|
||||
fRowSumsBelow = GETBIT(flags, 6);
|
||||
fColSumsRight = GETBIT(flags, 7);
|
||||
fFitToPage = GETBIT(flags, 8);
|
||||
fDspGuts = GETBIT(flags, 10);
|
||||
fSyncHoriz = GETBIT(flags, 12);
|
||||
fSyncVert = GETBIT(flags, 13);
|
||||
fAltExprEval = GETBIT(flags, 14);
|
||||
fAltFormulaEntry = GETBIT(flags, 15);
|
||||
}
|
||||
|
||||
|
||||
@ -36,14 +36,12 @@
|
||||
namespace XLS
|
||||
{
|
||||
|
||||
|
||||
// Logical representation of WsBool record in BIFF8
|
||||
class WsBool: public BiffRecord
|
||||
{
|
||||
BIFF_RECORD_DEFINE_TYPE_INFO(WsBool)
|
||||
BASE_OBJECT_DEFINE_CLASS_NAME(WsBool)
|
||||
public:
|
||||
WsBool(const bool is_dialog_sheet);
|
||||
WsBool(bool & is_dialog_sheet);
|
||||
~WsBool();
|
||||
|
||||
BaseObjectPtr clone();
|
||||
@ -53,17 +51,17 @@ public:
|
||||
static const ElementType type = typeWsBool;
|
||||
|
||||
//-----------------------------
|
||||
bool fShowAutoBreaks;
|
||||
bool fDialog;
|
||||
bool fApplyStyles;
|
||||
bool fRowSumsBelow;
|
||||
bool fColSumsRight;
|
||||
bool fFitToPage;
|
||||
bool fDspGuts;
|
||||
bool fSyncHoriz;
|
||||
bool fSyncVert;
|
||||
bool fAltExprEval;
|
||||
bool fAltFormulaEntry;
|
||||
bool fShowAutoBreaks;
|
||||
bool& fDialog;
|
||||
bool fApplyStyles;
|
||||
bool fRowSumsBelow;
|
||||
bool fColSumsRight;
|
||||
bool fFitToPage;
|
||||
bool fDspGuts;
|
||||
bool fSyncHoriz;
|
||||
bool fSyncVert;
|
||||
bool fAltExprEval;
|
||||
bool fAltFormulaEntry;
|
||||
|
||||
|
||||
};
|
||||
|
||||
@ -88,9 +88,9 @@ void NoteSh::load(CFRecord& record)
|
||||
//-----------------------------------------------------------------------
|
||||
void NoteSh::calculate()
|
||||
{
|
||||
XLS::GlobalWorkbookInfo::_sheet_size_info zero;
|
||||
XLS::GlobalWorkbookInfo::_sheet_size_info & sheet_info = global_info->current_sheet >= 0 ?
|
||||
global_info->sheet_size_info[global_info->current_sheet - 1] : zero;
|
||||
XLS::GlobalWorkbookInfo::_sheet_info zero;
|
||||
XLS::GlobalWorkbookInfo::_sheet_info & sheet_info = global_info->current_sheet >= 0 ?
|
||||
global_info->sheets_info[global_info->current_sheet - 1] : zero;
|
||||
|
||||
ref_ = CellRef(row, col, true, true).toString();
|
||||
|
||||
|
||||
@ -79,9 +79,9 @@ void OfficeArtClientAnchorSheet::calculate()
|
||||
{
|
||||
global_info->GetDigitFontSizePixels();
|
||||
|
||||
XLS::GlobalWorkbookInfo::_sheet_size_info zero;
|
||||
XLS::GlobalWorkbookInfo::_sheet_size_info & sheet_info = global_info->current_sheet >= 0 ?
|
||||
global_info->sheet_size_info[global_info->current_sheet - 1] : zero;
|
||||
XLS::GlobalWorkbookInfo::_sheet_info zero;
|
||||
XLS::GlobalWorkbookInfo::_sheet_info & sheet_info = global_info->current_sheet >= 0 ?
|
||||
global_info->sheets_info[global_info->current_sheet - 1] : zero;
|
||||
|
||||
//----------------------------------------------------------------------------------------------------
|
||||
//1 inch = 72 point
|
||||
@ -134,9 +134,9 @@ void OfficeArtClientAnchorSheet::calculate_1()
|
||||
{
|
||||
global_info->GetDigitFontSizePixels();
|
||||
|
||||
XLS::GlobalWorkbookInfo::_sheet_size_info zero;
|
||||
XLS::GlobalWorkbookInfo::_sheet_size_info & sheet_info = global_info->current_sheet >= 0 ?
|
||||
global_info->sheet_size_info[global_info->current_sheet - 1] : zero;
|
||||
XLS::GlobalWorkbookInfo::_sheet_info zero;
|
||||
XLS::GlobalWorkbookInfo::_sheet_info & sheet_info = global_info->current_sheet >= 0 ?
|
||||
global_info->sheets_info[global_info->current_sheet - 1] : zero;
|
||||
|
||||
double kfRow = ( 360000 * 2.54 / 72) / 256. ;
|
||||
double Digit_Width = global_info->defaultDigitFontSize.first;
|
||||
|
||||
@ -114,10 +114,22 @@ void PtgArea3d::assemble(AssemblerStack& ptg_stack, PtgQueue& extra_data, bool f
|
||||
ixti = ixals;
|
||||
if (ixals == 0xffff)
|
||||
{
|
||||
std::wstring prefix = XMLSTUFF::xti_indexes2sheet_name(itabFirst, itabLast, global_info->sheets_names);
|
||||
if (!prefix.empty()) prefix += L"!";
|
||||
std::wstring strRange;
|
||||
if(-1 == itabFirst)
|
||||
{
|
||||
strRange = L"#REF";
|
||||
}
|
||||
else
|
||||
{
|
||||
strRange = XMLSTUFF::name2sheet_name(global_info->sheets_info[itabFirst].name, L"");
|
||||
if (itabFirst != itabLast)
|
||||
{
|
||||
strRange += std::wstring(L":") + XMLSTUFF::name2sheet_name(global_info->sheets_info[itabLast].name, L"");
|
||||
}
|
||||
}
|
||||
if (!strRange.empty()) strRange += L"!";
|
||||
|
||||
ptg_stack.push(prefix + range_ref);
|
||||
ptg_stack.push(strRange + range_ref);
|
||||
}
|
||||
}
|
||||
if (ixti != 0xffff)
|
||||
|
||||
@ -109,10 +109,22 @@ void PtgRef3d::assemble(AssemblerStack& ptg_stack, PtgQueue& extra_data, bool fu
|
||||
ixti = ixals;
|
||||
if (ixals == 0xffff)
|
||||
{
|
||||
std::wstring prefix = XMLSTUFF::xti_indexes2sheet_name(itabFirst, itabLast, global_info->sheets_names);
|
||||
if (!prefix.empty()) prefix += L"!";
|
||||
std::wstring strRange;
|
||||
if(-1 == itabFirst)
|
||||
{
|
||||
strRange = L"#REF";
|
||||
}
|
||||
else
|
||||
{
|
||||
strRange = XMLSTUFF::name2sheet_name(global_info->sheets_info[itabFirst].name, L"");
|
||||
if (itabFirst != itabLast)
|
||||
{
|
||||
strRange += std::wstring(L":") + XMLSTUFF::name2sheet_name(global_info->sheets_info[itabLast].name, L"");
|
||||
}
|
||||
}
|
||||
if (!strRange.empty()) strRange += L"!";
|
||||
|
||||
ptg_stack.push(prefix + cell_ref);
|
||||
ptg_stack.push(strRange + cell_ref);
|
||||
}
|
||||
}
|
||||
if (ixti != 0xffff)
|
||||
|
||||
@ -145,6 +145,7 @@ int AUTOFILTER::serialize(std::wostream & stream)
|
||||
if (it == pGlobalWorkbookInfoPtr->mapDefineNames.end()) return 0;
|
||||
|
||||
int count_columns = info->cEntries;
|
||||
|
||||
size_t ind = pGlobalWorkbookInfoPtr->current_sheet;
|
||||
std::wstring ref;
|
||||
|
||||
@ -159,7 +160,7 @@ int AUTOFILTER::serialize(std::wostream & stream)
|
||||
}
|
||||
if (ref.empty()) return 0;
|
||||
|
||||
std::wstring sheet_name = ind <= pGlobalWorkbookInfoPtr->sheets_names.size() ? pGlobalWorkbookInfoPtr->sheets_names[ind-1] : L"";
|
||||
std::wstring sheet_name = ind <= pGlobalWorkbookInfoPtr->sheets_info.size() ? pGlobalWorkbookInfoPtr->sheets_info[ind-1].name : L"";
|
||||
if (!sheet_name.empty())
|
||||
{
|
||||
int pos = ref.find(sheet_name);
|
||||
|
||||
@ -61,9 +61,9 @@ public:
|
||||
{
|
||||
global_info_ = proc.getGlobalWorkbookInfo();
|
||||
|
||||
XLS::GlobalWorkbookInfo::_sheet_size_info zero;
|
||||
XLS::GlobalWorkbookInfo::_sheet_size_info & sheet_info = global_info_->current_sheet >=0 ?
|
||||
global_info_->sheet_size_info[global_info_->current_sheet - 1] : zero;
|
||||
XLS::GlobalWorkbookInfo::_sheet_info zero;
|
||||
XLS::GlobalWorkbookInfo::_sheet_info & sheet_info = global_info_->current_sheet >=0 ?
|
||||
global_info_->sheets_info[global_info_->current_sheet - 1] : zero;
|
||||
|
||||
int count, count_row = 0;
|
||||
|
||||
@ -175,9 +175,9 @@ struct _CompareColumnCell
|
||||
|
||||
int CELL_GROUP::serialize(std::wostream & stream)
|
||||
{
|
||||
XLS::GlobalWorkbookInfo::_sheet_size_info zero;
|
||||
XLS::GlobalWorkbookInfo::_sheet_size_info & sheet_info = global_info_->current_sheet >=0 ?
|
||||
global_info_->sheet_size_info[global_info_->current_sheet - 1] : zero;
|
||||
XLS::GlobalWorkbookInfo::_sheet_info zero;
|
||||
XLS::GlobalWorkbookInfo::_sheet_info & sheet_info = global_info_->current_sheet >=0 ?
|
||||
global_info_->sheets_info[global_info_->current_sheet - 1] : zero;
|
||||
|
||||
CP_XML_WRITER(stream)
|
||||
{
|
||||
|
||||
@ -56,7 +56,8 @@ const bool CHART::loadContent(BinProcessor& proc)
|
||||
{
|
||||
return false;
|
||||
}
|
||||
if(!proc.mandatory<ChartSheetSubstream>())
|
||||
ChartSheetSubstream chart_sheet(-1);
|
||||
if(!proc.mandatory(chart_sheet))
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
@ -77,10 +77,10 @@ const bool COLUMNS::loadContent(BinProcessor& proc)
|
||||
|
||||
for (int i = column_info->colFirst; i <= column_info->colLast; i++)
|
||||
{
|
||||
global_info_->sheet_size_info.back().customColumnsWidth.insert(std::make_pair(i, column_info->coldx / 256.));
|
||||
global_info_->sheets_info.back().customColumnsWidth.insert(std::make_pair(i, column_info->coldx / 256.));
|
||||
//else if (def_ok)
|
||||
//{
|
||||
// global_info_->sheet_size_info.back().customColumnsWidth.insert(std::make_pair(i, global_info_->sheet_size_info.back().defaultColumnWidth));
|
||||
// global_info_->sheets_info.back().customColumnsWidth.insert(std::make_pair(i, global_info_->sheets_info.back().defaultColumnWidth));
|
||||
//}
|
||||
}
|
||||
|
||||
|
||||
@ -31,34 +31,33 @@
|
||||
*/
|
||||
|
||||
#include "GLOBALS.h"
|
||||
#include <Logic/Biff_records/DefColWidth.h>
|
||||
#include <Logic/Biff_records/DxGCol.h>
|
||||
|
||||
#include <Logic/Biff_records/Protect.h>
|
||||
#include <Logic/Biff_records/CalcMode.h>
|
||||
#include <Logic/Biff_records/CalcCount.h>
|
||||
#include <Logic/Biff_records/CalcRefMode.h>
|
||||
#include <Logic/Biff_records/CalcIter.h>
|
||||
#include <Logic/Biff_records/CalcDelta.h>
|
||||
#include <Logic/Biff_records/CalcSaveRecalc.h>
|
||||
#include <Logic/Biff_records/PrintRowCol.h>
|
||||
#include <Logic/Biff_records/PrintGrid.h>
|
||||
#include <Logic/Biff_records/GridSet.h>
|
||||
#include <Logic/Biff_records/Guts.h>
|
||||
#include <Logic/Biff_records/DefaultRowHeight.h>
|
||||
#include <Logic/Biff_records/WsBool.h>
|
||||
#include <Logic/Biff_records/Sync.h>
|
||||
#include <Logic/Biff_records/LPr.h>
|
||||
#include <Logic/Biff_records/HorizontalPageBreaks.h>
|
||||
#include <Logic/Biff_records/VerticalPageBreaks.h>
|
||||
#include <Logic/Biff_records/Country.h>
|
||||
#include "../Biff_records/DefColWidth.h"
|
||||
#include "../Biff_records/DxGCol.h"
|
||||
#include "../Biff_records/Protect.h"
|
||||
#include "../Biff_records/CalcMode.h"
|
||||
#include "../Biff_records/CalcCount.h"
|
||||
#include "../Biff_records/CalcRefMode.h"
|
||||
#include "../Biff_records/CalcIter.h"
|
||||
#include "../Biff_records/CalcDelta.h"
|
||||
#include "../Biff_records/CalcSaveRecalc.h"
|
||||
#include "../Biff_records/PrintRowCol.h"
|
||||
#include "../Biff_records/PrintGrid.h"
|
||||
#include "../Biff_records/GridSet.h"
|
||||
#include "../Biff_records/Guts.h"
|
||||
#include "../Biff_records/DefaultRowHeight.h"
|
||||
#include "../Biff_records/WsBool.h"
|
||||
#include "../Biff_records/Sync.h"
|
||||
#include "../Biff_records/LPr.h"
|
||||
#include "../Biff_records/HorizontalPageBreaks.h"
|
||||
#include "../Biff_records/VerticalPageBreaks.h"
|
||||
#include "../Biff_records/Country.h"
|
||||
|
||||
namespace XLS
|
||||
{
|
||||
|
||||
|
||||
GLOBALS::GLOBALS(const bool is_dialog_sheet)
|
||||
: is_dialog(is_dialog_sheet)
|
||||
GLOBALS::GLOBALS() : is_dialog(false)
|
||||
{
|
||||
}
|
||||
|
||||
|
||||
@ -40,12 +40,12 @@ class GLOBALS: public CompositeObject
|
||||
{
|
||||
BASE_OBJECT_DEFINE_CLASS_NAME(GLOBALS)
|
||||
public:
|
||||
GLOBALS(const bool is_dialog_sheet);
|
||||
GLOBALS();
|
||||
~GLOBALS();
|
||||
|
||||
BaseObjectPtr clone();
|
||||
|
||||
virtual const bool loadContent (BinProcessor& proc);
|
||||
virtual const bool loadContent (BinProcessor& proc);
|
||||
|
||||
static const ElementType type = typeGLOBALS;
|
||||
|
||||
|
||||
@ -101,7 +101,7 @@ namespace XLS
|
||||
{;
|
||||
|
||||
|
||||
ChartSheetSubstream::ChartSheetSubstream()
|
||||
ChartSheetSubstream::ChartSheetSubstream(const size_t ws_index) : ws_index_(ws_index)
|
||||
{
|
||||
}
|
||||
|
||||
@ -126,7 +126,7 @@ CHARTSHEETCONTENT = [WriteProtect] [SheetExt] [WebPub] *HFPicture PAGESETUP Prin
|
||||
*/
|
||||
const bool ChartSheetSubstream::loadContent(BinProcessor& proc)
|
||||
{
|
||||
pGlobalWorkbookInfo = proc.getGlobalWorkbookInfo();
|
||||
global_info_ = proc.getGlobalWorkbookInfo();
|
||||
|
||||
int count = 0 ;
|
||||
|
||||
@ -507,7 +507,7 @@ int ChartSheetSubstream::serialize(std::wostream & _stream)
|
||||
|
||||
if (chart_rect)
|
||||
{
|
||||
pGlobalWorkbookInfo->xls_converter->xlsx_context->get_drawing_context().set_absolute_anchor(
|
||||
global_info_->xls_converter->xlsx_context->get_drawing_context().set_absolute_anchor(
|
||||
0, 0, chart_rect->dx.dVal, chart_rect->dy.dVal);
|
||||
|
||||
}
|
||||
|
||||
@ -44,12 +44,11 @@ class CRT;
|
||||
class ChartSheetSubstream;
|
||||
typedef boost::shared_ptr<ChartSheetSubstream> ChartSheetSubstreamPtr;
|
||||
|
||||
// Logical representation of ChartSheetSubstream union of records
|
||||
class ChartSheetSubstream: public CompositeObject
|
||||
{
|
||||
BASE_OBJECT_DEFINE_CLASS_NAME(ChartSheetSubstream)
|
||||
public:
|
||||
ChartSheetSubstream();
|
||||
ChartSheetSubstream(const size_t ws_index);
|
||||
~ChartSheetSubstream();
|
||||
|
||||
BaseObjectPtr clone();
|
||||
@ -69,6 +68,10 @@ public:
|
||||
|
||||
static const ElementType type = typeChartSheetSubstream;
|
||||
|
||||
|
||||
GlobalWorkbookInfoPtr global_info_;
|
||||
size_t ws_index_;
|
||||
|
||||
BaseObjectPtr m_BACKGROUND;
|
||||
std::vector<BaseObjectPtr> m_arFbi;
|
||||
BaseObjectPtr m_CHARTFORMATS;
|
||||
@ -90,8 +93,6 @@ private:
|
||||
void recalc(SERIESDATA* data);
|
||||
|
||||
std::unordered_map<int, std::vector<int>> m_mapTypeChart;
|
||||
|
||||
GlobalWorkbookInfoPtr pGlobalWorkbookInfo;
|
||||
};
|
||||
|
||||
} // namespace XLS
|
||||
|
||||
@ -221,8 +221,8 @@ void GlobalWorkbookInfo::GetDigitFontSizePixels()
|
||||
|
||||
void GlobalWorkbookInfo::CalculateAnchor(int colL, int colR, int rwT, int rwB, _UINT32 & x, _UINT32 &y, _UINT32 &cx, _UINT32 & cy)
|
||||
{
|
||||
_sheet_size_info zero;
|
||||
_sheet_size_info & sheet_info = current_sheet >= 0 ? sheet_size_info[current_sheet - 1] : zero;
|
||||
_sheet_info zero;
|
||||
_sheet_info & sheet_info = current_sheet >= 0 ? sheets_info[current_sheet - 1] : zero;
|
||||
|
||||
GetDigitFontSizePixels();
|
||||
|
||||
|
||||
@ -89,9 +89,6 @@ public:
|
||||
CRYPT::DecryptorPtr decryptor;
|
||||
std::wstring password;
|
||||
|
||||
std::vector<std::wstring> sheets_state;
|
||||
std::vector<std::wstring> sheets_names;
|
||||
|
||||
boost::unordered_map<BorderInfo, int> border_x_ids;
|
||||
boost::unordered_map<FillInfo, int> fill_x_ids;
|
||||
|
||||
@ -141,18 +138,18 @@ public:
|
||||
unsigned int startAddedSharedStrings;
|
||||
std::vector<std::wstring> arAddedSharedStrings;
|
||||
|
||||
|
||||
struct _sheet_size_info
|
||||
struct _sheet_info
|
||||
{
|
||||
std::wstring state;
|
||||
std::wstring name;
|
||||
|
||||
std::map<int, double> customColumnsWidth;
|
||||
std::map<int, double> customRowsHeight;
|
||||
|
||||
double defaultColumnWidth = 8.0;
|
||||
double defaultRowHeight = 14.4;
|
||||
|
||||
bool bMacrosSheet = false;
|
||||
};
|
||||
std::vector<_sheet_size_info> sheet_size_info;
|
||||
std::vector<_sheet_info> sheets_info;
|
||||
|
||||
std::pair<float, float> defaultDigitFontSize;
|
||||
CApplicationFonts *applicationFonts;
|
||||
|
||||
@ -140,8 +140,7 @@ static const int aCodePages[][2] = {
|
||||
255, 850//OEM
|
||||
};
|
||||
|
||||
GlobalsSubstream::GlobalsSubstream(const unsigned short code_page)
|
||||
: code_page_(code_page)
|
||||
GlobalsSubstream::GlobalsSubstream(const unsigned short code_page) : code_page_(code_page)
|
||||
{
|
||||
}
|
||||
|
||||
@ -653,7 +652,20 @@ void GlobalsSubstream::UpdateXti()
|
||||
{
|
||||
if (info->rgst.empty() && index_book->nExternIndex < 0)
|
||||
{
|
||||
val.link = XMLSTUFF::xti_indexes2sheet_name(xti->itabFirst, xti->itabLast, global_info_->sheets_names);
|
||||
std::wstring strRange;
|
||||
if(-1 == xti->itabFirst)
|
||||
{
|
||||
strRange = L"#REF";
|
||||
}
|
||||
else
|
||||
{
|
||||
strRange = XMLSTUFF::name2sheet_name(global_info_->sheets_info[xti->itabFirst].name, L"");
|
||||
if (xti->itabFirst != xti->itabLast)
|
||||
{
|
||||
strRange += std::wstring(L":") + XMLSTUFF::name2sheet_name(global_info_->sheets_info[xti->itabLast].name, L"");
|
||||
}
|
||||
}
|
||||
val.link = strRange;
|
||||
}
|
||||
else
|
||||
{
|
||||
|
||||
@ -31,42 +31,43 @@
|
||||
*/
|
||||
|
||||
#include "MacroSheetSubstream.h"
|
||||
#include <Logic/Biff_records/BOF.h>
|
||||
#include <Logic/Biff_records/Uncalced.h>
|
||||
#include <Logic/Biff_records/Index.h>
|
||||
#include <Logic/Biff_records/Intl.h>
|
||||
#include <Logic/Biff_records/HeaderFooter.h>
|
||||
#include <Logic/Biff_records/Dimensions.h>
|
||||
#include <Logic/Biff_records/HFPicture.h>
|
||||
#include <Logic/Biff_records/Note.h>
|
||||
#include <Logic/Biff_records/DxGCol.h>
|
||||
#include <Logic/Biff_records/CodeName.h>
|
||||
#include <Logic/Biff_records/CellWatch.h>
|
||||
#include <Logic/Biff_records/SheetExt.h>
|
||||
#include <Logic/Biff_records/EOF.h>
|
||||
|
||||
#include <Logic/Biff_unions/MACROSORTANDFILTER.h>
|
||||
#include <Logic/Biff_unions/GLOBALS.h>
|
||||
#include <Logic/Biff_unions/PAGESETUP.h>
|
||||
#include <Logic/Biff_unions/BACKGROUND.h>
|
||||
#include <Logic/Biff_unions/BIGNAME.h>
|
||||
#include <Logic/Biff_unions/PROTECTION_COMMON.h>
|
||||
#include <Logic/Biff_unions/COLUMNS.h>
|
||||
#include <Logic/Biff_unions/CELLTABLE.h>
|
||||
#include <Logic/Biff_unions/OBJECTS.h>
|
||||
#include <Logic/Biff_unions/DCON.h>
|
||||
#include <Logic/Biff_unions/WINDOW.h>
|
||||
#include <Logic/Biff_unions/CUSTOMVIEW.h>
|
||||
#include <Logic/Biff_unions/SORT.h>
|
||||
#include <Logic/Biff_unions/PHONETICINFO.h>
|
||||
#include <Logic/Biff_unions/FEAT.h>
|
||||
#include <Logic/Biff_unions/RECORD12.h>
|
||||
#include "Biff_records/BOF.h"
|
||||
#include "Biff_records/Uncalced.h"
|
||||
#include "Biff_records/Index.h"
|
||||
#include "Biff_records/Intl.h"
|
||||
#include "Biff_records/HeaderFooter.h"
|
||||
#include "Biff_records/Dimensions.h"
|
||||
#include "Biff_records/HFPicture.h"
|
||||
#include "Biff_records/Note.h"
|
||||
#include "Biff_records/DxGCol.h"
|
||||
#include "Biff_records/CodeName.h"
|
||||
#include "Biff_records/CellWatch.h"
|
||||
#include "Biff_records/SheetExt.h"
|
||||
#include "Biff_records/EOF.h"
|
||||
|
||||
#include "Biff_unions/MACROSORTANDFILTER.h"
|
||||
#include "Biff_unions/GLOBALS.h"
|
||||
#include "Biff_unions/PAGESETUP.h"
|
||||
#include "Biff_unions/BACKGROUND.h"
|
||||
#include "Biff_unions/BIGNAME.h"
|
||||
#include "Biff_unions/PROTECTION_COMMON.h"
|
||||
#include "Biff_unions/COLUMNS.h"
|
||||
#include "Biff_unions/CELLTABLE.h"
|
||||
#include "Biff_unions/OBJECTS.h"
|
||||
#include "Biff_unions/DCON.h"
|
||||
#include "Biff_unions/WINDOW.h"
|
||||
#include "Biff_unions/CUSTOMVIEW.h"
|
||||
#include "Biff_unions/SORT.h"
|
||||
#include "Biff_unions/PHONETICINFO.h"
|
||||
#include "Biff_unions/FEAT.h"
|
||||
#include "Biff_unions/RECORD12.h"
|
||||
|
||||
namespace XLS
|
||||
{;
|
||||
|
||||
|
||||
MacroSheetSubstream::MacroSheetSubstream()
|
||||
MacroSheetSubstream::MacroSheetSubstream(const size_t ws_index) : ws_index_(ws_index)
|
||||
{
|
||||
}
|
||||
|
||||
@ -98,38 +99,58 @@ const bool MacroSheetSubstream::loadContent(BinProcessor& proc)
|
||||
}
|
||||
global_info_ = proc.getGlobalWorkbookInfo();
|
||||
|
||||
GlobalWorkbookInfo::_sheet_size_info sheet_size_info;
|
||||
|
||||
global_info_->sheet_size_info.push_back(sheet_size_info);
|
||||
global_info_->current_sheet = global_info_->sheet_size_info.size();
|
||||
|
||||
global_info_->sheet_size_info.back().bMacrosSheet = true;
|
||||
global_info_->current_sheet = global_info_->sheets_info.size();
|
||||
|
||||
proc.optional<Uncalced>();
|
||||
proc.mandatory<Index>();
|
||||
proc.optional<Intl>();
|
||||
|
||||
GLOBALS globals(false);
|
||||
if (proc.mandatory(globals)) // not dialog
|
||||
if (proc.mandatory<GLOBALS>())
|
||||
{
|
||||
m_GLOBALS = elements_.back();
|
||||
elements_.pop_back();
|
||||
}
|
||||
int count = 0;
|
||||
|
||||
proc.mandatory<PAGESETUP>();
|
||||
if (proc.mandatory<PAGESETUP>())
|
||||
{
|
||||
m_PAGESETUP = elements_.back();
|
||||
elements_.pop_back();
|
||||
}
|
||||
proc.optional<HeaderFooter>();
|
||||
proc.optional<BACKGROUND>();
|
||||
|
||||
if (proc.optional<BACKGROUND>())
|
||||
{
|
||||
m_BACKGROUND = elements_.back();
|
||||
elements_.pop_back();
|
||||
}
|
||||
proc.repeated<BIGNAME>(0, 0);
|
||||
proc.optional<PROTECTION_COMMON>();
|
||||
proc.mandatory<COLUMNS>();
|
||||
|
||||
proc.mandatory<MACROSORTANDFILTER>();
|
||||
proc.mandatory<Dimensions>();
|
||||
if (proc.mandatory<COLUMNS>())
|
||||
{
|
||||
m_COLUMNS = elements_.back();
|
||||
elements_.pop_back();
|
||||
}
|
||||
|
||||
if (proc.mandatory<MACROSORTANDFILTER>())
|
||||
{
|
||||
m_MACROSORTANDFILTER = elements_.back();
|
||||
elements_.pop_back();
|
||||
}
|
||||
if (proc.mandatory<Dimensions>())
|
||||
{
|
||||
m_Dimensions = elements_.back();
|
||||
elements_.pop_back();
|
||||
}
|
||||
|
||||
std::vector<CellRangeRef> shared_formulas_locations;
|
||||
CELLTABLE cell_table(shared_formulas_locations);
|
||||
proc.optional(cell_table);
|
||||
std::vector<CellRangeRef> shared_formulas_locations;
|
||||
CELLTABLE cell_table(shared_formulas_locations);
|
||||
if (proc.optional(cell_table))
|
||||
{
|
||||
m_CELLTABLE = elements_.back();
|
||||
elements_.pop_back();
|
||||
}
|
||||
|
||||
OBJECTS objects(false);
|
||||
if (proc.mandatory(objects))
|
||||
@ -138,10 +159,34 @@ const bool MacroSheetSubstream::loadContent(BinProcessor& proc)
|
||||
elements_.pop_back();
|
||||
}
|
||||
|
||||
proc.repeated<HFPicture>(0, 0);
|
||||
proc.repeated<Note>(0, 0);
|
||||
proc.optional<DCON>();
|
||||
proc.repeated<WINDOW>(1, 0);
|
||||
count = proc.repeated<HFPicture>(0, 0);
|
||||
while(count > 0)
|
||||
{
|
||||
m_arHFPicture.insert(m_arHFPicture.begin(), elements_.back());
|
||||
elements_.pop_back();
|
||||
count--;
|
||||
}
|
||||
|
||||
count = proc.repeated<Note>(0, 0);
|
||||
while(count > 0)
|
||||
{
|
||||
m_arNote.insert(m_arNote.begin(), elements_.back());
|
||||
elements_.pop_back();
|
||||
count--;
|
||||
}
|
||||
if (proc.optional<DCON>())
|
||||
{
|
||||
m_DCON = elements_.back();
|
||||
elements_.pop_back();
|
||||
}
|
||||
|
||||
count = proc.repeated<WINDOW>(0, 0);
|
||||
while(count > 0)
|
||||
{
|
||||
m_arWINDOW.insert(m_arWINDOW.begin(), elements_.back());
|
||||
elements_.pop_back();
|
||||
count--;
|
||||
}
|
||||
|
||||
count = proc.repeated<CUSTOMVIEW>(0, 0);
|
||||
while(count > 0)
|
||||
@ -150,9 +195,24 @@ const bool MacroSheetSubstream::loadContent(BinProcessor& proc)
|
||||
elements_.pop_back();
|
||||
count--;
|
||||
}
|
||||
proc.repeated<SORT>(0, 2);
|
||||
proc.optional<DxGCol>();
|
||||
count = proc.repeated<SORT>(0, 2);
|
||||
while(count > 0)
|
||||
{
|
||||
m_arSORT.insert(m_arSORT.begin(), elements_.back());
|
||||
elements_.pop_back();
|
||||
count--;
|
||||
}
|
||||
if (proc.optional<DxGCol>())
|
||||
{
|
||||
m_DxGCol = elements_.back();
|
||||
elements_.pop_back();
|
||||
|
||||
DxGCol* dx = dynamic_cast<DxGCol*>(m_DxGCol.get());
|
||||
global_info_->sheets_info.back().defaultColumnWidth = dx->dxgCol / 256.;
|
||||
}
|
||||
|
||||
proc.optional<PHONETICINFO>();
|
||||
|
||||
if (proc.optional<CodeName>())
|
||||
{
|
||||
m_CodeName = elements_.back();
|
||||
@ -164,8 +224,20 @@ const bool MacroSheetSubstream::loadContent(BinProcessor& proc)
|
||||
m_SheetExt = elements_.back();
|
||||
elements_.pop_back();
|
||||
}
|
||||
proc.repeated<FEAT>(0, 0);
|
||||
proc.repeated<RECORD12>(0, 0);
|
||||
count = proc.repeated<FEAT> (0, 0);
|
||||
while(count > 0)
|
||||
{
|
||||
m_arFEAT.insert(m_arFEAT.begin(), elements_.back());
|
||||
elements_.pop_back();
|
||||
count--;
|
||||
}
|
||||
count = proc.repeated<RECORD12> (0, 0);
|
||||
while(count > 0)
|
||||
{
|
||||
m_arRECORD12.insert(m_arRECORD12.begin(), elements_.back());
|
||||
elements_.pop_back();
|
||||
count--;
|
||||
}
|
||||
proc.mandatory<EOF_T>();
|
||||
|
||||
return true;
|
||||
|
||||
@ -43,7 +43,7 @@ class MacroSheetSubstream: public CompositeObject
|
||||
{
|
||||
BASE_OBJECT_DEFINE_CLASS_NAME(MacroSheetSubstream)
|
||||
public:
|
||||
MacroSheetSubstream();
|
||||
MacroSheetSubstream(const size_t ws_index);
|
||||
~MacroSheetSubstream();
|
||||
|
||||
BaseObjectPtr clone();
|
||||
@ -52,16 +52,29 @@ public:
|
||||
|
||||
static const ElementType type = typeMacroSheetSubstream;
|
||||
|
||||
BaseObjectPtr m_GLOBALS;
|
||||
BaseObjectPtr m_OBJECTS;
|
||||
|
||||
std::vector<BaseObjectPtr> m_arCUSTOMVIEW;
|
||||
|
||||
BaseObjectPtr m_SheetExt;
|
||||
BaseObjectPtr m_CodeName;
|
||||
|
||||
GlobalWorkbookInfoPtr global_info_;
|
||||
|
||||
size_t ws_index_;
|
||||
|
||||
BaseObjectPtr m_PAGESETUP;
|
||||
BaseObjectPtr m_BACKGROUND;
|
||||
BaseObjectPtr m_GLOBALS;
|
||||
BaseObjectPtr m_OBJECTS;
|
||||
BaseObjectPtr m_SheetExt;
|
||||
BaseObjectPtr m_CodeName;
|
||||
BaseObjectPtr m_DxGCol;
|
||||
BaseObjectPtr m_DCON;
|
||||
BaseObjectPtr m_Dimensions;
|
||||
BaseObjectPtr m_CELLTABLE;
|
||||
BaseObjectPtr m_COLUMNS;
|
||||
BaseObjectPtr m_MACROSORTANDFILTER;
|
||||
|
||||
std::vector<BaseObjectPtr> m_arWINDOW;
|
||||
std::vector<BaseObjectPtr> m_arCUSTOMVIEW;
|
||||
std::vector<BaseObjectPtr> m_arFEAT;
|
||||
std::vector<BaseObjectPtr> m_arSORT;
|
||||
std::vector<BaseObjectPtr> m_arHFPicture;
|
||||
std::vector<BaseObjectPtr> m_arRECORD12;
|
||||
std::vector<BaseObjectPtr> m_arNote;
|
||||
};
|
||||
|
||||
} // namespace XLS
|
||||
|
||||
@ -46,18 +46,16 @@
|
||||
namespace XLS
|
||||
{;
|
||||
|
||||
WorkbookStreamObject::WorkbookStreamObject()
|
||||
: code_page_(DefaultCodePage)
|
||||
WorkbookStreamObject::WorkbookStreamObject() : code_page_(DefaultCodePage)
|
||||
{
|
||||
}
|
||||
|
||||
|
||||
WorkbookStreamObject::WorkbookStreamObject(const unsigned short code_page)
|
||||
: code_page_(code_page)
|
||||
WorkbookStreamObject::WorkbookStreamObject(const unsigned short code_page) : code_page_(code_page)
|
||||
{
|
||||
}
|
||||
|
||||
void WorkbookStreamObject::set_code_page(const unsigned short code_page)
|
||||
void WorkbookStreamObject::set_code_page(const unsigned short code_page)
|
||||
{
|
||||
code_page_ = code_page;
|
||||
}
|
||||
@ -76,16 +74,22 @@ BaseObjectPtr WorkbookStreamObject::clone()
|
||||
|
||||
const bool WorkbookStreamObject::loadContent(BinProcessor& proc)
|
||||
{
|
||||
bool to_continue = true;
|
||||
|
||||
bool GlobalsSubstream_found = false;
|
||||
bool WorksheetSubstream_found = false;
|
||||
GlobalWorkbookInfoPtr global_info_ = proc.getGlobalWorkbookInfo();
|
||||
|
||||
bool GlobalsSubstream_found = false;
|
||||
bool WorksheetSubstream_found = false;
|
||||
|
||||
size_t ws_index = 0;
|
||||
|
||||
while(to_continue)
|
||||
GlobalWorkbookInfo::_sheet_info sheet_info;
|
||||
sheet_info.state = L"visible";
|
||||
|
||||
while(true)
|
||||
{
|
||||
unsigned short substream_type = 0;
|
||||
to_continue = proc.getNextSubstreamType(substream_type);
|
||||
|
||||
if (!proc.getNextSubstreamType(substream_type))
|
||||
break;
|
||||
|
||||
switch(substream_type)
|
||||
{
|
||||
@ -115,7 +119,11 @@ const bool WorkbookStreamObject::loadContent(BinProcessor& proc)
|
||||
return false;
|
||||
}
|
||||
Log::event("Worksheet or Dialog substream detected");
|
||||
WorksheetSubstream worksheet_substream(ws_index++);
|
||||
|
||||
if (ws_index >= global_info_->sheets_info.size())
|
||||
global_info_->sheets_info.push_back(sheet_info);
|
||||
|
||||
WorksheetSubstream worksheet_substream(ws_index++);
|
||||
if ((proc.mandatory(worksheet_substream)) && (elements_.size() > 0))
|
||||
{
|
||||
WorksheetSubstream_found = true;
|
||||
@ -132,11 +140,16 @@ const bool WorkbookStreamObject::loadContent(BinProcessor& proc)
|
||||
return false;
|
||||
}
|
||||
Log::event("Chart substream detected");
|
||||
if ((proc.mandatory<ChartSheetSubstream>()) && (elements_.size() > 0))
|
||||
|
||||
if (ws_index >= global_info_->sheets_info.size())
|
||||
global_info_->sheets_info.push_back(sheet_info);
|
||||
|
||||
ChartSheetSubstream chartsheet_substream(ws_index++);
|
||||
if ((proc.mandatory(chartsheet_substream)) && (elements_.size() > 0))
|
||||
{
|
||||
WorksheetSubstream_found = true;
|
||||
|
||||
m_arWorksheetSubstream.push_back(elements_.back()); elements_.pop_back();
|
||||
m_arChartSheetSubstream.push_back(elements_.back()); elements_.pop_back();
|
||||
}
|
||||
}
|
||||
break;
|
||||
@ -148,7 +161,12 @@ const bool WorkbookStreamObject::loadContent(BinProcessor& proc)
|
||||
return false;
|
||||
}
|
||||
Log::event("Macro substream detected");
|
||||
if ((proc.mandatory<MacroSheetSubstream>()) && (elements_.size() > 0))
|
||||
|
||||
if (ws_index >= global_info_->sheets_info.size())
|
||||
global_info_->sheets_info.push_back(sheet_info);
|
||||
|
||||
MacroSheetSubstream macrosheet_substream(ws_index++);
|
||||
if ((proc.mandatory(macrosheet_substream)) && (elements_.size() > 0))
|
||||
{
|
||||
WorksheetSubstream_found = true;
|
||||
|
||||
|
||||
@ -62,6 +62,7 @@ public:
|
||||
|
||||
std::vector<BaseObjectPtr> m_arWorksheetSubstream;
|
||||
std::vector<BaseObjectPtr> m_arMacroSheetSubstream;
|
||||
std::vector<BaseObjectPtr> m_arChartSheetSubstream;
|
||||
|
||||
unsigned short code_page_;
|
||||
};
|
||||
|
||||
@ -81,8 +81,7 @@ namespace XLS
|
||||
{;
|
||||
|
||||
|
||||
WorksheetSubstream::WorksheetSubstream(const size_t ws_index)
|
||||
: ws_index_(ws_index)
|
||||
WorksheetSubstream::WorksheetSubstream(const size_t ws_index) : ws_index_(ws_index)
|
||||
{
|
||||
}
|
||||
|
||||
@ -110,10 +109,7 @@ const bool WorksheetSubstream::loadContent(BinProcessor& proc)
|
||||
{
|
||||
global_info_ = proc.getGlobalWorkbookInfo();
|
||||
|
||||
GlobalWorkbookInfo::_sheet_size_info sheet_size_info;
|
||||
|
||||
global_info_->sheet_size_info.push_back(sheet_size_info);
|
||||
global_info_->current_sheet = global_info_->sheet_size_info.size();
|
||||
global_info_->current_sheet = global_info_->sheets_info.size();
|
||||
|
||||
global_info_->cmt_rules = 0;
|
||||
|
||||
@ -145,8 +141,7 @@ const bool WorksheetSubstream::loadContent(BinProcessor& proc)
|
||||
case rt_CalcMode:
|
||||
case rt_PrintRowCol:
|
||||
{
|
||||
GLOBALS globals(false);
|
||||
if (proc.mandatory(globals))
|
||||
if (proc.mandatory<GLOBALS>())
|
||||
{
|
||||
m_GLOBALS = elements_.back();
|
||||
elements_.pop_back();
|
||||
@ -336,7 +331,7 @@ const bool WorksheetSubstream::loadContent(BinProcessor& proc)
|
||||
elements_.pop_back();
|
||||
|
||||
DxGCol* dx = dynamic_cast<DxGCol*>(m_DxGCol.get());
|
||||
global_info_->sheet_size_info.back().defaultColumnWidth = dx->dxgCol / 256.;
|
||||
global_info_->sheets_info.back().defaultColumnWidth = dx->dxgCol / 256.;
|
||||
}
|
||||
}break;
|
||||
case rt_MergeCells:
|
||||
|
||||
@ -39,6 +39,7 @@
|
||||
#include "../XlsFormat/Logic/WorksheetSubstream.h"
|
||||
#include "../XlsFormat/Logic/GlobalsSubstream.h"
|
||||
#include "../XlsFormat/Logic/ChartSheetSubstream.h"
|
||||
#include "../XlsFormat/Logic/MacroSheetSubstream.h"
|
||||
|
||||
#include "../XlsFormat/Logic/BinProcessor.h"
|
||||
#include "../XlsFormat/Logic/SummaryInformationStream/SummaryInformation.h"
|
||||
@ -71,6 +72,7 @@
|
||||
#include "../XlsFormat/Logic/Biff_records/TxO.h"
|
||||
#include "../XlsFormat/Logic/Biff_records/IMDATA.h"
|
||||
#include "../XlsFormat/Logic/Biff_records/Note.h"
|
||||
#include "../XlsFormat/Logic/Biff_records/WsBool.h"
|
||||
|
||||
#include "../XlsFormat/Logic/Biff_structures/URLMoniker.h"
|
||||
#include "../XlsFormat/Logic/Biff_structures/FileMoniker.h"
|
||||
@ -382,7 +384,7 @@ void XlsConverter::convert(XLS::BaseObject *xls_unknown)
|
||||
case XLS::typeOBJECTS:
|
||||
{
|
||||
XLS::OBJECTS * obj = dynamic_cast<XLS::OBJECTS*>(xls_unknown);
|
||||
convert(obj);
|
||||
convert(obj, NULL);
|
||||
}break;
|
||||
case XLS::typeTxO:
|
||||
{
|
||||
@ -412,34 +414,25 @@ void XlsConverter::convert(XLS::WorkbookStreamObject* woorkbook)
|
||||
|
||||
convert(dynamic_cast<XLS::GlobalsSubstream*>(woorkbook->m_GlobalsSubstream.get()));
|
||||
|
||||
int count_sheets = 0, count_chart_sheets = 0;
|
||||
for (size_t i = 0 ; i < woorkbook->m_arWorksheetSubstream.size(); i++)
|
||||
{
|
||||
if (woorkbook->m_arWorksheetSubstream[i]->get_type() == XLS::typeWorksheetSubstream)
|
||||
{
|
||||
count_sheets++;
|
||||
xls_global_info->current_sheet = count_sheets;
|
||||
|
||||
xlsx_context->start_table(xls_global_info->sheets_names.size() > i ? xls_global_info->sheets_names[i] : L"Sheet_" + std::to_wstring(count_sheets));
|
||||
xlsx_context->set_state(xls_global_info->sheets_state.size() > i ? xls_global_info->sheets_state[i] : L"visible");
|
||||
|
||||
xlsx_context->start_table();
|
||||
convert(dynamic_cast<XLS::WorksheetSubstream*>(woorkbook->m_arWorksheetSubstream[i].get()));
|
||||
}
|
||||
else if (woorkbook->m_arWorksheetSubstream[i]->get_type() == XLS::typeChartSheetSubstream)
|
||||
{
|
||||
count_chart_sheets++;
|
||||
xls_global_info->current_sheet = -1;
|
||||
xlsx_context->start_table(xls_global_info->sheets_names.size() > i ? xls_global_info->sheets_names[i] : L"ChartSheet_" + std::to_wstring(count_chart_sheets));
|
||||
|
||||
xlsx_context->set_chart_view();
|
||||
|
||||
XLS::ChartSheetSubstream* chart = dynamic_cast<XLS::ChartSheetSubstream*>(woorkbook->m_arWorksheetSubstream[i].get());
|
||||
|
||||
convert_chart_sheet(chart);
|
||||
}
|
||||
|
||||
xlsx_context->end_table();
|
||||
}
|
||||
for (size_t i = 0 ; i < woorkbook->m_arChartSheetSubstream.size(); i++)
|
||||
{
|
||||
xlsx_context->start_table();
|
||||
convert_chart_sheet(dynamic_cast<XLS::ChartSheetSubstream*>(woorkbook->m_arChartSheetSubstream[i].get()));
|
||||
xlsx_context->end_table();
|
||||
}
|
||||
for (size_t i = 0 ; i < woorkbook->m_arMacroSheetSubstream.size(); i++)
|
||||
{
|
||||
xlsx_context->start_table();
|
||||
convert(dynamic_cast<XLS::MacroSheetSubstream*>(woorkbook->m_arMacroSheetSubstream[i].get()));
|
||||
xlsx_context->end_table();
|
||||
}
|
||||
|
||||
for (std::list<XLS::BaseObjectPtr>::iterator it = woorkbook->elements_.begin(); it != woorkbook->elements_.end(); it++)
|
||||
{
|
||||
convert(it->get());
|
||||
@ -452,6 +445,17 @@ void XlsConverter::convert (XLS::WorksheetSubstream* sheet)
|
||||
{
|
||||
if (sheet == NULL) return;
|
||||
|
||||
xls_global_info->current_sheet = sheet->ws_index_ + 1;
|
||||
|
||||
std::wstring name = xls_global_info->sheets_info[sheet->ws_index_].name;
|
||||
if (name.empty())
|
||||
name = L"Sheet_" + std::to_wstring(sheet->ws_index_ + 1);
|
||||
|
||||
xlsx_context->set_table_type(1);
|
||||
xlsx_context->set_table_name(name) ;
|
||||
xlsx_context->set_table_id(sheet->ws_index_ + 1);
|
||||
xlsx_context->set_table_state(xls_global_info->sheets_info[sheet->ws_index_].state);
|
||||
|
||||
if (!sheet->m_arWINDOW.empty())
|
||||
{
|
||||
sheet->m_arWINDOW[0]->serialize(xlsx_context->current_sheet().sheetViews());
|
||||
@ -475,6 +479,9 @@ void XlsConverter::convert (XLS::WorksheetSubstream* sheet)
|
||||
globals->m_DxGCol = sheet->m_DxGCol;
|
||||
|
||||
sheet->m_GLOBALS->serialize(xlsx_context->current_sheet().sheetFormat());
|
||||
|
||||
if (globals->is_dialog)
|
||||
xlsx_context->set_table_type(2);
|
||||
}
|
||||
if (sheet->m_COLUMNS)
|
||||
{
|
||||
@ -575,6 +582,102 @@ void XlsConverter::convert (XLS::WorksheetSubstream* sheet)
|
||||
}
|
||||
}
|
||||
|
||||
void XlsConverter::convert (XLS::MacroSheetSubstream* sheet)
|
||||
{
|
||||
if (sheet == NULL) return;
|
||||
|
||||
xls_global_info->current_sheet = sheet->ws_index_ + 1;
|
||||
|
||||
std::wstring name = xls_global_info->sheets_info[sheet->ws_index_].name;
|
||||
if (name.empty())
|
||||
name = L"MacroSheet_" + std::to_wstring(sheet->ws_index_ + 1);
|
||||
|
||||
xlsx_context->set_table_type(4);
|
||||
xlsx_context->set_table_name(name) ;
|
||||
xlsx_context->set_table_id(sheet->ws_index_ + 1);
|
||||
xlsx_context->set_table_state(xls_global_info->sheets_info[sheet->ws_index_].state);
|
||||
|
||||
if (!sheet->m_arWINDOW.empty())
|
||||
{
|
||||
sheet->m_arWINDOW[0]->serialize(xlsx_context->current_sheet().sheetViews());
|
||||
}
|
||||
if (sheet->m_Dimensions)
|
||||
{
|
||||
sheet->m_Dimensions->serialize(xlsx_context->current_sheet().dimension());
|
||||
}
|
||||
|
||||
//sheet->serialize_format(xlsx_context->current_sheet().sheetProperties());
|
||||
|
||||
if (sheet->m_GLOBALS)
|
||||
{
|
||||
XLS::GLOBALS * globals = dynamic_cast<XLS::GLOBALS *>(sheet->m_GLOBALS.get());
|
||||
XLS::COLUMNS * columns = dynamic_cast<XLS::COLUMNS *>(sheet->m_COLUMNS.get());
|
||||
|
||||
if (columns)
|
||||
{
|
||||
globals->m_DefColWidth = columns->m_DefColWidth;
|
||||
}
|
||||
globals->m_DxGCol = sheet->m_DxGCol;
|
||||
|
||||
sheet->m_GLOBALS->serialize(xlsx_context->current_sheet().sheetFormat());
|
||||
}
|
||||
if (sheet->m_COLUMNS)
|
||||
{
|
||||
sheet->m_COLUMNS->serialize(xlsx_context->current_sheet().cols());
|
||||
}
|
||||
if (sheet->m_CELLTABLE)
|
||||
{
|
||||
sheet->m_CELLTABLE->serialize(xlsx_context->current_sheet().sheetData());
|
||||
}
|
||||
convert((XLS::OBJECTS*)sheet->m_OBJECTS.get(), NULL);
|
||||
|
||||
if (!sheet->m_arNote.empty() && xls_global_info->Version < 0x0600)
|
||||
{
|
||||
xlsx_context->get_drawing_context().start_drawing(0);
|
||||
for (size_t i = 0 ; i < sheet->m_arNote.size(); i++)
|
||||
{
|
||||
xlsx_context->get_drawing_context().start_drawing(0x0019);
|
||||
convert(dynamic_cast<XLS::Note*>(sheet->m_arNote[i].get()));
|
||||
xlsx_context->get_drawing_context().end_drawing();
|
||||
}
|
||||
xlsx_context->get_drawing_context().end_group();
|
||||
}
|
||||
|
||||
if (sheet->m_PAGESETUP)
|
||||
{
|
||||
sheet->m_PAGESETUP->serialize(xlsx_context->current_sheet().pageProperties());
|
||||
}
|
||||
|
||||
//for (size_t i = 0 ; i < sheet->m_arHFPictureDrawing.size(); i++)
|
||||
//{
|
||||
// //convert(dynamic_cast<XLS::Note*>(sheet->sheet->m_arHFPictureDrawing[i].get(),
|
||||
//}
|
||||
|
||||
if (sheet->m_arCUSTOMVIEW.size() > 0)
|
||||
{
|
||||
CP_XML_WRITER(xlsx_context->current_sheet().customViews())
|
||||
{
|
||||
CP_XML_NODE(L"customSheetViews")
|
||||
{
|
||||
for (size_t i = 0 ; i < sheet->m_arCUSTOMVIEW.size(); i++)
|
||||
{
|
||||
sheet->m_arCUSTOMVIEW[i]->serialize(CP_XML_STREAM());
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (sheet->m_BACKGROUND)
|
||||
{
|
||||
convert(dynamic_cast<XLS::BACKGROUND*>(sheet->m_BACKGROUND.get()));
|
||||
}
|
||||
|
||||
//for (size_t i = 0 ; i < sheet->m_arHFPictureDrawing.size(); i++)
|
||||
//{
|
||||
// convert((ODRAW::OfficeArtDgContainer*)sheet->m_arHFPictureDrawing[i].get());
|
||||
//}
|
||||
}
|
||||
|
||||
void XlsConverter::convert(XLS::GlobalsSubstream* globals)
|
||||
{
|
||||
if (globals == NULL) return;
|
||||
@ -1112,7 +1215,7 @@ void XlsConverter::convert(XLS::OBJECTS* objects, XLS::WorksheetSubstream * shee
|
||||
{
|
||||
text_obj->preserve_enabled = true;
|
||||
|
||||
for (size_t i = 0 ; i < sheet->m_arNote.size(); i++)
|
||||
for (size_t i = 0 ; sheet && i < sheet->m_arNote.size(); i++)
|
||||
{
|
||||
XLS::Note* note = dynamic_cast<XLS::Note*>(sheet->m_arNote[i].get());
|
||||
if ((note) && (note->note_sh.idObj == obj->cmo.id))
|
||||
@ -2104,14 +2207,25 @@ void XlsConverter::convert(XLS::Obj * obj)
|
||||
}
|
||||
}
|
||||
|
||||
void XlsConverter::convert_chart_sheet(XLS::ChartSheetSubstream* chart)
|
||||
void XlsConverter::convert_chart_sheet(XLS::ChartSheetSubstream* chartsheet)
|
||||
{
|
||||
if (chart == NULL) return;
|
||||
if (chartsheet == NULL) return;
|
||||
|
||||
xls_global_info->current_sheet = chartsheet->ws_index_ + 1;
|
||||
|
||||
std::wstring name = xls_global_info->sheets_info[chartsheet->ws_index_].name;
|
||||
if (name.empty())
|
||||
name = L"ChartSheet_" + std::to_wstring(chartsheet->ws_index_ + 1);
|
||||
|
||||
xlsx_context->set_table_type(3);
|
||||
xlsx_context->set_table_name(name) ;
|
||||
xlsx_context->set_table_id(chartsheet->ws_index_ + 1);
|
||||
xlsx_context->set_table_state(xls_global_info->sheets_info[chartsheet->ws_index_].state);
|
||||
|
||||
if (xlsx_context->get_drawing_context().start_drawing(0x0005))
|
||||
{
|
||||
xlsx_context->get_drawing_context().set_id(1);
|
||||
convert(chart);
|
||||
convert(chartsheet);
|
||||
|
||||
xlsx_context->get_drawing_context().end_drawing();
|
||||
}
|
||||
|
||||
@ -63,6 +63,7 @@ namespace XLS
|
||||
class WorksheetSubstream;
|
||||
class GlobalsSubstream;
|
||||
class ChartSheetSubstream;
|
||||
class MacroSheetSubstream;
|
||||
|
||||
class BACKGROUND;
|
||||
class FORMATTING;
|
||||
@ -113,6 +114,7 @@ public:
|
||||
void convert(XLS::WorksheetSubstream * sheet);
|
||||
void convert(XLS::ChartSheetSubstream * chart);
|
||||
void convert(XLS::GlobalsSubstream * elem);
|
||||
void convert(XLS::MacroSheetSubstream * chart);
|
||||
|
||||
void convert(XLS::FORMATTING * formating);
|
||||
void convert(XLS::THEME * theme);
|
||||
|
||||
@ -64,7 +64,6 @@ public:
|
||||
void set_main_document(document * _document) { document_ = _document; }
|
||||
document * get_main_document() { return document_; }
|
||||
|
||||
public:
|
||||
virtual void write(const std::wstring & RootPath) = 0;
|
||||
|
||||
private:
|
||||
|
||||
@ -118,28 +118,42 @@ oox_activeX_context & xlsx_conversion_context::current_activeX()
|
||||
throw std::runtime_error("internal error");
|
||||
}
|
||||
}
|
||||
bool xlsx_conversion_context::start_table(const std::wstring & name)
|
||||
bool xlsx_conversion_context::start_table()
|
||||
{
|
||||
sheets_.push_back(xlsx_xml_worksheet::create(name));
|
||||
get_table_context().start_table(name);
|
||||
sheets_.push_back(xlsx_xml_worksheet::create());
|
||||
get_table_context().start_table();
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
void xlsx_conversion_context::set_chart_view()
|
||||
void xlsx_conversion_context::set_table_type(int type)
|
||||
{
|
||||
if (sheets_.empty()) return;
|
||||
|
||||
get_table_context().set_chart_view();
|
||||
}
|
||||
sheets_.back()->type = type;
|
||||
if (type == 3)
|
||||
{
|
||||
get_table_context().set_chart_view();
|
||||
}
|
||||
|
||||
void xlsx_conversion_context::set_state(const std::wstring & state)
|
||||
}
|
||||
void xlsx_conversion_context::set_table_name(const std::wstring & name)
|
||||
{
|
||||
if (name.empty()) return;
|
||||
|
||||
sheets_.back()->name = name;
|
||||
}
|
||||
void xlsx_conversion_context::set_table_state(const std::wstring & state)
|
||||
{
|
||||
if (state.empty()) return;
|
||||
|
||||
sheets_.back()->set_state(state);
|
||||
sheets_.back()->state = state;
|
||||
}
|
||||
void xlsx_conversion_context::set_table_id(int id)
|
||||
{
|
||||
if (id < 0) return;
|
||||
sheets_.back()->id = id;
|
||||
}
|
||||
|
||||
void xlsx_conversion_context::start_chart()
|
||||
{
|
||||
charts_.push_back(oox_chart_context::create());
|
||||
@ -215,17 +229,15 @@ void xlsx_conversion_context::end_document()
|
||||
{
|
||||
std::wstringstream workbook_content;
|
||||
|
||||
unsigned int count = 0;
|
||||
|
||||
for (size_t i = 0; i < sheets_.size(); i++)
|
||||
{
|
||||
xlsx_xml_worksheet_ptr & sheet = sheets_[i];
|
||||
count++;
|
||||
const std::wstring slideRId = std::wstring(L"sId") + std::to_wstring(count);
|
||||
|
||||
package::sheet_content_ptr content = package::sheet_content::create();
|
||||
|
||||
const std::wstring slideRId = std::wstring(L"sId") + std::to_wstring(i + 1);
|
||||
content->set_rId(slideRId);
|
||||
|
||||
////////////////////////////////////////////////////////////////////////////////////////////
|
||||
const std::pair<std::wstring, std::wstring> p1 = sheet->get_drawing_link();
|
||||
const std::pair<std::wstring, std::wstring> p1 = sheets_[i]->get_drawing_link();
|
||||
|
||||
if (!p1.first.empty())
|
||||
{
|
||||
@ -235,9 +247,9 @@ void xlsx_conversion_context::end_document()
|
||||
content->add_rel(relationship(dId, kType, dName));
|
||||
}
|
||||
//////////////////////////////////////////////////////////////////////////////////////////////////
|
||||
content->add_rels(sheet->sheet_rels());
|
||||
content->add_rels(sheets_[i]->sheet_rels());
|
||||
/////////////////////////////////////////////////////////////////////////////////////////////////
|
||||
const std::pair<std::wstring, std::wstring> p2 = sheet->get_comments_link();
|
||||
const std::pair<std::wstring, std::wstring> p2 = sheets_[i]->get_comments_link();
|
||||
if (!p2.first.empty())
|
||||
{
|
||||
const std::wstring dId = p2.second;
|
||||
@ -246,7 +258,7 @@ void xlsx_conversion_context::end_document()
|
||||
content->add_rel(relationship(dId, kType, dName));
|
||||
}
|
||||
|
||||
const std::pair<std::wstring, std::wstring> p3 = sheet->get_vml_drawing_link();
|
||||
const std::pair<std::wstring, std::wstring> p3 = sheets_[i]->get_vml_drawing_link();
|
||||
if (!p3.first.empty())
|
||||
{
|
||||
const std::wstring dId = p3.second;
|
||||
@ -255,7 +267,7 @@ void xlsx_conversion_context::end_document()
|
||||
content->add_rel(relationship(dId, kType, dName));
|
||||
}
|
||||
|
||||
const std::pair<std::wstring, std::wstring> p4 = sheet->get_vml_drawing_HF_link();
|
||||
const std::pair<std::wstring, std::wstring> p4 = sheets_[i]->get_vml_drawing_HF_link();
|
||||
if (!p4.first.empty())
|
||||
{
|
||||
const std::wstring dId = p4.second;
|
||||
@ -264,22 +276,24 @@ void xlsx_conversion_context::end_document()
|
||||
content->add_rel(relationship(dId, kType, dName));
|
||||
}
|
||||
/////////////////////////////////////////////////////////////////////////////////////////////////
|
||||
sheet->write_to(content->content());
|
||||
output_document_->get_xl_files().add_sheet(content);
|
||||
sheets_[i]->write_to(content->content());
|
||||
|
||||
output_document_->get_xl_files().add_sheet(sheets_[i]->type, content);
|
||||
|
||||
/////////////////////////////////////////////
|
||||
CP_XML_WRITER(workbook_content)
|
||||
{
|
||||
CP_XML_NODE(L"sheet")
|
||||
{
|
||||
CP_XML_ATTR(L"name", sheet->name());
|
||||
CP_XML_ATTR(L"sheetId", count);
|
||||
CP_XML_ATTR(L"state", sheet->state() );
|
||||
CP_XML_ATTR(L"name", sheets_[i]->name);
|
||||
CP_XML_ATTR(L"sheetId", sheets_[i]->id);
|
||||
CP_XML_ATTR(L"state", sheets_[i]->state);
|
||||
CP_XML_ATTR(L"r:id", slideRId);
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
unsigned int count = 0;
|
||||
for (size_t i = 0; i < activeXs_.size(); i++)
|
||||
{
|
||||
package::activeX_content_ptr content = package::activeX_content::create();
|
||||
|
||||
@ -66,10 +66,12 @@ public:
|
||||
void start_document();
|
||||
void end_document();
|
||||
|
||||
bool start_table(const std::wstring & name);
|
||||
void set_state(const std::wstring & state);
|
||||
void set_chart_view();
|
||||
void end_table();
|
||||
bool start_table();
|
||||
void set_table_state(const std::wstring & state);
|
||||
void set_table_type(int type);
|
||||
void set_table_name(const std::wstring & name);
|
||||
void set_table_id(int id);
|
||||
void end_table();
|
||||
|
||||
void start_chart();
|
||||
void end_chart(){}
|
||||
|
||||
@ -37,18 +37,14 @@
|
||||
|
||||
namespace oox {
|
||||
|
||||
/// \class xlsx_xml_worksheet::Impl
|
||||
|
||||
class xlsx_xml_worksheet::Impl
|
||||
{
|
||||
public:
|
||||
Impl(std::wstring const & name) : name_(name)
|
||||
Impl()
|
||||
{
|
||||
state_ = L"visible";
|
||||
}
|
||||
|
||||
std::wstring name_;
|
||||
std::wstring state_;
|
||||
|
||||
|
||||
std::wstringstream cols_;
|
||||
std::wstringstream sheetPr_;
|
||||
std::wstringstream sheetFormatPr_;
|
||||
@ -83,21 +79,12 @@ public:
|
||||
std::wstring vml_HF_drawingId_;
|
||||
};
|
||||
|
||||
std::wstring xlsx_xml_worksheet::name() const
|
||||
xlsx_xml_worksheet_ptr xlsx_xml_worksheet::create()
|
||||
{
|
||||
return impl_->name_;
|
||||
}
|
||||
std::wstring xlsx_xml_worksheet::state() const
|
||||
{
|
||||
return impl_->state_;
|
||||
}
|
||||
xlsx_xml_worksheet_ptr xlsx_xml_worksheet::create(std::wstring const & name)
|
||||
{
|
||||
return boost::make_shared<xlsx_xml_worksheet>(name);
|
||||
return boost::make_shared<xlsx_xml_worksheet>();
|
||||
}
|
||||
|
||||
xlsx_xml_worksheet::xlsx_xml_worksheet(std::wstring const & name)
|
||||
: impl_(new xlsx_xml_worksheet::Impl(name))
|
||||
xlsx_xml_worksheet::xlsx_xml_worksheet() : impl_(new xlsx_xml_worksheet::Impl()), type(1), id(0)
|
||||
{
|
||||
}
|
||||
|
||||
@ -186,12 +173,25 @@ rels & xlsx_xml_worksheet::sheet_rels()
|
||||
}
|
||||
void xlsx_xml_worksheet::write_to(std::wostream & strm)
|
||||
{
|
||||
std::wstring node_name;
|
||||
switch(type)
|
||||
{
|
||||
case 2: node_name = L"dialogsheet"; break;
|
||||
case 3: node_name = L"chartsheet"; break;
|
||||
case 4: node_name = L"xm:macrosheet"; break;
|
||||
case 1:
|
||||
default: node_name = L"worksheet"; break;
|
||||
}
|
||||
CP_XML_WRITER(strm)
|
||||
{
|
||||
CP_XML_NODE(L"worksheet")
|
||||
CP_XML_NODE(node_name)
|
||||
{
|
||||
CP_XML_ATTR(L"xmlns", L"http://schemas.openxmlformats.org/spreadsheetml/2006/main");
|
||||
CP_XML_ATTR(L"xmlns:r", L"http://schemas.openxmlformats.org/officeDocument/2006/relationships");
|
||||
if (type == 4)
|
||||
{
|
||||
CP_XML_ATTR(L"xmlns:xm", L"http://schemas.microsoft.com/office/excel/2006/main");
|
||||
}
|
||||
CP_XML_ATTR(L"xmlns:mc", L"http://schemas.openxmlformats.org/markup-compatibility/2006");
|
||||
CP_XML_ATTR(L"xmlns:xdr", L"http://schemas.openxmlformats.org/drawingml/2006/spreadsheetDrawing");
|
||||
CP_XML_ATTR(L"xmlns:x14", L"http://schemas.microsoft.com/office/spreadsheetml/2009/9/main");
|
||||
@ -266,10 +266,7 @@ void xlsx_xml_worksheet::write_to(std::wostream & strm)
|
||||
}
|
||||
}
|
||||
}
|
||||
void xlsx_xml_worksheet::set_state (std::wstring const & state)
|
||||
{
|
||||
impl_->state_ = state;
|
||||
}
|
||||
|
||||
void xlsx_xml_worksheet::set_drawing_link(std::wstring const & fileName, std::wstring const & id)
|
||||
{
|
||||
impl_->drawingName_ = fileName;
|
||||
|
||||
@ -45,12 +45,14 @@ typedef boost::shared_ptr<xlsx_xml_worksheet> xlsx_xml_worksheet_ptr;
|
||||
class xlsx_xml_worksheet: boost::noncopyable
|
||||
{
|
||||
public:
|
||||
xlsx_xml_worksheet(std::wstring const & name);
|
||||
xlsx_xml_worksheet();
|
||||
~xlsx_xml_worksheet();
|
||||
public:
|
||||
std::wstring name() const;
|
||||
std::wstring state() const;
|
||||
|
||||
|
||||
std::wstring name;
|
||||
std::wstring state;
|
||||
int type;
|
||||
int id;
|
||||
|
||||
std::wostream & dimension();
|
||||
std::wostream & sheetViews();
|
||||
std::wostream & cols();
|
||||
@ -77,7 +79,6 @@ public:
|
||||
void set_drawing_link (std::wstring const & fileName, std::wstring const & id);
|
||||
void set_vml_drawing_link (std::wstring const & fileName, std::wstring const & id);
|
||||
void set_comments_link (std::wstring const & fileName, std::wstring const & id);
|
||||
void set_state (std::wstring const & state);
|
||||
void set_vml_HF_drawing_link(std::wstring const & fileName, std::wstring const & id);
|
||||
|
||||
std::pair<std::wstring, std::wstring> get_drawing_link() const;
|
||||
@ -85,7 +86,7 @@ public:
|
||||
std::pair<std::wstring, std::wstring> get_vml_drawing_HF_link() const;
|
||||
std::pair<std::wstring, std::wstring> get_comments_link() const;
|
||||
|
||||
static xlsx_xml_worksheet_ptr create(std::wstring const & name);
|
||||
static xlsx_xml_worksheet_ptr create();
|
||||
|
||||
private:
|
||||
class Impl;
|
||||
|
||||
@ -162,44 +162,74 @@ void sheet_content::add_rels(rels & r)
|
||||
sheets_files::sheets_files()
|
||||
{}
|
||||
|
||||
void sheets_files::add_sheet(sheet_content_ptr sheet)
|
||||
void sheets_files::add_sheet(int type, sheet_content_ptr sheet)
|
||||
{
|
||||
sheets_.push_back(sheet);
|
||||
switch(type)
|
||||
{
|
||||
case 2: dialogsheets_.push_back(sheet); break;
|
||||
case 3: chartsheets_.push_back(sheet); break;
|
||||
case 4: macrosheets_.push_back(sheet); break;
|
||||
case 1:
|
||||
default: worksheets_.push_back(sheet); break;
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
void sheets_files::write(const std::wstring & RootPath)
|
||||
{
|
||||
std::wstring path = RootPath + FILE_SEPARATOR_STR + L"worksheets";
|
||||
NSDirectory::CreateDirectory(path.c_str());
|
||||
int id = 0;
|
||||
write_(worksheets_, id, RootPath, L"worksheet", L"sheet",
|
||||
L"http://schemas.openxmlformats.org/officeDocument/2006/relationships/worksheet",
|
||||
L"application/vnd.openxmlformats-officedocument.spreadsheetml.worksheet+xml");
|
||||
|
||||
write_(dialogsheets_,id, RootPath, L"dialogsheet", L"sheet",
|
||||
L"http://schemas.openxmlformats.org/officeDocument/2006/relationships/dialogsheet",
|
||||
L"application/vnd.openxmlformats-officedocument.spreadsheetml.dialogsheet+xml");
|
||||
|
||||
write_(chartsheets_, id, RootPath, L"chartsheet", L"sheet",
|
||||
L"http://schemas.openxmlformats.org/officeDocument/2006/relationships/chartsheet",
|
||||
L"application/vnd.openxmlformats-officedocument.spreadsheetml.chartsheet+xml");
|
||||
|
||||
write_(macrosheets_, id, RootPath, L"macrosheet", L"intlsheet",
|
||||
L"http://schemas.microsoft.com/office/2006/relationships/xlIntlMacrosheet",
|
||||
L"application/vnd.ms-excel.intlmacrosheet+xml");
|
||||
}
|
||||
|
||||
for (size_t i = 0; i < sheets_.size(); i++)
|
||||
{
|
||||
if (!sheets_[i]) continue;
|
||||
void sheets_files::write_(std::vector<sheet_content_ptr> & sheets_, int & id,
|
||||
const std::wstring & RootPath, const std::wstring & local, const std::wstring & name,
|
||||
const std::wstring & rels_type, const std::wstring & content_type)
|
||||
{
|
||||
if (sheets_.empty()) return;
|
||||
|
||||
std::wstring path = RootPath + FILE_SEPARATOR_STR + local + L"s";
|
||||
NSDirectory::CreateDirectory(path.c_str());
|
||||
|
||||
oox::content_type & contentTypes = this->get_main_document()->content_type().get_content_type();
|
||||
for (size_t i = 0; i < sheets_.size(); i++, id++)
|
||||
{
|
||||
if (!sheets_[i]) continue;
|
||||
|
||||
const std::wstring fileName = std::wstring(L"sheet") + std::to_wstring(i + 1) + L".xml";
|
||||
content_type & contentTypes = this->get_main_document()->content_type().get_content_type();
|
||||
const std::wstring fileName = name + std::to_wstring(i + 1) + L".xml";
|
||||
|
||||
static const std::wstring kWSConType = L"application/vnd.openxmlformats-officedocument.spreadsheetml.worksheet+xml";
|
||||
contentTypes.add_override(std::wstring(L"/xl/worksheets/") + fileName, kWSConType);
|
||||
contentTypes.add_override(L"/xl/" + local + L"s/" + fileName, content_type);
|
||||
|
||||
if (rels_)
|
||||
{
|
||||
const std::wstring id = std::wstring(L"sId") + std::to_wstring(i + 1);
|
||||
static const std::wstring kWSRel = L"http://schemas.openxmlformats.org/officeDocument/2006/relationships/worksheet";
|
||||
const std::wstring fileRef = std::wstring(L"worksheets/") + fileName;
|
||||
rels_->add(id, kWSRel, fileRef);
|
||||
}
|
||||
if (rels_)
|
||||
{
|
||||
std::wstring fileRef = local + L"s/" + fileName;
|
||||
rels_->add(sheets_[i]->get_rId(), rels_type, fileRef);
|
||||
}
|
||||
|
||||
sheets_[i]->get_rel_file()->set_file_name(fileName + L".rels");
|
||||
sheets_[i]->get_rel_file()->set_file_name(fileName + L".rels");
|
||||
|
||||
rels_files relFiles;
|
||||
relFiles.add_rel_file(sheets_[i]->get_rel_file());
|
||||
relFiles.write(path);
|
||||
relFiles.add_rel_file(sheets_[i]->get_rel_file());
|
||||
relFiles.write(path);
|
||||
|
||||
//item->get_rel_file()->write(path.string<std::wstring>());
|
||||
//item->get_rel_file()->write(path.string<std::wstring>());
|
||||
|
||||
package::simple_element(fileName, sheets_[i]->str()).write(path);
|
||||
}
|
||||
package::simple_element(fileName, sheets_[i]->str()).write(path);
|
||||
}
|
||||
}
|
||||
|
||||
////////////////////////////////////////////
|
||||
@ -346,9 +376,9 @@ void xl_files::set_connections(element_ptr Element)
|
||||
connections_ = Element;
|
||||
}
|
||||
|
||||
void xl_files::add_sheet(sheet_content_ptr sheet)
|
||||
void xl_files::add_sheet(int type, sheet_content_ptr sheet)
|
||||
{
|
||||
sheets_files_.add_sheet(sheet);
|
||||
sheets_files_.add_sheet(type, sheet);
|
||||
}
|
||||
|
||||
void xl_files::set_media(external_items & _Mediaitems)
|
||||
|
||||
@ -50,17 +50,24 @@ public:
|
||||
class sheet_content : boost::noncopyable
|
||||
{
|
||||
public:
|
||||
static _CP_PTR(sheet_content) create();
|
||||
|
||||
sheet_content();
|
||||
std::wostream & content() { return content_; }
|
||||
|
||||
void add_rel(relationship const & r);
|
||||
void add_rels(rels & r);
|
||||
rels_file_ptr get_rel_file() { return rels_; }
|
||||
std::wstring str() { return content_.str(); }
|
||||
static _CP_PTR(sheet_content) create();
|
||||
|
||||
std::wostream & content() { return content_; }
|
||||
std::wstring str() { return content_.str(); }
|
||||
|
||||
void set_rId(std::wstring rid) {rId_ = rid;}
|
||||
std::wstring get_rId() {return rId_;}
|
||||
|
||||
private:
|
||||
std::wstringstream content_;
|
||||
rels_file_ptr rels_;
|
||||
std::wstring rId_;
|
||||
std::wstringstream content_;
|
||||
rels_file_ptr rels_;
|
||||
};
|
||||
typedef _CP_PTR(sheet_content) sheet_content_ptr;
|
||||
//------------------------------------------------------------------------
|
||||
@ -126,7 +133,7 @@ class sheets_files : public element
|
||||
public:
|
||||
sheets_files();
|
||||
|
||||
void add_sheet(sheet_content_ptr sheet);
|
||||
void add_sheet(int type, sheet_content_ptr sheet);
|
||||
|
||||
void set_rels(rels_files * rels)
|
||||
{
|
||||
@ -135,7 +142,15 @@ public:
|
||||
|
||||
virtual void write(const std::wstring & RootPath);
|
||||
|
||||
std::vector<sheet_content_ptr> sheets_;
|
||||
std::vector<sheet_content_ptr> worksheets_;
|
||||
std::vector<sheet_content_ptr> dialogsheets_;
|
||||
std::vector<sheet_content_ptr> macrosheets_;
|
||||
std::vector<sheet_content_ptr> chartsheets_;
|
||||
|
||||
private:
|
||||
void write_(std::vector<sheet_content_ptr> & sheets_, int & id,
|
||||
const std::wstring & RootPath, const std::wstring & local, const std::wstring & name,
|
||||
const std::wstring & rels_type, const std::wstring & content_type);
|
||||
rels_files * rels_;
|
||||
|
||||
};
|
||||
@ -295,7 +310,7 @@ public:
|
||||
void set_styles (element_ptr Element);
|
||||
void set_sharedStrings (element_ptr Element);
|
||||
void set_connections (element_ptr Element);
|
||||
void add_sheet (sheet_content_ptr sheet);
|
||||
void add_sheet (int type, sheet_content_ptr sheet);
|
||||
void set_media (external_items & _Mediaitems);
|
||||
void set_drawings (element_ptr Element);
|
||||
void set_vml_drawings (element_ptr Element);
|
||||
|
||||
@ -55,7 +55,7 @@ xlsx_table_context::xlsx_table_context(xlsx_conversion_context & Context) : cont
|
||||
{
|
||||
}
|
||||
|
||||
void xlsx_table_context::start_table(const std::wstring & name)
|
||||
void xlsx_table_context::start_table()
|
||||
{
|
||||
tables_state_.push_back( table_state_ptr(new table_state(context_)));
|
||||
}
|
||||
|
||||
@ -58,8 +58,7 @@ class xlsx_table_context
|
||||
public:
|
||||
xlsx_table_context(xlsx_conversion_context & Context);
|
||||
|
||||
public:
|
||||
void start_table(const std::wstring & name);
|
||||
void start_table();
|
||||
void set_chart_view();
|
||||
void end_table();
|
||||
|
||||
|
||||
Reference in New Issue
Block a user