Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Support
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in / Register
Toggle navigation
O
onlyoffice_core
Project overview
Project overview
Details
Activity
Releases
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Issues
0
Issues
0
List
Boards
Labels
Milestones
Merge Requests
0
Merge Requests
0
Analytics
Analytics
Repository
Value Stream
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Create a new issue
Commits
Issue Boards
Open sidebar
Boris Kocherov
onlyoffice_core
Commits
e70a2677
Commit
e70a2677
authored
Sep 28, 2016
by
ElenaSubbotina
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
OdfFormatWriter - fix chart with defined names & local data
parent
f3ac6ad2
Changes
23
Hide whitespace changes
Inline
Side-by-side
Showing
23 changed files
with
528 additions
and
325 deletions
+528
-325
ASCOfficeOdfFile/formulasconvert/formulasconvert_oox.cpp
ASCOfficeOdfFile/formulasconvert/formulasconvert_oox.cpp
+20
-15
ASCOfficeOdfFile/src/docx/xlsx_utils.cpp
ASCOfficeOdfFile/src/docx/xlsx_utils.cpp
+0
-8
ASCOfficeOdfFile/src/odf/table_xlsx.cpp
ASCOfficeOdfFile/src/odf/table_xlsx.cpp
+1
-1
ASCOfficeOdfFile/win32/cpcommon.vcproj
ASCOfficeOdfFile/win32/cpcommon.vcproj
+4
-0
ASCOfficeOdfFileW/source/OdfFormat/odf_chart_context.cpp
ASCOfficeOdfFileW/source/OdfFormat/odf_chart_context.cpp
+274
-175
ASCOfficeOdfFileW/source/OdfFormat/odf_chart_context.h
ASCOfficeOdfFileW/source/OdfFormat/odf_chart_context.h
+2
-3
ASCOfficeOdfFileW/source/OdfFormat/odf_drawing_context.cpp
ASCOfficeOdfFileW/source/OdfFormat/odf_drawing_context.cpp
+3
-0
ASCOfficeOdfFileW/source/OdfFormat/odf_style_context.cpp
ASCOfficeOdfFileW/source/OdfFormat/odf_style_context.cpp
+8
-7
ASCOfficeOdfFileW/source/OdfFormat/odf_style_state.cpp
ASCOfficeOdfFileW/source/OdfFormat/odf_style_state.cpp
+7
-3
ASCOfficeOdfFileW/source/OdfFormat/odf_style_state.h
ASCOfficeOdfFileW/source/OdfFormat/odf_style_state.h
+2
-2
ASCOfficeOdfFileW/source/OdfFormat/ods_conversion_context.cpp
...fficeOdfFileW/source/OdfFormat/ods_conversion_context.cpp
+14
-3
ASCOfficeOdfFileW/source/OdfFormat/ods_conversion_context.h
ASCOfficeOdfFileW/source/OdfFormat/ods_conversion_context.h
+6
-4
ASCOfficeOdfFileW/source/OdfFormat/ods_table_context.cpp
ASCOfficeOdfFileW/source/OdfFormat/ods_table_context.cpp
+43
-3
ASCOfficeOdfFileW/source/OdfFormat/ods_table_context.h
ASCOfficeOdfFileW/source/OdfFormat/ods_table_context.h
+5
-2
ASCOfficeOdfFileW/source/OdfFormat/ods_table_state.cpp
ASCOfficeOdfFileW/source/OdfFormat/ods_table_state.cpp
+5
-5
ASCOfficeOdfFileW/source/OdfFormat/ods_table_state.h
ASCOfficeOdfFileW/source/OdfFormat/ods_table_state.h
+11
-1
ASCOfficeOdfFileW/source/OdfFormat/office_chart.cpp
ASCOfficeOdfFileW/source/OdfFormat/office_chart.cpp
+1
-1
ASCOfficeOdfFileW/source/OdfFormat/styles.h
ASCOfficeOdfFileW/source/OdfFormat/styles.h
+1
-1
ASCOfficeOdfFileW/source/Oox2OdfConverter/Converter.cpp
ASCOfficeOdfFileW/source/Oox2OdfConverter/Converter.cpp
+1
-0
ASCOfficeOdfFileW/source/Oox2OdfConverter/Converter.h
ASCOfficeOdfFileW/source/Oox2OdfConverter/Converter.h
+2
-2
ASCOfficeOdfFileW/source/Oox2OdfConverter/ConverterChart.cpp
ASCOfficeOdfFileW/source/Oox2OdfConverter/ConverterChart.cpp
+69
-48
ASCOfficeOdfFileW/source/Oox2OdfConverter/XlsxConverter.cpp
ASCOfficeOdfFileW/source/Oox2OdfConverter/XlsxConverter.cpp
+49
-37
ASCOfficeOdfFileW/source/win32/OdfFormat.vcproj
ASCOfficeOdfFileW/source/win32/OdfFormat.vcproj
+0
-4
No files found.
ASCOfficeOdfFile/formulasconvert/formulasconvert_oox.cpp
View file @
e70a2677
...
...
@@ -633,32 +633,37 @@ std::wstring oox2odf_converter::Impl::convert_chart_distance(const std::wstring&
boost
::
algorithm
::
split
(
distance_inp
,
expr
,
boost
::
algorithm
::
is_any_of
(
L","
),
boost
::
algorithm
::
token_compress_on
);
BOOST_FOREACH
(
std
::
wstring
&
d
,
distance_inp
)
for
(
int
i
=
0
;
i
<
distance_inp
.
size
();
i
++
)
{
std
::
wstring
sheet
;
std
::
vector
<
std
::
wstring
>
range
;
std
::
vector
<
std
::
wstring
>
cells
;
boost
::
algorithm
::
split
(
range
,
d
,
boost
::
algorithm
::
is_any_of
(
L":"
),
boost
::
algorithm
::
token_compress_on
);
boost
::
algorithm
::
split
(
range
,
distance_inp
[
i
]
,
boost
::
algorithm
::
is_any_of
(
L":"
),
boost
::
algorithm
::
token_compress_on
);
BOOST_FOREACH
(
std
::
wstring
&
c
,
range
)
for
(
int
j
=
0
;
j
<
range
.
size
();
j
++
)
{
const
::
std
::
string
::
size_type
colon
=
c
.
find
(
'!'
);
cells
.
push_back
(
c
.
substr
(
colon
+
1
));
if
(
sheet
.
size
()
<
1
)
sheet
=
c
.
substr
(
0
,
colon
);
int
pos
=
range
[
j
].
find
(
'!'
);
if
(
0
<=
pos
)
{
if
(
sheet
.
empty
())
sheet
=
range
[
j
].
substr
(
0
,
pos
);
}
cells
.
push_back
(
range
[
j
].
substr
(
pos
+
1
));
}
std
::
wstring
cells_out
;
BOOST_FOREACH
(
std
::
wstring
&
c
,
cells
)
for
(
int
c
=
0
;
c
<
cells
.
size
();
c
++
)
{
cells_out
.
append
(
sheet
+
L"."
);
cells_out
.
append
(
c
);
cells_out
.
append
(
L":"
);
if
(
!
sheet
.
empty
())
cells_out
+=
sheet
+
L"."
;
cells_out
+=
cells
[
c
];
cells_out
+=
L":"
;
}
int
res1
=
sheet
.
find
(
L"-"
);
int
res2
=
sheet
.
find
(
L"'"
);
if
(
res1
>=
0
&&
!
(
res2
==
0
))
if
(
res1
>=
0
&&
!
(
res2
==
0
))
{
sheet
=
L"'"
+
sheet
+
L"'"
;
}
...
...
@@ -667,10 +672,10 @@ std::wstring oox2odf_converter::Impl::convert_chart_distance(const std::wstring&
}
std
::
wstring
result
;
BOOST_FOREACH
(
std
::
wstring
&
d
,
distance_out
)
for
(
int
i
=
0
;
i
<
distance_out
.
size
();
i
++
)
{
result
.
append
(
d
)
;
result
.
append
(
L" "
)
;
result
+=
distance_out
[
i
]
;
result
+=
L" "
;
}
return
result
.
substr
(
0
,
result
.
size
()
-
1
);
}
...
...
ASCOfficeOdfFile/src/docx/xlsx_utils.cpp
View file @
e70a2677
...
...
@@ -45,14 +45,6 @@ namespace cpdoccore {
namespace
oox
{
//_ASSERTE(getColAddress(0) == L"A");
//_ASSERTE(getColAddress(1) == L"B");
//_ASSERTE(getColAddress(25) == L"Z");
//_ASSERTE(getColAddress(26) == L"AA");
//_ASSERTE(getColAddress(51) == L"AZ");
//_ASSERTE(getColAddress(52) == L"BA");
//_ASSERTE(getColAddress(77) == L"BZ");
//_ASSERTE(getColAddress(26 * 26 + 25) == L"ZZ");
std
::
wstring
getColAddress
(
size_t
col
)
{
static
const
size_t
r
=
(
L'Z'
-
L'A'
+
1
);
...
...
ASCOfficeOdfFile/src/odf/table_xlsx.cpp
View file @
e70a2677
...
...
@@ -397,7 +397,7 @@ void table_table_column::xlsx_convert(oox::xlsx_conversion_context & Context)
Context
.
start_table_column
(
columnsRepeated
,
defaultCellStyleName
,
cMin
,
cMax
);
if
(
cMin
>
16384
)
return
;
if
(
cMax
>
16384
)
cMax
=
16384
;
if
(
cMax
>
16384
)
return
;
double
pt_width
=
0.0
;
double
cm_width
=
0.0
;
...
...
ASCOfficeOdfFile/win32/cpcommon.vcproj
View file @
e70a2677
...
...
@@ -1088,6 +1088,10 @@
RelativePath=
"..\include\cpdoccore\CPWeakPtr.h"
>
</File>
<File
RelativePath=
"..\..\ASCOfficeOdfFileW\source\OdfFormat\odf_chart_context.h"
>
</File>
<File
RelativePath=
"..\src\common\readdocelement.cpp"
>
...
...
ASCOfficeOdfFileW/source/OdfFormat/odf_chart_context.cpp
View file @
e70a2677
...
...
@@ -86,8 +86,9 @@ namespace odf_writer
std
::
wstring
ref
;
std
::
wstring
format
;
bool
categories
;
bool
label
;
//std::vector<double> data_double;
std
::
vector
<
std
::
wstring
>
data_str
;
};
struct
odf_chart_state
...
...
@@ -126,8 +127,9 @@ class odf_chart_context::Impl
public:
Impl
(
odf_conversion_context
*
odf_context
)
:
odf_context_
(
odf_context
)
{
styles_context_
=
NULL
;
current_series_count_
=
0
;
styles_context_
=
NULL
;
current_series_count_
=
0
;
local_table_reset_ref_
=
false
;
if
(
odf_context_
->
type
==
SpreadsheetDocument
)
{
...
...
@@ -151,13 +153,19 @@ public:
struct
_range
{
_range
(
std
::
wstring
&
r
,
bool
l
,
chart_series
*
s
)
:
label
(
l
),
index_cash
(
-
1
),
series
(
s
),
ref
(
r
)
{}
_range
()
:
label
(
false
),
index_cash
(
-
1
),
series
(
NULL
)
{}
chart_series
*
series
;
std
::
wstring
ref
;
bool
label
;
int
index_cash
;
};
std
::
vector
<
_range
>
data_cell_ranges_
;
std
::
vector
<
_range
>
data_cell_ranges_
;
std
::
vector
<
odf_cash_state
>
cash_
;
bool
local_table_enabled_
;
std
::
vector
<
odf_cash_state
>
cash_
;
bool
local_table_enabled_
;
bool
local_table_reset_ref_
;
std
::
vector
<
odf_chart_level_state
>
current_level_
;
//постоянно меняющийся список уровней наследования
std
::
vector
<
odf_chart_state
>
chart_list_
;
//все элементы .. для удобства разделение по "топам"
...
...
@@ -171,9 +179,72 @@ public:
chart_axis
*
get_current_axis
();
chart_series
*
get_current_series
();
std
::
wstring
convert_formula
(
std
::
wstring
oox_formula
);
void
create_local_table
();
void
create_local_table_rows
(
ods_table_state
*
table_state
,
std
::
vector
<
_cell_cash
>
&
cells
,
bool
header
);
int
create_local_table_rows
(
int
current_row
,
ods_table_state
*
table_state
,
std
::
vector
<
_cell_cash
>
&
cells
,
bool
header
);
};
static
formulasconvert
::
oox2odf_converter
formulas_converter_chart
;
std
::
wstring
odf_chart_context
::
Impl
::
convert_formula
(
std
::
wstring
oox_formula
)
{
std
::
vector
<
std
::
wstring
>
refs
;
boost
::
algorithm
::
split
(
refs
,
oox_formula
,
boost
::
algorithm
::
is_any_of
(
L":"
),
boost
::
algorithm
::
token_compress_on
);
if
(
refs
.
empty
())
return
L""
;
if
(
local_table_enabled_
)
{
if
(
local_table_reset_ref_
)
return
L""
;
//remove table name
if
(
!
refs
.
empty
())
{
int
pos
=
refs
[
0
].
rfind
(
L"!"
);
//в имени таблички может быть...
if
(
pos
>
0
)
{
refs
[
0
]
=
L"local-table!"
+
refs
[
0
].
substr
(
pos
+
1
,
refs
[
0
].
size
()
-
pos
);
}
int
col
=
-
1
,
row
=
-
1
;
utils
::
parsing_ref
(
refs
[
0
],
col
,
row
);
if
(
col
<
0
&&
row
<
0
)
return
L""
;
oox_formula
=
refs
[
0
];
if
(
refs
.
size
()
>
1
)
{
int
r
=
refs
[
1
].
rfind
(
L"!"
);
if
(
r
>
0
)
{
refs
[
1
]
=
L"local-table!"
+
refs
[
1
].
substr
(
r
+
1
,
refs
[
1
].
size
()
-
r
);
}
oox_formula
+=
L":"
+
refs
[
1
];
}
}
}
else
{
//open office dont support defined names in chart formula
int
col
=
-
1
,
row
=
-
1
;
utils
::
parsing_ref
(
refs
[
0
],
col
,
row
);
if
(
col
<
0
&&
row
<
0
)
{
local_table_enabled_
=
true
;
//find defined name ????
local_table_reset_ref_
=
true
;
return
L""
;
}
}
std
::
wstring
odf_formula
=
formulas_converter_chart
.
convert_chart_distance
(
oox_formula
);
//boost::algorithm::replace_all(odf_formula, L"$", L"");
return
odf_formula
;
}
chart_chart
*
odf_chart_context
::
Impl
::
get_current_chart
()
{
for
(
long
i
=
current_level_
.
size
()
-
1
;
i
>=
0
;
i
--
)
...
...
@@ -207,7 +278,8 @@ void odf_chart_context::Impl::clear_current()
data_cell_ranges_
.
clear
();
cash_
.
clear
();
current_series_count_
=
0
;
current_series_count_
=
0
;
local_table_reset_ref_
=
false
;
if
(
odf_context_
->
type
==
SpreadsheetDocument
)
{
...
...
@@ -679,6 +751,7 @@ void odf_chart_context::end_group_series()
impl_
->
group_series_
.
clear
();
impl_
->
axis_group_series_
.
clear
();
}
void
odf_chart_context
::
add_domain
(
std
::
wstring
formula
)
{
int
level
=
impl_
->
current_level_
.
size
();
...
...
@@ -697,7 +770,8 @@ void odf_chart_context::add_domain(std::wstring formula)
odf_element_state
state
=
{
elm
,
L""
,
office_element_ptr
(),
level
};
impl_
->
current_chart_state_
.
elements_
.
push_back
(
state
);
}
void
odf_chart_context
::
add_categories
(
std
::
wstring
formula
,
office_element_ptr
&
axis
)
void
odf_chart_context
::
add_categories
(
std
::
wstring
odf_formula
,
office_element_ptr
&
axis
)
{
office_element_ptr
elm
;
create_element
(
L"chart"
,
L"categories"
,
elm
,
impl_
->
odf_context_
);
...
...
@@ -705,7 +779,7 @@ void odf_chart_context::add_categories(std::wstring formula, office_element_ptr
chart_categories
*
categories
=
dynamic_cast
<
chart_categories
*>
(
elm
.
get
());
if
(
categories
==
NULL
)
return
;
categories
->
table_cell_range_address_
=
formula
;
categories
->
table_cell_range_address_
=
odf_
formula
;
int
level
=
impl_
->
current_level_
.
size
();
if
(
axis
)
axis
->
add_child_element
(
elm
);
...
...
@@ -824,7 +898,7 @@ void odf_chart_context::end_plot_area()
if
(
plot_area
)
{
std
::
wstring
cell_range
;
for
(
long
i
=
0
;
i
<
impl_
->
data_cell_ranges_
.
size
();
i
++
)
for
(
long
i
=
0
;
i
<
impl_
->
data_cell_ranges_
.
size
();
i
++
)
{
cell_range
=
cell_range
+
impl_
->
data_cell_ranges_
[
i
].
ref
+
L" "
;
}
...
...
@@ -1324,19 +1398,28 @@ void odf_chart_context::end_chart()
///////////////////
for
(
long
i
=
0
;
i
<
impl_
->
axis_
.
size
()
&&
impl_
->
categories_
.
size
()
>
0
;
i
++
)
int
cat
=
0
;
for
(
long
i
=
0
;
i
<
impl_
->
axis_
.
size
()
&&
impl_
->
categories_
.
size
()
>
0
;
i
++
)
{
if
(
impl_
->
axis_
[
i
].
elm
==
NULL
)
continue
;
if
(
impl_
->
categories_
[
0
].
second
==
1
)
{
add_categories
(
impl_
->
categories_
[
0
].
first
,
impl_
->
axis_
[
i
].
elm
);
}
else
if
(
impl_
->
axis_
[
i
].
elm
==
NULL
)
continue
;
if
(
impl_
->
axis_
[
i
].
dimension
==
1
)
{
if
(
i
==
0
)
if
(
cat
<
impl_
->
categories_
.
size
())
{
chart_axis
*
axis
=
dynamic_cast
<
chart_axis
*>
(
impl_
->
axis_
[
i
].
elm
.
get
());
axis
->
chart_axis_attlist_
.
chart_dimension_
=
L"x"
;
if
(
impl_
->
categories_
[
cat
].
second
==
1
)
{
add_categories
(
impl_
->
categories_
[
cat
].
first
,
impl_
->
axis_
[
i
].
elm
);
}
else
{
if
(
i
==
0
)
{
chart_axis
*
axis
=
dynamic_cast
<
chart_axis
*>
(
impl_
->
axis_
[
i
].
elm
.
get
());
axis
->
chart_axis_attlist_
.
chart_dimension_
=
L"x"
;
}
}
cat
++
;
}
}
}
...
...
@@ -1346,103 +1429,47 @@ void odf_chart_context::end_chart()
impl_
->
clear_current
();
}
static
formulasconvert
::
oox2odf_converter
formulas_converter_chart
;
void
odf_chart_context
::
set_series_value_formula
(
std
::
wstring
oox_formula
)
{
std
::
wstring
odfFormula
;
if
(
oox_formula
.
length
()
>
0
)
odfFormula
=
formulas_converter_chart
.
convert_chart_distance
(
oox_formula
);
//----------------------------------------------------------------------------
std
::
vector
<
std
::
wstring
>
refs
;
boost
::
algorithm
::
split
(
refs
,
oox_formula
,
boost
::
algorithm
::
is_any_of
(
L":"
),
boost
::
algorithm
::
token_compress_on
);
std
::
wstring
odf_formula
=
impl_
->
convert_formula
(
oox_formula
);
if
(
refs
.
size
()
>
0
)
{
int
col
=
-
1
,
row
=
-
1
;
utils
::
parsing_ref
(
refs
[
0
],
col
,
row
);
if
(
col
<
0
&&
row
<
0
)
{
odfFormula
.
clear
();
//reset by cash
}
}
//----------------------------------------------------------------------------
chart_series
*
series
=
dynamic_cast
<
chart_series
*>
(
impl_
->
current_chart_state_
.
elements_
.
back
().
elm
.
get
());
if
(
series
==
NULL
)
return
;
Impl
::
_range
r
=
{
odfFormula
,
false
}
;
Impl
::
_range
r
(
odf_formula
,
false
,
series
)
;
impl_
->
data_cell_ranges_
.
push_back
(
r
);
if
(
!
o
ox
_formula
.
empty
())
if
(
!
o
df
_formula
.
empty
())
{
series
->
chart_series_attlist_
.
chart_values_cell_range_address_
=
odf
F
ormula
;
series
->
chart_series_attlist_
.
chart_values_cell_range_address_
=
odf
_f
ormula
;
impl_
->
current_data_points_series_count_
=
formulas_converter_chart
.
get_count_value_points
(
oox_formula
);
}
}
void
odf_chart_context
::
set_series_label_formula
(
std
::
wstring
oox_formula
)
{
std
::
wstring
odf
Formula
;
std
::
wstring
odf
_formula
=
impl_
->
convert_formula
(
oox_formula
)
;
if
(
oox_formula
.
length
()
>
0
)
odfFormula
=
formulas_converter_chart
.
convert_chart_distance
(
oox_formula
);
//----------------------------------------------------------------------------
std
::
vector
<
std
::
wstring
>
refs
;
boost
::
algorithm
::
split
(
refs
,
oox_formula
,
boost
::
algorithm
::
is_any_of
(
L":"
),
boost
::
algorithm
::
token_compress_on
);
if
(
refs
.
size
()
>
0
)
{
int
col
=
-
1
,
row
=
-
1
;
utils
::
parsing_ref
(
refs
[
0
],
col
,
row
);
chart_series
*
series
=
dynamic_cast
<
chart_series
*>
(
impl_
->
current_chart_state_
.
elements_
.
back
().
elm
.
get
());
if
(
series
==
NULL
)
return
;
if
(
col
<
0
&&
row
<
0
)
{
odfFormula
.
clear
();
//reset by cash
}
}
//----------------------------------------------------------------------------
Impl
::
_range
r
=
{
odfFormula
,
true
};
Impl
::
_range
r
(
odf_formula
,
true
,
series
);
impl_
->
data_cell_ranges_
.
push_back
(
r
);
if
(
!
odf
F
ormula
.
empty
())
if
(
!
odf
_f
ormula
.
empty
())
{
chart_series
*
series
=
dynamic_cast
<
chart_series
*>
(
impl_
->
current_chart_state_
.
elements_
.
back
().
elm
.
get
());
if
(
series
==
NULL
)
return
;
series
->
chart_series_attlist_
.
chart_label_cell_address_
=
odfFormula
;
series
->
chart_series_attlist_
.
chart_label_cell_address_
=
odf_formula
;
}
}
void
odf_chart_context
::
set_category_axis_formula
(
std
::
wstring
oox_formula
,
int
type
)
void
odf_chart_context
::
set_category_axis_formula
(
std
::
wstring
oox_formula
,
int
type
)
{
std
::
wstring
odfFormula
;
if
(
oox_formula
.
length
()
>
0
)
odfFormula
=
formulas_converter_chart
.
convert_chart_distance
(
oox_formula
);
//----------------------------------------------------------------------------
std
::
vector
<
std
::
wstring
>
refs
;
boost
::
algorithm
::
split
(
refs
,
oox_formula
,
boost
::
algorithm
::
is_any_of
(
L":"
),
boost
::
algorithm
::
token_compress_on
);
if
(
refs
.
size
()
>
0
)
{
int
col
=
-
1
,
row
=
-
1
;
utils
::
parsing_ref
(
refs
[
0
],
col
,
row
);
std
::
wstring
odf_formula
=
impl_
->
convert_formula
(
oox_formula
);
if
(
col
<
0
&&
row
<
0
)
{
odfFormula
.
clear
();
//reset by cash
}
}
//----------------------------------------------------------------------------
Impl
::
_range
r
=
{
odfFormula
,
true
};
Impl
::
_range
r
(
odf_formula
,
true
,
NULL
);
impl_
->
data_cell_ranges_
.
push_back
(
r
);
if
(
!
odfFormula
.
empty
())
{
impl_
->
categories_
.
push_back
(
std
::
pair
<
std
::
wstring
,
int
>
(
odfFormula
,
type
));
}
impl_
->
categories_
.
push_back
(
std
::
pair
<
std
::
wstring
,
int
>
(
odf_formula
,
type
));
}
void
odf_chart_context
::
set_series_pie_explosion
(
int
val
)
//или точка серии
...
...
@@ -1462,56 +1489,121 @@ void odf_chart_context::set_series_pie_explosion(int val)//или точка с
// impl_->cash_.push_back(state);
//}
void
odf_chart_context
::
set_cash
(
std
::
wstring
format
,
std
::
vector
<
std
::
wstring
>
&
data_str
,
bool
label
)
void
odf_chart_context
::
set_cash
(
std
::
wstring
format
,
std
::
vector
<
std
::
wstring
>
&
data_str
,
bool
categories
,
bool
label
)
{
if
(
data_str
.
size
()
<
1
)
return
;
if
(
impl_
->
data_cell_ranges_
.
size
()
<
1
)
return
;
if
(
impl_
->
data_cell_ranges_
.
empty
())
return
;
if
(
data_str
.
empty
())
return
;
std
::
wstring
ref
=
impl_
->
data_cell_ranges_
.
back
().
ref
;
int
count_cash_values
=
0
;
bool
by_row
=
true
;
int
start_col
=
0
;
int
start_row
=
0
;
if
(
ref
.
empty
()
)
if
(
ref
.
empty
()
&&
label
&&
categories
)
{
std
::
wstring
col
;
if
(
label
)
col
=
L"A"
;
else
for
(
int
i
=
0
;
i
<
impl_
->
cash_
.
size
();
i
++
)
{
int
curr_col
=
0
;
for
(
long
i
=
0
;
i
<
impl_
->
data_cell_ranges_
.
size
();
i
++
)
if
(
impl_
->
cash_
[
i
].
label
||
impl_
->
cash_
[
i
].
categories
)
{
if
(
impl_
->
data_cell_ranges_
[
i
].
label
)
continue
;
curr_col
++
;
ref
=
impl_
->
cash_
[
i
].
ref
;
data_str
=
impl_
->
cash_
[
i
].
data_str
;
format
=
impl_
->
cash_
[
i
].
format
;
break
;
}
col
=
utils
::
getColAddress
(
curr_col
);
}
ref
=
std
::
wstring
(
L"local-table.$"
)
+
col
+
std
::
wstring
(
L"$"
)
+
boost
::
lexical_cast
<
std
::
wstring
>
(
2
)
+
L":.$"
+
col
+
std
::
wstring
(
L"$"
)
+
boost
::
lexical_cast
<
std
::
wstring
>
(
data_str
.
size
()
+
1
);
}
if
(
ref
.
empty
()
&&
impl_
->
data_cell_ranges_
.
size
()
>
1
)
{
//direction, count cash points
int
index_cash_y
=
impl_
->
data_cell_ranges_
[
impl_
->
data_cell_ranges_
.
size
()
-
2
].
index_cash
;
impl_
->
data_cell_ranges_
.
back
().
ref
=
ref
;
std
::
wstring
ref_y
=
impl_
->
data_cell_ranges_
[
impl_
->
data_cell_ranges_
.
size
()
-
2
].
ref
;
std
::
vector
<
std
::
wstring
>
refs
;
boost
::
algorithm
::
split
(
refs
,
ref_y
,
boost
::
algorithm
::
is_any_of
(
L":"
),
boost
::
algorithm
::
token_compress_on
);
chart_series
*
series
=
dynamic_cast
<
chart_series
*>
(
impl_
->
current_chart_state_
.
elements_
.
back
().
elm
.
get
());
if
(
series
==
NULL
)
return
;
int
col1
=
-
1
,
col2
=
-
1
,
row1
=
-
1
,
row2
=
-
1
;
if
(
refs
.
size
()
<
1
)
return
;
utils
::
parsing_ref
(
refs
[
0
],
col1
,
row1
);
int
count_cols
=
col2
-
col1
;
int
count_rows
=
row2
-
row1
;
if
(
label
==
false
)
if
(
refs
.
size
()
>
1
)
{
series
->
chart_series_attlist_
.
chart_values_cell_range_address_
=
ref
;
utils
::
parsing_ref
(
refs
[
1
],
col2
,
row2
)
;
}
else
{
series
->
chart_series_attlist_
.
chart_label_cell_address_
=
ref
;
if
(
!
impl_
->
categories_
.
empty
())
impl_
->
categories_
.
back
().
first
=
ref
;
col2
=
col1
;
row2
=
row1
;
}
}
std
::
vector
<
double
>
data_double
;
if
(
count_cols
==
0
)
{
start_col
=
col2
;
start_row
=
row1
;
count_cash_values
=
count_rows
;
}
else
{
start_col
=
col1
;
start_row
=
row2
;
by_row
=
false
;
count_cash_values
=
count_cols
;
}
if
(
data_str
.
empty
())
{
for
(
int
i
=
0
;
i
<
count_cash_values
;
i
++
)
data_str
.
push_back
(
L"non"
);
}
std
::
wstring
ref1
,
ref2
;
odf_cash_state
state
=
{
ref
,
format
/*,data_double*/
,
label
,
data_str
};
ref1
=
std
::
wstring
(
L"local-table."
)
+
utils
::
getColAddress
(
start_col
)
+
boost
::
lexical_cast
<
std
::
wstring
>
(
start_row
);
//
if
(
by_row
)
ref2
=
std
::
wstring
(
L"local-table."
)
+
utils
::
getColAddress
(
start_col
)
+
boost
::
lexical_cast
<
std
::
wstring
>
(
start_row
+
count_cash_values
);
else
ref2
=
std
::
wstring
(
L"local-table."
)
+
utils
::
getColAddress
(
start_col
+
count_cash_values
)
+
boost
::
lexical_cast
<
std
::
wstring
>
(
start_row
);
impl_
->
cash_
.
push_back
(
state
);
ref
=
ref1
+
L":"
+
ref2
;
}
if
(
ref
.
empty
()
&&
!
data_str
.
empty
())
{
// банальнейшая генерация А1 ... Аххх
ref
=
std
::
wstring
(
L"local-table.A1:"
)
+
std
::
wstring
(
L".A"
)
+
boost
::
lexical_cast
<
std
::
wstring
>
(
data_str
.
size
());
}
if
(
!
ref
.
empty
()
&&
!
data_str
.
empty
())
{
odf_cash_state
state
=
{
ref
,
format
,
categories
,
label
,
data_str
};
impl_
->
cash_
.
push_back
(
state
);
int
cash_ind
=
impl_
->
cash_
.
size
()
-
1
;
impl_
->
data_cell_ranges_
.
back
().
index_cash
=
cash_ind
;
if
(
impl_
->
data_cell_ranges_
.
back
().
ref
.
empty
())
impl_
->
data_cell_ranges_
.
back
().
ref
=
ref
;
if
(
!
categories
&&
!
label
&&
(
impl_
->
data_cell_ranges_
.
back
().
series
)
&&
(
!
impl_
->
data_cell_ranges_
.
back
().
series
->
chart_series_attlist_
.
chart_values_cell_range_address_
))
{
impl_
->
data_cell_ranges_
.
back
().
series
->
chart_series_attlist_
.
chart_values_cell_range_address_
=
ref
;
}
else
if
(
categories
&&
!
impl_
->
categories_
.
empty
())
{
if
(
impl_
->
categories_
.
back
().
first
.
empty
())
impl_
->
categories_
.
back
().
first
=
ref
;
}
}
}
void
odf_chart_context
::
set_local_table
(
bool
Val
)
void
odf_chart_context
::
set_local_table
(
bool
Val
,
bool
use_cash_only
)
{
impl_
->
local_table_enabled_
=
Val
;
impl_
->
local_table_enabled_
=
Val
;
impl_
->
local_table_reset_ref_
=
use_cash_only
;
}
struct
_sort_cells
...
...
@@ -1525,43 +1617,47 @@ struct _sort_cells
}
}
sort_cells
;
void
odf_chart_context
::
Impl
::
create_local_table_rows
(
ods_table_state
*
table_state
,
std
::
vector
<
_cell_cash
>
&
cells
,
bool
header
)
int
odf_chart_context
::
Impl
::
create_local_table_rows
(
int
curr_row
,
ods_table_state
*
table_state
,
std
::
vector
<
_cell_cash
>
&
cells
,
bool
header
)
{
int
curr_row
=
0
;
int
curr_cell
=
0
;
office_element_ptr
style_null
;
bool
add
=
false
;
for
(
long
i
=
0
;
i
<
cells
.
size
();
i
++
)
for
(
long
i
=
0
;
i
<
cells
.
size
();
i
++
)
{
if
(
cells
[
i
].
cash_only
)
continue
;
add
=
false
;
if
(
cells
[
i
].
row
>
curr_row
+
1
)
if
(
cells
[
i
].
row
>
curr_row
+
1
&&
!
header
)
{
office_element_ptr
row_elm
;
create_element
(
L"table"
,
L"table-row"
,
row_elm
,
odf_context_
);
table_state
->
add_row
(
row_elm
,
cells
[
i
].
row
-
curr_row
-
2
,
style_null
);
curr_row
=
cells
[
i
].
row
-
1
;
create_element
(
L"table"
,
L"table-row"
,
row_elm
,
odf_context_
);
table_state
->
add_row
(
row_elm
,
cells
[
i
].
row
-
curr_row
-
1
,
style_null
);
table_state
->
set_row_hidden
(
true
);
create_element
(
L"table"
,
L"table-row"
,
row_elm
,
odf_context_
);
table_state
->
add_row
(
row_elm
,
1
,
style_null
);
curr_row
=
cells
[
i
].
row
-
1
;
add
=
true
;
}
if
(
cells
[
i
].
row
==
curr_row
+
1
)
{
if
(
cells
[
i
].
label
==
header
&&
!
add
)
if
(
!
add
)
{
office_element_ptr
row_elm
;
create_element
(
L"table"
,
L"table-row"
,
row_elm
,
odf_context_
);
table_state
->
add_row
(
row_elm
,
1
,
style_null
);
create_element
(
L"table"
,
L"table-row"
,
row_elm
,
odf_context_
);
table_state
->
add_row
(
row_elm
,
1
,
style_null
);
}
curr_row
++
;
curr_cell
=
0
;
}
if
(
cells
[
i
].
label
==
!
header
)
continue
;
if
(
curr_cell
+
1
<
cells
[
i
].
col
)
table_state
->
add_default_cell
(
cells
[
i
].
col
-
curr_cell
-
1
);
...
...
@@ -1576,11 +1672,12 @@ void odf_chart_context::Impl::create_local_table_rows(ods_table_state * table_st
curr_cell
=
cells
[
i
].
col
;
}
return
curr_row
;
}
void
odf_chart_context
::
Impl
::
create_local_table
()
{
if
(
local_table_enabled_
==
false
)
return
;
if
(
local_table_enabled_
==
false
)
return
;
std
::
vector
<
_cell_cash
>
cells_cash
;
std
::
vector
<
_cell_cash
>
cells_cash_label
;
...
...
@@ -1590,6 +1687,9 @@ void odf_chart_context::Impl::create_local_table()
bool
col_header
=
false
;
bool
row_header
=
false
;
int
min_col
=
0xffff
;
int
min_row
=
0xffff
;
//выкинем дублирующие ref
for
(
long
i
=
0
;
i
<
cash_
.
size
();
i
++
)
...
...
@@ -1618,36 +1718,34 @@ void odf_chart_context::Impl::create_local_table()
table_name
=
refs
[
0
].
substr
(
0
,
r
);
refs
[
0
]
=
refs
[
0
].
substr
(
r
+
1
,
refs
[
0
].
size
()
-
r
);
}
utils
::
parsing_ref
(
refs
[
0
],
col1
,
row1
);
if
(
col1
<
0
&&
row1
<
0
)
//ChartDateRange2007.xlsx
{
//recalc_refs = true;
//table_name = L"local-table";
////defined name?
//row1 = i + 1;
//col1 = 0;
if
(
col1
<
min_col
)
min_col
=
col1
;
if
(
row1
<
min_row
)
min_row
=
row1
;
//row2 = i + 1;
//col2 = cash_[i].data_str.size() - 1;
//cash_[i].ref = table_name + L"." + L"$" + utils::getColAddress(col1) + L"$" + boost::lexical_cast<std::wstring>(row1) +
// + L":" + L"." + L"$" + utils::getColAddress(col2) + L"$" + boost::lexical_cast<std::wstring>(row2);
if
(
refs
.
size
()
>
1
)
{
r
=
refs
[
1
].
rfind
(
L"."
);
if
(
r
>=
0
)
refs
[
1
]
=
refs
[
1
].
substr
(
r
+
1
,
refs
[
1
].
size
()
-
r
);
utils
::
parsing_ref
(
refs
[
1
],
col2
,
row2
);
if
(
col2
<
min_col
)
min_col
=
col2
;
if
(
row2
<
min_row
)
min_row
=
row2
;
}
else
{
if
(
refs
.
size
()
>
1
)
{
r
=
refs
[
1
].
rfind
(
L"."
);
if
(
r
>=
0
)
refs
[
1
]
=
refs
[
1
].
substr
(
r
+
1
,
refs
[
1
].
size
()
-
r
);
utils
::
parsing_ref
(
refs
[
1
],
col2
,
row2
);
}
else
{
col2
=
col1
;
row2
=
row1
;
}
{
col2
=
col1
;
row2
=
row1
;
}
if
(
cash_
[
i
].
categories
||
cash_
[
i
].
label
)
{
if
(
col2
-
col1
==
0
&&
cash_
[
i
].
label
)
col_header
=
true
;
if
(
row2
-
row1
==
0
)
row_header
=
true
;
}
for
(
long
j
=
0
;
j
<
cash_
[
i
].
data_str
.
size
();
j
++
)
...
...
@@ -1658,6 +1756,7 @@ void odf_chart_context::Impl::create_local_table()
{
c
.
col
=
(
col2
==
col1
)
?
col1
:
col1
+
j
;
c
.
row
=
(
row2
==
row1
)
?
row1
:
row1
+
j
;
c
.
val
=
cash_
[
i
].
data_str
[
j
];
c
.
label
=
false
;
}
...
...
@@ -1667,27 +1766,22 @@ void odf_chart_context::Impl::create_local_table()
c
.
cash_only
=
true
;
}
if
(
cash_
[
i
].
label
&&
c
.
row
==
1
)
if
(
(
cash_
[
i
].
categories
||
cash_
[
i
].
label
)
&&
row_header
)
{
c
.
label
=
cash_
[
i
].
label
;
row_header
=
true
;
cells_cash_label
.
push_back
(
c
);
}
if
(
cash_
[
i
].
label
&&
c
.
col
==
1
)
else
{
c
ol_header
=
true
;
c
ells_cash
.
push_back
(
c
)
;
}
cells_cash
.
push_back
(
c
);
if
(
c
.
label
)
cells_cash_label
.
push_back
(
c
);
//else cells_cash.push_back(c);
if
(
c
.
col
>
max_columns
&&
c
.
col
<
10000
)
max_columns
=
c
.
col
;
}
}
std
::
sort
(
cells_cash
.
begin
()
,
cells_cash
.
end
()
,
sort_cells
);
std
::
sort
(
cells_cash_label
.
begin
()
,
cells_cash_label
.
end
()
,
sort_cells
);
/////////////////////////
//create tables
...
...
@@ -1699,7 +1793,7 @@ void odf_chart_context::Impl::create_local_table()
{
current_level_
[
0
].
elm
->
add_child_element
(
table_elm
);
int
level
=
current_level_
.
size
();
odf_element_state
state
=
{
table_elm
,
L""
,
office_element_ptr
(),
level
+
1
};
odf_element_state
state
=
{
table_elm
,
L""
,
office_element_ptr
(),
level
+
1
};
current_chart_state_
.
elements_
.
push_back
(
state
);
table_state
->
set_table_name
(
table_name
);
...
...
@@ -1717,7 +1811,7 @@ void odf_chart_context::Impl::create_local_table()
}
office_element_ptr
cols_elm
;
create_element
(
L"table"
,
L"table-columns"
,
cols_elm
,
odf_context_
);
create_element
(
L"table"
,
L"table-columns"
,
cols_elm
,
odf_context_
);
table_elm
->
add_child_element
(
cols_elm
);
...
...
@@ -1728,6 +1822,8 @@ void odf_chart_context::Impl::create_local_table()
office_element_ptr
row_elm
;
office_element_ptr
style_null
;
int
current_row
=
0
;
if
(
cells_cash_label
.
size
()
>
0
||
cells_cash
.
size
()
>
0
)
{
if
(
cells_cash_label
.
size
()
>
0
&&
row_header
)
...
...
@@ -1735,23 +1831,26 @@ void odf_chart_context::Impl::create_local_table()
create_element
(
L"table"
,
L"table-header-rows"
,
row_headers_elm
,
odf_context_
);
table_state
->
start_headers
(
row_headers_elm
);
c
reate_local_table_rows
(
table_state
,
cells_cash_label
,
true
);
c
urrent_row
=
create_local_table_rows
(
current_row
,
table_state
,
cells_cash_label
,
true
);
table_state
->
end_headers
();
}
if
(
cells_cash
.
size
()
>
0
)
create_local_table_rows
(
table_state
,
cells_cash
,
false
);
if
(
cells_cash
.
size
()
>
0
)
{
current_row
=
create_local_table_rows
(
current_row
,
table_state
,
cells_cash
,
false
);
}
else
{
create_element
(
L"table"
,
L"table-rows"
,
row_elm
,
odf_context_
);
table_state
->
add_row
(
row_elm
,
1
,
style_null
);
create_element
(
L"table"
,
L"table-rows"
,
row_elm
,
odf_context_
);
table_state
->
add_row
(
row_elm
,
1
,
style_null
);
}
}
else
{
create_element
(
L"table"
,
L"table-header-rows"
,
row_headers_elm
,
odf_context_
);
create_element
(
L"table"
,
L"table-header-rows"
,
row_headers_elm
,
odf_context_
);
table_state
->
start_headers
(
row_headers_elm
);
{
create_element
(
L"table"
,
L"table-row"
,
row_elm
,
odf_context_
);
create_element
(
L"table"
,
L"table-row"
,
row_elm
,
odf_context_
);
table_state
->
add_row
(
row_elm
,
1
,
style_null
);
{
office_element_ptr
cell_elm
;
...
...
@@ -1763,7 +1862,7 @@ void odf_chart_context::Impl::create_local_table()
}
table_state
->
end_headers
();
create_element
(
L"table"
,
L"table-rows"
,
row_elm
,
odf_context_
);
create_element
(
L"table"
,
L"table-rows"
,
row_elm
,
odf_context_
);
table_state
->
add_row
(
row_elm
,
1
,
style_null
);
}
}
...
...
ASCOfficeOdfFileW/source/OdfFormat/odf_chart_context.h
View file @
e70a2677
...
...
@@ -144,9 +144,8 @@ public:
void
set_layout_w
(
double
*
val
,
int
mode
);
void
set_layout_h
(
double
*
val
,
int
mode
);
void
set_local_table
(
bool
Val
);
//void set_cash(std::wstring format, std::vector<double> &data);
void
set_cash
(
std
::
wstring
format
,
std
::
vector
<
std
::
wstring
>
&
data
,
bool
label
=
false
);
void
set_local_table
(
bool
Val
,
bool
use_cash_only
=
false
);
void
set_cash
(
std
::
wstring
format
,
std
::
vector
<
std
::
wstring
>
&
data
,
bool
categories
,
bool
label
);
void
end_chart
();
...
...
ASCOfficeOdfFileW/source/OdfFormat/odf_drawing_context.cpp
View file @
e70a2677
...
...
@@ -1654,6 +1654,9 @@ void odf_drawing_context::set_line_dash_preset(int style)
{
if
(
!
impl_
->
current_graphic_properties
)
return
;
if
((
impl_
->
current_graphic_properties
->
content
().
draw_stroke_
)
&&
(
impl_
->
current_graphic_properties
->
content
().
draw_stroke_
->
get_type
()
==
line_style
::
None
))
return
;
switch
(
style
)
//+создать стиль, привзать имена
{
case
0
:
//presetlinedashvalDash
...
...
ASCOfficeOdfFileW/source/OdfFormat/odf_style_context.cpp
View file @
e70a2677
...
...
@@ -256,10 +256,10 @@ bool odf_style_context::find_odf_style_state(int oox_id_style, style_family::typ
{
if
(
style_state_list_
[
i
]
->
odf_style_
)
{
if
(
style_state_list_
[
i
]
->
get_family_type
()
==
family
&&
style_state_list_
[
i
]
->
root_
==
root
&&
style_state_list_
[
i
]
->
automatic_
==
automatic
&&
style_state_list_
[
i
]
->
conditional_
==
false
&&
if
(
style_state_list_
[
i
]
->
get_family_type
()
==
family
&&
style_state_list_
[
i
]
->
root_
==
root
&&
style_state_list_
[
i
]
->
automatic_
==
automatic
&&
style_state_list_
[
i
]
->
conditional_
==
false
&&
style_state_list_
[
i
]
->
default_
==
false
)
{
if
(
oox_id_style
>=
0
&&
style_state_list_
[
i
]
->
style_oox_id_
==
oox_id_style
)
...
...
@@ -325,7 +325,7 @@ bool odf_style_context::find_odf_style(std::wstring style_name, style_family::ty
}
office_element_ptr
odf_style_context
::
find_odf_style_default
(
style_family
::
type
family
)
{
for
(
int
i
=
0
;
i
<
current_default_styles_
.
size
();
i
++
)
for
(
int
i
=
0
;
i
<
current_default_styles_
.
size
();
i
++
)
{
if
(
current_default_styles_
[
i
]
->
odf_style_
)
{
...
...
@@ -336,11 +336,12 @@ office_element_ptr odf_style_context::find_odf_style_default(style_family::type
}
std
::
wstring
odf_style_context
::
find_odf_style_name_default
(
style_family
::
type
family
)
{
for
(
int
i
=
0
;
i
<
current_default_styles_
.
size
();
i
++
)
for
(
int
i
=
0
;
i
<
current_default_styles_
.
size
();
i
++
)
{
if
(
current_default_styles_
[
i
]
->
odf_style_
)
{
if
(
current_default_styles_
[
i
]
->
get_family_type
()
==
family
)
return
current_default_styles_
[
i
]
->
get_name
();
if
(
current_default_styles_
[
i
]
->
get_family_type
()
==
family
)
return
current_default_styles_
[
i
]
->
get_name
();
}
}
return
L""
;
...
...
ASCOfficeOdfFileW/source/OdfFormat/odf_style_state.cpp
View file @
e70a2677
...
...
@@ -103,9 +103,8 @@ void odf_style_state::set_display_name(std::wstring name)
}
std
::
wstring
odf_style_state
::
get_name
()
{
style
*
style_
=
dynamic_cast
<
style
*>
(
odf_style_
.
get
());
if
(
!
style_
)
return
odf_style_name_
;
style
*
style_
=
dynamic_cast
<
style
*>
(
odf_style_
.
get
());
if
(
!
style_
)
return
odf_style_name_
;
return
style_
->
style_name_
;
}
...
...
@@ -161,7 +160,12 @@ void odf_style_state::set_default(bool val)
}
void
odf_style_state
::
set_conditional
(
bool
val
)
{
style
*
style_
=
dynamic_cast
<
style
*>
(
odf_style_
.
get
());
if
(
!
style_
)
return
;
conditional_
=
val
;
if
(
val
)
style_
->
style_name_
=
L"dx_"
+
style_
->
style_name_
;
}
//------------------------------------------------------------------------------------
bool
odf_style_state
::
get_list_style_exist
()
...
...
ASCOfficeOdfFileW/source/OdfFormat/odf_style_state.h
View file @
e70a2677
...
...
@@ -120,8 +120,8 @@ private:
///////
bool
automatic_
;
bool
root_
;
bool
default_
;
// это для тех стилей что в root
bool
conditional_
;
//стили накладываемые по условию
bool
default_
;
// это для тех стилей что в root
bool
conditional_
;
//стили накладываемые по условию
bool
writable_
;
...
...
ASCOfficeOdfFileW/source/OdfFormat/ods_conversion_context.cpp
View file @
e70a2677
...
...
@@ -99,15 +99,26 @@ void ods_conversion_context::end_document()
odf_conversion_context
::
end_document
();
}
void
ods_conversion_context
::
start
_autofilter
(
std
::
wstring
ref
)
void
ods_conversion_context
::
add
_autofilter
(
std
::
wstring
ref
)
{
table_context_
.
start
_autofilter
(
ref
);
table_context_
.
add
_autofilter
(
ref
);
}
void
ods_conversion_context
::
start_conditional_formats
()
{
current_table
().
start_conditional_formats
();
}
void
ods_conversion_context
::
start_table_part
(
std
::
wstring
name
,
std
::
wstring
ref
)
{
table_context_
.
start_table_part
(
name
,
ref
);
}
void
ods_conversion_context
::
set_table_part_autofilter
(
bool
val
)
{
table_context_
.
set_table_part_autofilter
(
val
);
}
void
ods_conversion_context
::
end_table_part
()
{
table_context_
.
end_table_part
();
}
void
ods_conversion_context
::
add_defined_range
(
const
std
::
wstring
&
name
,
const
std
::
wstring
&
cell_range
,
int
sheet_id
,
bool
printable
)
{
table_context_
.
add_defined_range
(
name
,
cell_range
,
sheet_id
,
printable
);
...
...
ASCOfficeOdfFileW/source/OdfFormat/ods_conversion_context.h
View file @
e70a2677
...
...
@@ -105,11 +105,13 @@ public:
double
convert_symbol_width
(
double
val
);
void
add_defined_range
(
const
std
::
wstring
&
name
,
const
std
::
wstring
&
cell_range
,
int
sheet_id
,
bool
printable
=
false
);
void
add_defined_expression
(
const
std
::
wstring
&
name
,
const
std
::
wstring
&
value
,
int
sheet_id
,
bool
printable
=
false
);
void
add_defined_range
(
const
std
::
wstring
&
name
,
const
std
::
wstring
&
cell_range
,
int
sheet_id
,
bool
printable
=
false
);
void
add_defined_expression
(
const
std
::
wstring
&
name
,
const
std
::
wstring
&
value
,
int
sheet_id
,
bool
printable
=
false
);
void
add_autofilter
(
std
::
wstring
ref
);
void
start_autofilter
(
std
::
wstring
ref
);
void
end_autofilter
(){}
void
start_table_part
(
std
::
wstring
name
,
std
::
wstring
ref
);
void
end_table_part
();
void
set_table_part_autofilter
(
bool
val
);
void
start_conditional_formats
();
void
end_conditional_formats
(){}
...
...
ASCOfficeOdfFileW/source/OdfFormat/ods_table_context.cpp
View file @
e70a2677
...
...
@@ -56,7 +56,48 @@ ods_table_state & ods_table_context::state()
{
return
table_state_list_
.
back
();
}
void
ods_table_context
::
start_autofilter
(
std
::
wstring
ref
)
void
ods_table_context
::
start_table_part
(
std
::
wstring
name
,
std
::
wstring
ref
)
{
if
(
!
table_database_ranges_
.
root
)
create_element
(
L"table"
,
L"database-ranges"
,
table_database_ranges_
.
root
,
&
context_
);
office_element_ptr
elm
;
create_element
(
L"table"
,
L"database-range"
,
elm
,
&
context_
);
table_database_range
*
d_range
=
dynamic_cast
<
table_database_range
*>
(
elm
.
get
());
if
(
!
d_range
)
return
;
formulasconvert
::
oox2odf_converter
formulas_converter
;
std
::
wstring
odf_range
=
formulas_converter
.
convert_named_ref
(
ref
);
boost
::
algorithm
::
replace_all
(
odf_range
,
L"["
,
L""
);
boost
::
algorithm
::
replace_all
(
odf_range
,
L"]"
,
L""
);
d_range
->
table_target_range_address_
=
odf_range
;
d_range
->
table_name_
=
name
;
//d_range->table_display_filter_buttons_= true;
table_database_ranges_
.
root
->
add_child_element
(
elm
);
table_database_ranges_
.
elements
.
push_back
(
elm
);
}
void
ods_table_context
::
set_table_part_autofilter
(
bool
val
)
{
if
(
!
val
)
return
;
if
(
table_database_ranges_
.
elements
.
empty
())
return
;
table_database_range
*
d_range
=
dynamic_cast
<
table_database_range
*>
(
table_database_ranges_
.
elements
.
back
().
get
());
if
(
!
d_range
)
return
;
d_range
->
table_display_filter_buttons_
=
true
;
}
void
ods_table_context
::
end_table_part
()
{
}
void
ods_table_context
::
add_autofilter
(
std
::
wstring
ref
)
{
if
(
!
table_database_ranges_
.
root
)
create_element
(
L"table"
,
L"database-ranges"
,
table_database_ranges_
.
root
,
&
context_
);
...
...
@@ -140,8 +181,7 @@ void ods_table_context::add_defined_expression(const std::wstring & name, const
formulasconvert
::
oox2odf_converter
formulas_converter
;
std
::
wstring
odf_value
=
formulas_converter
.
convert_formula
(
value
);
//formulas_converter.convert_named_ref(value); -> ChartDateRange2007.xlsx
std
::
wstring
odf_value
=
formulas_converter
.
convert_named_ref
(
value
);
std
::
wstring
odf_base_cell
=
formulas_converter
.
find_base_cell
(
value
);
named_expression
->
table_name_
=
name
;
...
...
ASCOfficeOdfFileW/source/OdfFormat/ods_table_context.h
View file @
e70a2677
...
...
@@ -72,8 +72,11 @@ public:
void
add_defined_range
(
const
std
::
wstring
&
name
,
const
std
::
wstring
&
cell_range
,
int
sheet_id
,
bool
printable
=
false
);
void
add_defined_expression
(
const
std
::
wstring
&
name
,
const
std
::
wstring
&
value
,
int
sheet_id
,
bool
printable
=
false
);
void
start_autofilter
(
std
::
wstring
ref
);
void
add_autofilter
(
std
::
wstring
ref
);
void
start_table_part
(
std
::
wstring
name
,
std
::
wstring
ref
);
void
set_table_part_autofilter
(
bool
val
);
void
end_table_part
();
private:
...
...
ASCOfficeOdfFileW/source/OdfFormat/ods_table_state.cpp
View file @
e70a2677
...
...
@@ -326,14 +326,14 @@ void ods_table_state::set_table_dimension(int col, int row)
{
if
(
col
<
1
||
row
<
1
)
return
;
if
(
dimension_columns
<
col
)
dimension_columns
=
col
+
1
;
if
(
dimension_row
<
row
)
dimension_row
=
row
+
1
;
if
(
dimension_columns
<
col
)
dimension_columns
=
col
+
1
;
if
(
dimension_row
<
row
)
dimension_row
=
row
+
1
;
}
void
ods_table_state
::
add_row
(
office_element_ptr
&
elm
,
short
repeated
,
office_element_ptr
&
style_elm
)
{
current_table_column_
=
0
;
current_table_row_
+=
repeated
;
current_table_column_
=
0
;
current_table_row_
+=
repeated
;
current_level_
.
back
()
->
add_child_element
(
elm
);
...
...
@@ -352,7 +352,7 @@ void ods_table_state::add_row(office_element_ptr & elm, short repeated, office_e
if
(
style_name
.
length
()
>
0
)
row
->
table_table_row_attlist_
.
table_style_name_
=
style_ref
(
style_name
);
row
->
table_table_row_attlist_
.
table_number_rows_repeated_
=
repeated
;
row_default_cell_style_name_
=
L""
;
row_default_cell_style_name_
=
L""
;
}
void
ods_table_state
::
set_row_hidden
(
bool
Val
)
...
...
ASCOfficeOdfFileW/source/OdfFormat/ods_table_state.h
View file @
e70a2677
...
...
@@ -134,8 +134,18 @@ namespace utils {
std
::
reverse
(
col
.
begin
(),
col
.
end
());
std
::
reverse
(
row
.
begin
(),
row
.
end
());
}
static
void
parsing_ref
(
const
std
::
wstring
&
ref
,
int
&
col
,
int
&
row
)
static
void
parsing_ref
(
std
::
wstring
ref
,
int
&
col
,
int
&
row
)
{
int
pos
=
ref
.
rfind
(
L"!"
);
//oox table name
if
(
pos
>=
0
)
ref
=
ref
.
substr
(
pos
+
1
);
else
{
pos
=
ref
.
rfind
(
L"."
);
//odf table name
if
(
pos
>=
0
)
ref
=
ref
.
substr
(
pos
+
1
);
}
std
::
wstring
strCol
,
strRow
;
splitCellAddress
(
ref
,
strCol
,
strRow
);
...
...
ASCOfficeOdfFileW/source/OdfFormat/office_chart.cpp
View file @
e70a2677
...
...
@@ -449,7 +449,7 @@ void chart_domain::serialize(std::wostream & _Wostream)
{
CP_XML_NODE_SIMPLE
()
{
CP_XML_ATTR_OPT
(
L"
chart:table-
cell-range-address"
,
table_cell_range_address_
);
CP_XML_ATTR_OPT
(
L"
table:
cell-range-address"
,
table_cell_range_address_
);
}
}
}
...
...
ASCOfficeOdfFileW/source/OdfFormat/styles.h
View file @
e70a2677
...
...
@@ -317,7 +317,7 @@ public:
// attr
std
::
wstring
style_name_
;
_CP_OPT
(
std
::
wstring
)
style_display_name_
;
odf_types
::
style_family
style_family_
;
odf_types
::
style_family
style_family_
;
_CP_OPT
(
std
::
wstring
)
style_parent_style_name_
;
_CP_OPT
(
std
::
wstring
)
style_next_style_name_
;
...
...
ASCOfficeOdfFileW/source/Oox2OdfConverter/Converter.cpp
View file @
e70a2677
...
...
@@ -1223,6 +1223,7 @@ void OoxConverter::convert(OOX::Drawing::CRunProperty * oox_run_pr, odf_writer::
text_properties
->
content
().
fo_font_family_
=
string2std_string
(
oox_run_pr
->
m_oLatinFont
->
m_oTypeFace
->
GetValue
());
else
{
text_properties
->
content
().
fo_font_family_
=
L"Calibri"
;
//default_font; ????
}
}
if
(
oox_run_pr
->
m_oAsianFont
.
IsInit
())
...
...
ASCOfficeOdfFileW/source/Oox2OdfConverter/Converter.h
View file @
e70a2677
...
...
@@ -448,8 +448,8 @@ public:
void
convert
(
OOX
::
Spreadsheet
::
CT_Marker
*
marker
);
void
convert
(
OOX
::
Spreadsheet
::
CT_Marker
*
marker
,
std
::
vector
<
OOX
::
Spreadsheet
::
CT_DPt
*>
&
dPt
);
void
convert
(
OOX
::
Spreadsheet
::
CT_ExternalData
*
external_data
);
void
convert
(
OOX
::
Spreadsheet
::
CT_NumData
*
num_data
,
bool
label
=
false
);
void
convert
(
OOX
::
Spreadsheet
::
CT_StrData
*
str_data
,
bool
label
=
false
);
void
convert
(
OOX
::
Spreadsheet
::
CT_NumData
*
num_data
,
bool
categories
,
bool
label
);
void
convert
(
OOX
::
Spreadsheet
::
CT_StrData
*
str_data
,
bool
categories
,
bool
label
);
//.vml............................................................................................................................
...
...
ASCOfficeOdfFileW/source/Oox2OdfConverter/ConverterChart.cpp
View file @
e70a2677
...
...
@@ -770,8 +770,10 @@ void OoxConverter::convert(OOX::Spreadsheet::CT_AreaSer* ser)
odf_context
()
->
chart_context
()
->
start_series
(
L"area"
);
convert
(
ser
->
m_oSpPr
.
GetPointer
());
convert
(
ser
->
m_dLbls
);
convert
(
ser
->
m_cat
,
1
);
convert
(
ser
->
m_cat
,
1
);
convert
(
ser
->
m_val
);
convert
(
ser
->
m_tx
);
if
(
ser
->
m_dPt
.
size
()
>
0
)
{
...
...
@@ -822,8 +824,10 @@ void OoxConverter::convert(OOX::Spreadsheet::CT_SurfaceSer* ser)
odf_context
()
->
chart_context
()
->
start_series
(
L"surface"
);
convert
(
ser
->
m_oSpPr
.
GetPointer
());
convert
(
ser
->
m_cat
,
1
);
convert
(
ser
->
m_cat
,
1
);
convert
(
ser
->
m_val
);
convert
(
ser
->
m_tx
);
odf_context
()
->
chart_context
()
->
end_series
();
}
...
...
@@ -836,8 +840,10 @@ void OoxConverter::convert(OOX::Spreadsheet::CT_PieSer* ser)
odf_context
()
->
chart_context
()
->
set_series_pie_explosion
(
*
ser
->
m_explosion
->
m_val
);
convert
(
ser
->
m_oSpPr
.
GetPointer
());
convert
(
ser
->
m_dLbls
);
convert
(
ser
->
m_cat
,
1
);
convert
(
ser
->
m_cat
,
1
);
convert
(
ser
->
m_val
);
convert
(
ser
->
m_tx
);
if
(
ser
->
m_dPt
.
size
()
>
0
)
{
...
...
@@ -852,8 +858,10 @@ void OoxConverter::convert(OOX::Spreadsheet::CT_BarSer* ser)
odf_context
()
->
chart_context
()
->
start_series
(
L"bar"
);
convert
(
ser
->
m_oSpPr
.
GetPointer
());
convert
(
ser
->
m_dLbls
);
convert
(
ser
->
m_cat
,
1
);
convert
(
ser
->
m_cat
,
1
);
convert
(
ser
->
m_val
);
convert
(
ser
->
m_tx
);
if
(
ser
->
m_dPt
.
size
()
>
0
)
{
...
...
@@ -871,27 +879,37 @@ void OoxConverter::convert(OOX::Spreadsheet::CT_ScatterSer* ser)
{
if
(
ser
==
NULL
)
return
;
odf_context
()
->
chart_context
()
->
start_series
(
L"scatter"
);
convert
(
ser
->
m_oSpPr
.
GetPointer
());
convert
(
ser
->
m_dLbls
);
convert
(
ser
->
m_xVal
,
2
);
//domain
convert
(
ser
->
m_tx
);
if
(
ser
->
m_marker
||
ser
->
m_dPt
.
size
()
>
0
)
{
convert
(
ser
->
m_marker
,
ser
->
m_dPt
);
}
odf_context
()
->
chart_context
()
->
end_series
();
odf_context
()
->
chart_context
()
->
start_series
(
L"scatter"
);
convert
(
ser
->
m_oSpPr
.
GetPointer
());
convert
(
ser
->
m_dLbls
);
convert
(
ser
->
m_yVal
);
convert
(
ser
->
m_tx
);
if
(
ser
->
m_marker
||
ser
->
m_dPt
.
size
()
>
0
)
{
convert
(
ser
->
m_marker
,
ser
->
m_dPt
);
}
odf_context
()
->
chart_context
()
->
end_series
();
if
(
ser
->
m_yVal
)
{
odf_context
()
->
chart_context
()
->
start_series
(
L"scatter"
);
convert
(
ser
->
m_oSpPr
.
GetPointer
());
convert
(
ser
->
m_dLbls
);
convert
(
ser
->
m_xVal
,
2
);
//domain
convert
(
ser
->
m_yVal
);
convert
(
ser
->
m_tx
);
if
(
ser
->
m_marker
||
ser
->
m_dPt
.
size
()
>
0
)
{
convert
(
ser
->
m_marker
,
ser
->
m_dPt
);
}
odf_context
()
->
chart_context
()
->
end_series
();
}
else
if
(
ser
->
m_xVal
)
{
odf_context
()
->
chart_context
()
->
start_series
(
L"scatter"
);
convert
(
ser
->
m_oSpPr
.
GetPointer
());
convert
(
ser
->
m_dLbls
);
convert
(
ser
->
m_xVal
,
1
);
convert
(
ser
->
m_tx
);
if
(
ser
->
m_marker
||
ser
->
m_dPt
.
size
()
>
0
)
{
convert
(
ser
->
m_marker
,
ser
->
m_dPt
);
}
odf_context
()
->
chart_context
()
->
end_series
();
}
}
void
OoxConverter
::
convert
(
OOX
::
Spreadsheet
::
CT_RadarSer
*
ser
)
{
...
...
@@ -900,8 +918,10 @@ void OoxConverter::convert(OOX::Spreadsheet::CT_RadarSer* ser)
odf_context
()
->
chart_context
()
->
start_series
(
L"radar"
);
convert
(
ser
->
m_oSpPr
.
GetPointer
());
convert
(
ser
->
m_dLbls
);
convert
(
ser
->
m_cat
,
1
);
convert
(
ser
->
m_cat
,
1
);
convert
(
ser
->
m_val
);
convert
(
ser
->
m_tx
);
if
(
ser
->
m_marker
||
ser
->
m_dPt
.
size
()
>
0
)
{
...
...
@@ -916,8 +936,10 @@ void OoxConverter::convert(OOX::Spreadsheet::CT_LineSer* ser)
odf_context
()
->
chart_context
()
->
start_series
(
L"line"
);
convert
(
ser
->
m_oSpPr
.
GetPointer
());
convert
(
ser
->
m_dLbls
);
convert
(
ser
->
m_cat
,
1
);
convert
(
ser
->
m_cat
,
1
);
convert
(
ser
->
m_val
);
convert
(
ser
->
m_tx
);
if
(
ser
->
m_marker
||
ser
->
m_dPt
.
size
()
>
0
)
{
...
...
@@ -1016,60 +1038,60 @@ void OoxConverter::convert(OOX::Spreadsheet::CT_SerTx* ser_tx)
if
(
ser_tx
->
m_strRef
)
{
if
(
ser_tx
->
m_strRef
->
m_f
)
odf_context
()
->
chart_context
()
->
set_series_label_formula
(
string2std_string
(
*
ser_tx
->
m_strRef
->
m_f
));
if
(
ser_tx
->
m_strRef
->
m_f
)
odf_context
()
->
chart_context
()
->
set_series_label_formula
(
string2std_string
(
*
ser_tx
->
m_strRef
->
m_f
));
convert
(
ser_tx
->
m_strRef
->
m_strCache
,
true
);
convert
(
ser_tx
->
m_strRef
->
m_strCache
,
false
,
true
);
}
//if (ser_tx->m_v)odf_context()->chart_context()->set_series_name(string2std_string(*ser_tx->m_v));
}
void
OoxConverter
::
convert
(
OOX
::
Spreadsheet
::
CT_AxDataSource
*
cat
,
int
type
)
{
if
(
cat
==
NULL
)
{
odf_context
()
->
chart_context
()
->
set_category_axis_formula
(
L""
,
type
);
return
;
}
if
(
cat
==
NULL
)
return
;
if
(
cat
->
m_numLit
)
{
odf_context
()
->
chart_context
()
->
set_series_value_formula
(
L""
);
convert
(
cat
->
m_numLit
);
convert
(
cat
->
m_numLit
,
false
,
false
);
}
else
if
(
cat
->
m_strLit
)
{
odf_context
()
->
chart_context
()
->
set_category_axis_formula
(
L""
,
type
);
convert
(
cat
->
m_strLit
,
true
);
convert
(
cat
->
m_strLit
,
true
,
false
);
}
else
if
(
cat
->
m_strRef
)
{
if
(
cat
->
m_strRef
->
m_f
)
odf_context
()
->
chart_context
()
->
set_category_axis_formula
(
string2std_string
(
*
cat
->
m_strRef
->
m_f
),
type
);
if
(
cat
->
m_strRef
->
m_f
)
odf_context
()
->
chart_context
()
->
set_category_axis_formula
(
string2std_string
(
*
cat
->
m_strRef
->
m_f
),
type
);
convert
(
cat
->
m_strRef
->
m_strCache
,
true
/*, type == 1 ? true:false*/
);
convert
(
cat
->
m_strRef
->
m_strCache
,
true
,
false
);
}
else
if
(
cat
->
m_numRef
)
{
if
(
cat
->
m_numRef
->
m_f
)
odf_context
()
->
chart_context
()
->
set_category_axis_formula
(
string2std_string
(
*
cat
->
m_numRef
->
m_f
),
type
);
if
(
cat
->
m_numRef
->
m_f
)
odf_context
()
->
chart_context
()
->
set_category_axis_formula
(
string2std_string
(
*
cat
->
m_numRef
->
m_f
),
type
);
convert
(
cat
->
m_numRef
->
m_numCache
,
true
);
convert
(
cat
->
m_numRef
->
m_numCache
,
true
,
false
);
}
}
void
OoxConverter
::
convert
(
OOX
::
Spreadsheet
::
CT_NumDataSource
*
val
)
{
if
(
val
==
NULL
)
return
;
if
(
val
==
NULL
)
return
;
if
(
val
->
m_numLit
)
{
odf_context
()
->
chart_context
()
->
set_series_value_formula
(
L""
);
convert
(
val
->
m_numLit
);
convert
(
val
->
m_numLit
,
false
,
false
);
}
else
if
(
val
->
m_numRef
)
{
if
(
val
->
m_numRef
->
m_f
)
odf_context
()
->
chart_context
()
->
set_series_value_formula
(
string2std_string
(
*
val
->
m_numRef
->
m_f
));
convert
(
val
->
m_numRef
->
m_numCache
);
convert
(
val
->
m_numRef
->
m_numCache
,
false
,
false
);
}
}
...
...
@@ -1111,7 +1133,7 @@ void OoxConverter::convert(OOX::Spreadsheet::CT_ExternalData *external_data)
odf_context
()
->
chart_context
()
->
set_local_table
(
true
);
//пока пользуем кэш ....
}
void
OoxConverter
::
convert
(
OOX
::
Spreadsheet
::
CT_NumData
*
num_data
,
bool
label
)
void
OoxConverter
::
convert
(
OOX
::
Spreadsheet
::
CT_NumData
*
num_data
,
bool
categories
,
bool
label
)
{
if
(
num_data
==
NULL
)
return
;
...
...
@@ -1120,7 +1142,6 @@ void OoxConverter::convert(OOX::Spreadsheet::CT_NumData *num_data, bool label)
for
(
unsigned
int
i
=
0
;
i
<
num_data
->
m_pt
.
size
();
i
++
)
{
if
(
num_data
->
m_pt
[
i
]
&&
num_data
->
m_pt
[
i
]
->
m_v
)
{
data
.
push_back
(
string2std_string
(
*
num_data
->
m_pt
[
i
]
->
m_v
));
...
...
@@ -1137,10 +1158,10 @@ void OoxConverter::convert(OOX::Spreadsheet::CT_NumData *num_data, bool label)
std
::
wstring
format
;
if
(
num_data
->
m_formatCode
)
format
=
string2std_string
(
*
num_data
->
m_formatCode
);
odf_context
()
->
chart_context
()
->
set_cash
(
format
,
data
,
label
);
odf_context
()
->
chart_context
()
->
set_cash
(
format
,
data
,
categories
,
label
);
}
void
OoxConverter
::
convert
(
OOX
::
Spreadsheet
::
CT_StrData
*
str_data
,
bool
label
)
void
OoxConverter
::
convert
(
OOX
::
Spreadsheet
::
CT_StrData
*
str_data
,
bool
categories
,
bool
label
)
{
if
(
str_data
==
NULL
)
return
;
std
::
vector
<
std
::
wstring
>
data
;
...
...
@@ -1153,6 +1174,6 @@ void OoxConverter::convert(OOX::Spreadsheet::CT_StrData *str_data, bool label)
}
std
::
wstring
format
;
odf_context
()
->
chart_context
()
->
set_cash
(
format
,
data
,
label
);
odf_context
()
->
chart_context
()
->
set_cash
(
format
,
data
,
categories
,
label
);
}
}
ASCOfficeOdfFileW/source/Oox2OdfConverter/XlsxConverter.cpp
View file @
e70a2677
...
...
@@ -341,17 +341,28 @@ void XlsxConverter::convert(OOX::Spreadsheet::CWorksheet *oox_sheet)
void
XlsxConverter
::
convert
(
OOX
::
Spreadsheet
::
CTable
*
oox_table_part
)
{
if
(
!
oox_table_part
)
return
;
//nullable<SimpleTypes::CRelationshipId > m_oRef;
//nullable<SimpleTypes::CUnsignedDecimalNumber<> > m_oHeaderRowCount;
//nullable<SimpleTypes::CUnsignedDecimalNumber<> > m_oTotalsRowCount;
//nullable<CString > m_oDisplayName;
//nullable<SimpleTypes::CUnsignedDecimalNumber<> > m_oHeaderRowCount;
//nullable<SimpleTypes::CUnsignedDecimalNumber<> > m_oTotalsRowCount;
//nullable<CSortState > m_oSortState;
//nullable<CTableColumns > m_oTableColumns;
//nullable<CTableStyleInfo > m_oTableStyleInfo;
//nullable<CSortState > m_oSortState;
//nullable<CTableColumns > m_oTableColumns;
//----------------------------------------------------------------------------------------------------------------
std
::
wstring
name
;
std
::
wstring
ref
;
if
(
oox_table_part
->
m_oDisplayName
.
IsInit
()
&&
oox_table_part
->
m_oRef
.
IsInit
())
{
name
=
oox_table_part
->
m_oDisplayName
.
get
();
ref
=
oox_table_part
->
m_oRef
->
GetValue
();
}
convert
(
oox_table_part
->
m_oAutoFilter
.
GetPointer
());
ods_context
->
start_table_part
(
name
,
ref
);
if
(
oox_table_part
->
m_oAutoFilter
.
IsInit
())
ods_context
->
set_table_part_autofilter
(
true
);
ods_context
->
end_table_part
();
}
...
...
@@ -777,7 +788,7 @@ void XlsxConverter::convert(OOX::Spreadsheet::CCol *oox_column)
{
int
xfd_id
=
oox_column
->
m_oStyle
->
GetValue
();
style_cell_name
=
ods_context
->
styles_context
()
->
find_odf_style_name
(
xfd_id
,
odf_types
::
style_family
::
TableCell
,
false
,
true
);
style_cell_name
=
ods_context
->
styles_context
()
->
find_odf_style_name
(
xfd_id
,
odf_types
::
style_family
::
TableCell
,
false
,
true
);
}
else
{
...
...
@@ -907,7 +918,8 @@ void XlsxConverter::convert(OOX::Spreadsheet::CSheetViews *oox_sheet_views)
{
if
(
oox_sheet_views
->
m_arrItems
[
i
]
->
m_oSelection
->
m_oActiveCell
.
IsInit
())
{
odf_writer
::
utils
::
parsing_ref
(
oox_sheet_views
->
m_arrItems
[
i
]
->
m_oSelection
->
m_oActiveCell
->
GetBuffer
(),
ActiveCellX
,
ActiveCellY
);
std
::
wstring
ref
(
oox_sheet_views
->
m_arrItems
[
i
]
->
m_oSelection
->
m_oActiveCell
->
GetBuffer
());
odf_writer
::
utils
::
parsing_ref
(
ref
,
ActiveCellX
,
ActiveCellY
);
if
(
ActiveCellX
>=
0
&&
ActiveCellY
>=
0
)
{
...
...
@@ -1027,11 +1039,13 @@ void XlsxConverter::convert(OOX::Spreadsheet::CSheetFormatPr *oox_sheet_format_p
//if (default_cell_style) ods_context->styles_context()->add_default(default_cell_style);
odf_writer
::
odf_style_state_ptr
default_cell_style
;
ods_context
->
styles_context
()
->
find_odf_style_state
(
0
,
odf_types
::
style_family
::
TableCell
,
default_cell_style
,
true
,
true
);
if
(
default_cell_style
)
ods_context
->
styles_context
()
->
add_default
(
default_cell_style
);
ods_context
->
styles_context
()
->
find_odf_style_state
(
0
,
odf_types
::
style_family
::
TableCell
,
default_cell_style
,
true
,
false
);
if
(
default_cell_style
)
ods_context
->
styles_context
()
->
add_default
(
default_cell_style
);
///Column///////////////////////////////////////////////////////////////////////////////////////
ods_context
->
styles_context
()
->
create_style
(
L""
,
odf_types
::
style_family
::
TableColumn
,
true
,
false
,
-
1
);
ods_context
->
styles_context
()
->
create_style
(
L""
,
odf_types
::
style_family
::
TableColumn
,
true
,
false
,
-
1
);
{
double
width
=
8.1
;
// из приложния MS Office 2010
//в xlsx необязательно задавать ширину (колонок) - дефолтное по приложению. в oo - обязательно
...
...
@@ -1051,7 +1065,7 @@ void XlsxConverter::convert(OOX::Spreadsheet::CSheetFormatPr *oox_sheet_format_p
column_properties
->
style_table_column_properties_attlist_
.
style_column_width_
=
odf_types
::
length
(
odf_types
::
length
(
width
,
odf_types
::
length
::
pt
).
get_value_unit
(
odf_types
::
length
::
cm
),
odf_types
::
length
::
cm
);
}
}
ods_context
->
styles_context
()
->
add_default
(
ods_context
->
styles_context
()
->
last_state
()
);
ods_context
->
styles_context
()
->
add_default
(
ods_context
->
styles_context
()
->
last_state
()
);
}
//Row default //////////////////////////////////////////////////////////////////////////////////////////////////////////////
{
...
...
@@ -1073,7 +1087,7 @@ void XlsxConverter::convert(OOX::Spreadsheet::CSheetFormatPr *oox_sheet_format_p
row_properties
->
style_table_row_properties_attlist_
.
common_break_attlist_
.
fo_break_before_
=
odf_types
::
fo_break
(
odf_types
::
fo_break
::
Auto
);
}
}
ods_context
->
styles_context
()
->
add_default
(
ods_context
->
styles_context
()
->
last_state
()
);
ods_context
->
styles_context
()
->
add_default
(
ods_context
->
styles_context
()
->
last_state
()
);
}
}
void
XlsxConverter
::
convert_styles
()
...
...
@@ -1565,16 +1579,16 @@ void XlsxConverter::convert(OOX::Spreadsheet::CCellStyle * cell_style)
//придется копировать свойства все .. они автоматические стили удалить (не сохранять в файл)
odf_writer
::
odf_style_state_ptr
parent_style_state
;
if
(
ods_context
->
styles_context
()
->
find_odf_style_state
(
parent_id
,
odf_types
::
style_family
::
TableCell
,
parent_style_state
,
true
,
true
)
&&
parent_style_state
)
if
(
ods_context
->
styles_context
()
->
find_odf_style_state
(
parent_id
,
odf_types
::
style_family
::
TableCell
,
parent_style_state
,
true
,
true
)
&&
parent_style_state
)
{
parent_style_state
->
set_dont_write
(
true
);
//
parent_style_state->set_dont_write(true);
odf_writer
::
style_text_properties
*
text_props
=
style_state
->
get_text_properties
();
odf_writer
::
style_paragraph_properties
*
para_props
=
style_state
->
get_paragraph_properties
()
;
odf_writer
::
style_text_properties
*
text_props
=
style_state
->
get_text_properties
();
odf_writer
::
style_paragraph_properties
*
para_props
=
style_state
->
get_paragraph_properties
()
;
odf_writer
::
style_table_cell_properties
*
cell_props
=
style_state
->
get_table_cell_properties
();
odf_writer
::
style_text_properties
*
parent_text_props
=
parent_style_state
->
get_text_properties
();
odf_writer
::
style_paragraph_properties
*
parent_para_props
=
parent_style_state
->
get_paragraph_properties
()
;
odf_writer
::
style_text_properties
*
parent_text_props
=
parent_style_state
->
get_text_properties
();
odf_writer
::
style_paragraph_properties
*
parent_para_props
=
parent_style_state
->
get_paragraph_properties
()
;
odf_writer
::
style_table_cell_properties
*
parent_cell_props
=
parent_style_state
->
get_table_cell_properties
();
if
(
text_props
)
text_props
->
apply_from
(
parent_text_props
);
...
...
@@ -1583,18 +1597,19 @@ void XlsxConverter::convert(OOX::Spreadsheet::CCellStyle * cell_style)
}
}
void
XlsxConverter
::
convert
(
OOX
::
Spreadsheet
::
CDxf
*
dxFmt
,
int
oox_id
)
void
XlsxConverter
::
convert
(
OOX
::
Spreadsheet
::
CDxf
*
dxFmt
,
int
oox_
dx_
id
)
{
if
(
!
dxFmt
)
return
;
ods_context
->
styles_context
()
->
create_style
(
L""
,
odf_types
::
style_family
::
TableCell
,
false
,
true
,
oox_id
);
ods_context
->
styles_context
()
->
create_style
(
L""
,
odf_types
::
style_family
::
TableCell
,
false
,
true
,
oox_dx_id
);
ods_context
->
styles_context
()
->
last_state
()
->
set_conditional
(
true
);
odf_writer
::
style_text_properties
*
text_properties
=
ods_context
->
styles_context
()
->
last_state
()
->
get_text_properties
();
odf_writer
::
style_text_properties
*
text_properties
=
ods_context
->
styles_context
()
->
last_state
()
->
get_text_properties
();
odf_writer
::
style_table_cell_properties
*
table_cell_properties
=
ods_context
->
styles_context
()
->
last_state
()
->
get_table_cell_properties
();
convert
(
dxFmt
->
m_oBorder
.
GetPointer
(),
table_cell_properties
);
convert
(
dxFmt
->
m_oFill
.
GetPointer
(),
table_cell_properties
);
convert
(
dxFmt
->
m_oFont
.
GetPointer
(),
text_properties
);
convert
(
dxFmt
->
m_oBorder
.
GetPointer
()
,
table_cell_properties
);
convert
(
dxFmt
->
m_oFill
.
GetPointer
()
,
table_cell_properties
);
convert
(
dxFmt
->
m_oFont
.
GetPointer
()
,
text_properties
);
if
(
dxFmt
->
m_oNumFmt
.
IsInit
())
{
...
...
@@ -1624,9 +1639,9 @@ void XlsxConverter::convert(OOX::Spreadsheet::CXfs * xfc_style, int oox_id, bool
int
font_id
=
xfc_style
->
m_oFontId
.
IsInit
()
?
xfc_style
->
m_oFontId
->
GetValue
()
:
-
1
;
int
border_id
=
xfc_style
->
m_oBorderId
.
IsInit
()
?
xfc_style
->
m_oBorderId
->
GetValue
()
:
-
1
;
ods_context
->
styles_context
()
->
create_style
(
L""
,
odf_types
::
style_family
::
TableCell
,
automatic
,
root
,
oox_id
);
ods_context
->
styles_context
()
->
create_style
(
L""
,
odf_types
::
style_family
::
TableCell
,
automatic
,
root
,
oox_id
);
odf_writer
::
style_text_properties
*
text_properties
=
ods_context
->
styles_context
()
->
last_state
()
->
get_text_properties
();
odf_writer
::
style_text_properties
*
text_properties
=
ods_context
->
styles_context
()
->
last_state
()
->
get_text_properties
();
odf_writer
::
style_table_cell_properties
*
table_cell_properties
=
ods_context
->
styles_context
()
->
last_state
()
->
get_table_cell_properties
();
if
(
xlsx_styles
->
m_oFonts
.
IsInit
()
&&
font_id
>=
0
&&
(
id_parent
<
0
||
xfc_style
->
m_oApplyFont
.
IsInit
()))
...
...
@@ -2178,14 +2193,11 @@ void XlsxConverter::convert(OOX::Spreadsheet::CAutofilter *oox_filter)
if
(
oox_filter
->
m_oSortState
->
m_oCaseSensitive
.
IsInit
()
&&
oox_filter
->
m_oSortState
->
m_oCaseSensitive
->
GetValue
()
==
1
)
caseSensitive
=
true
;
}
ods_context
->
start_autofilter
(
ref
);
//target
{
for
(
unsigned
int
i
=
0
;
i
<
oox_filter
->
m_arrItems
.
size
();
i
++
)
//set items todooo
{
}
}
ods_context
->
end_autofilter
();
ods_context
->
add_autofilter
(
ref
);
//target
//for (unsigned int i=0; i < oox_filter->m_arrItems.size(); i++)//set items todooo
//{
//}
}
}
// namespace Docx2Odt
ASCOfficeOdfFileW/source/win32/OdfFormat.vcproj
View file @
e70a2677
...
...
@@ -709,10 +709,6 @@
RelativePath=
"..\OdfFormat\odf_chart_context.cpp"
>
</File>
<File
RelativePath=
"..\OdfFormat\odf_chart_context.h"
>
</File>
<File
RelativePath=
"..\OdfFormat\odf_comment_context.cpp"
>
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment