Line data Source code
1 : /* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
2 : /*
3 : * This file is part of the LibreOffice project.
4 : *
5 : * This Source Code Form is subject to the terms of the Mozilla Public
6 : * License, v. 2.0. If a copy of the MPL was not distributed with this
7 : * file, You can obtain one at http://mozilla.org/MPL/2.0/.
8 : *
9 : * This file incorporates work covered by the following license notice:
10 : *
11 : * Licensed to the Apache Software Foundation (ASF) under one or more
12 : * contributor license agreements. See the NOTICE file distributed
13 : * with this work for additional information regarding copyright
14 : * ownership. The ASF licenses this file to you under the Apache
15 : * License, Version 2.0 (the "License"); you may not use this file
16 : * except in compliance with the License. You may obtain a copy of
17 : * the License at http://www.apache.org/licenses/LICENSE-2.0 .
18 : */
19 :
20 : #include "XMLExportDataPilot.hxx"
21 : #include <xmloff/xmltoken.hxx>
22 : #include <xmloff/xmlnmspe.hxx>
23 : #include <xmloff/xmluconv.hxx>
24 : #include <xmloff/nmspmap.hxx>
25 : #include <sax/tools/converter.hxx>
26 : #include <rtl/math.hxx>
27 : #include "xmlexprt.hxx"
28 : #include "XMLConverter.hxx"
29 : #include "document.hxx"
30 : #include "dpobject.hxx"
31 : #include "dociter.hxx"
32 : #include "attrib.hxx"
33 : #include "patattr.hxx"
34 : #include "scitems.hxx"
35 : #include "dpsave.hxx"
36 : #include "dpshttab.hxx"
37 : #include "dpsdbtab.hxx"
38 : #include "dpdimsave.hxx"
39 : #include "dpgroup.hxx"
40 : #include "dputil.hxx"
41 : #include "rangeutl.hxx"
42 : #include "queryentry.hxx"
43 : #include <com/sun/star/sheet/DataImportMode.hpp>
44 : #include <com/sun/star/sheet/DataPilotFieldReference.hpp>
45 : #include <com/sun/star/sheet/DataPilotFieldReferenceType.hpp>
46 : #include <com/sun/star/sheet/DataPilotFieldReferenceItemType.hpp>
47 : #include <com/sun/star/sheet/DataPilotFieldSortInfo.hpp>
48 : #include <com/sun/star/sheet/DataPilotFieldAutoShowInfo.hpp>
49 : #include <com/sun/star/sheet/DataPilotFieldLayoutInfo.hpp>
50 : #include <com/sun/star/sheet/DataPilotFieldShowItemsMode.hpp>
51 : #include <com/sun/star/sheet/DataPilotFieldSortMode.hpp>
52 : #include <com/sun/star/sheet/DataPilotFieldLayoutMode.hpp>
53 : #include <com/sun/star/sheet/DataPilotFieldGroupBy.hpp>
54 :
55 : using namespace com::sun::star;
56 : using namespace xmloff::token;
57 : using ::rtl::OUString;
58 :
59 2 : ScXMLExportDataPilot::ScXMLExportDataPilot(ScXMLExport& rTempExport)
60 : : rExport(rTempExport),
61 2 : pDoc( NULL )
62 : {
63 2 : }
64 :
65 2 : ScXMLExportDataPilot::~ScXMLExportDataPilot()
66 : {
67 2 : }
68 :
69 0 : rtl::OUString ScXMLExportDataPilot::getDPOperatorXML(
70 : const ScQueryOp aFilterOperator, const bool bUseRegularExpressions) const
71 : {
72 0 : switch (aFilterOperator)
73 : {
74 : case SC_EQUAL :
75 : {
76 0 : if (bUseRegularExpressions)
77 0 : return GetXMLToken(XML_MATCH);
78 : else
79 0 : return rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("="));
80 : }
81 : case SC_NOT_EQUAL :
82 : {
83 0 : if (bUseRegularExpressions)
84 0 : return GetXMLToken(XML_NOMATCH);
85 : else
86 0 : return rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("!="));
87 : }
88 : case SC_BOTPERC :
89 0 : return GetXMLToken(XML_BOTTOM_PERCENT);
90 : case SC_BOTVAL :
91 0 : return GetXMLToken(XML_BOTTOM_VALUES);
92 : case SC_GREATER :
93 0 : return rtl::OUString(RTL_CONSTASCII_USTRINGPARAM(">"));
94 : case SC_GREATER_EQUAL :
95 0 : return rtl::OUString(RTL_CONSTASCII_USTRINGPARAM(">="));
96 : case SC_LESS :
97 0 : return rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("<"));
98 : case SC_LESS_EQUAL :
99 0 : return rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("<="));
100 : case SC_TOPPERC :
101 0 : return GetXMLToken(XML_TOP_PERCENT);
102 : case SC_TOPVAL :
103 0 : return GetXMLToken(XML_TOP_VALUES);
104 : default:
105 : OSL_FAIL("This FilterOperator is not supported.");
106 : }
107 0 : return rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("="));
108 : }
109 :
110 0 : void ScXMLExportDataPilot::WriteDPCondition(const ScQueryEntry& aQueryEntry, bool bIsCaseSensitive, bool bUseRegularExpressions)
111 : {
112 0 : rExport.AddAttribute(XML_NAMESPACE_TABLE, XML_FIELD_NUMBER, rtl::OUString::valueOf(sal_Int32(aQueryEntry.nField)));
113 0 : if (bIsCaseSensitive)
114 0 : rExport.AddAttribute(XML_NAMESPACE_TABLE, XML_CASE_SENSITIVE, XML_TRUE);
115 0 : const ScQueryEntry::Item& rItem = aQueryEntry.GetQueryItem();
116 0 : const rtl::OUString& rQueryStr = rItem.maString;
117 0 : if (rItem.meType == ScQueryEntry::ByString)
118 : {
119 0 : rExport.AddAttribute(XML_NAMESPACE_TABLE, XML_VALUE, rQueryStr);
120 : }
121 : else
122 : {
123 0 : rExport.AddAttribute(XML_NAMESPACE_TABLE, XML_DATA_TYPE, XML_NUMBER);
124 0 : rExport.AddAttribute(XML_NAMESPACE_TABLE, XML_VALUE, rQueryStr);
125 : }
126 :
127 0 : if (aQueryEntry.IsQueryByEmpty())
128 : {
129 0 : rExport.AddAttribute(XML_NAMESPACE_TABLE, XML_OPERATOR, GetXMLToken(XML_EMPTY));
130 : }
131 0 : else if (aQueryEntry.IsQueryByNonEmpty())
132 : {
133 0 : rExport.AddAttribute(XML_NAMESPACE_TABLE, XML_OPERATOR, GetXMLToken(XML_NOEMPTY));
134 : }
135 : else
136 : rExport.AddAttribute(
137 : XML_NAMESPACE_TABLE, XML_OPERATOR,
138 0 : getDPOperatorXML(aQueryEntry.eOp, bUseRegularExpressions));
139 :
140 0 : SvXMLElementExport aElemC(rExport, XML_NAMESPACE_TABLE, XML_FILTER_CONDITION, true, true);
141 0 : }
142 :
143 0 : void ScXMLExportDataPilot::WriteDPFilter(const ScQueryParam& aQueryParam)
144 : {
145 0 : SCSIZE nQueryEntryCount = aQueryParam.GetEntryCount();
146 0 : if (nQueryEntryCount > 0)
147 : {
148 0 : bool bAnd(false);
149 0 : bool bOr(false);
150 0 : bool bHasEntries(true);
151 0 : SCSIZE nEntries(0);
152 : SCSIZE j;
153 :
154 0 : for ( j = 0; (j < nQueryEntryCount) && bHasEntries; ++j)
155 : {
156 0 : ScQueryEntry aEntry = aQueryParam.GetEntry(j);
157 0 : if (aEntry.bDoQuery)
158 : {
159 0 : if (nEntries > 0)
160 : {
161 0 : if (aEntry.eConnect == SC_AND)
162 0 : bAnd = true;
163 : else
164 0 : bOr = true;
165 : }
166 0 : ++nEntries;
167 : }
168 : else
169 0 : bHasEntries = false;
170 0 : }
171 0 : nQueryEntryCount = nEntries;
172 0 : if (nQueryEntryCount)
173 : {
174 0 : if(!((aQueryParam.nCol1 == aQueryParam.nCol2) && (aQueryParam.nRow1 == aQueryParam.nRow2) &&
175 : (static_cast<SCCOLROW>(aQueryParam.nCol1) == static_cast<SCCOLROW>(aQueryParam.nRow1)) &&
176 0 : (aQueryParam.nCol1 == 0) && (aQueryParam.nTab == SCTAB_MAX)))
177 : {
178 : ScRange aConditionRange(aQueryParam.nCol1, aQueryParam.nRow1, aQueryParam.nTab,
179 0 : aQueryParam.nCol2, aQueryParam.nRow2, aQueryParam.nTab);
180 0 : rtl::OUString sConditionRange;
181 0 : ScRangeStringConverter::GetStringFromRange( sConditionRange, aConditionRange, pDoc, ::formula::FormulaGrammar::CONV_OOO );
182 0 : rExport.AddAttribute(XML_NAMESPACE_TABLE, XML_CONDITION_SOURCE_RANGE_ADDRESS, sConditionRange);
183 : }
184 0 : if (!aQueryParam.bDuplicate)
185 0 : rExport.AddAttribute(XML_NAMESPACE_TABLE, XML_DISPLAY_DUPLICATES, XML_FALSE);
186 0 : SvXMLElementExport aElemDPF(rExport, XML_NAMESPACE_TABLE, XML_FILTER, true, true);
187 0 : rExport.CheckAttrList();
188 0 : if (nQueryEntryCount == 1)
189 : {
190 0 : WriteDPCondition(aQueryParam.GetEntry(0), aQueryParam.bCaseSens, aQueryParam.bRegExp);
191 : }
192 0 : else if (bOr && !bAnd)
193 : {
194 0 : SvXMLElementExport aElemOr(rExport, XML_NAMESPACE_TABLE, XML_FILTER_OR, true, true);
195 0 : for (j = 0; j < nQueryEntryCount; ++j)
196 : {
197 0 : WriteDPCondition(aQueryParam.GetEntry(j), aQueryParam.bCaseSens, aQueryParam.bRegExp);
198 0 : }
199 : }
200 0 : else if (bAnd && !bOr)
201 : {
202 0 : SvXMLElementExport aElemAnd(rExport, XML_NAMESPACE_TABLE, XML_FILTER_AND, true, true);
203 0 : for (j = 0; j < nQueryEntryCount; ++j)
204 : {
205 0 : WriteDPCondition(aQueryParam.GetEntry(j), aQueryParam.bCaseSens, aQueryParam.bRegExp);
206 0 : }
207 : }
208 : else
209 : {
210 0 : SvXMLElementExport aElemC(rExport, XML_NAMESPACE_TABLE, XML_FILTER_OR, true, true);
211 0 : ScQueryEntry aPrevFilterField(aQueryParam.GetEntry(0));
212 0 : ScQueryConnect aConnection = aQueryParam.GetEntry(1).eConnect;
213 : bool bOpenAndElement;
214 0 : rtl::OUString aName(rExport.GetNamespaceMap().GetQNameByKey(XML_NAMESPACE_TABLE, GetXMLToken(XML_FILTER_AND)));
215 0 : if (aConnection == SC_AND)
216 : {
217 0 : rExport.StartElement( aName, true );
218 0 : bOpenAndElement = true;
219 : }
220 : else
221 0 : bOpenAndElement = false;
222 0 : for (j = 1; j < nQueryEntryCount; ++j)
223 : {
224 0 : if (aConnection != aQueryParam.GetEntry(j).eConnect)
225 : {
226 0 : aConnection = aQueryParam.GetEntry(j).eConnect;
227 0 : if (aQueryParam.GetEntry(j).eConnect == SC_AND)
228 : {
229 0 : rExport.StartElement( aName, true );
230 0 : bOpenAndElement = true;
231 0 : WriteDPCondition(aPrevFilterField, aQueryParam.bCaseSens, aQueryParam.bRegExp);
232 0 : aPrevFilterField = aQueryParam.GetEntry(j);
233 0 : if (j == nQueryEntryCount - 1)
234 : {
235 0 : WriteDPCondition(aPrevFilterField, aQueryParam.bCaseSens, aQueryParam.bRegExp);
236 0 : rExport.EndElement(aName, true);
237 0 : bOpenAndElement = false;
238 : }
239 : }
240 : else
241 : {
242 0 : WriteDPCondition(aPrevFilterField, aQueryParam.bCaseSens, aQueryParam.bRegExp);
243 0 : aPrevFilterField = aQueryParam.GetEntry(j);
244 0 : if (bOpenAndElement)
245 : {
246 0 : rExport.EndElement(aName, true);
247 0 : bOpenAndElement = false;
248 : }
249 0 : if (j == nQueryEntryCount - 1)
250 : {
251 0 : WriteDPCondition(aPrevFilterField, aQueryParam.bCaseSens, aQueryParam.bRegExp);
252 : }
253 : }
254 : }
255 : else
256 : {
257 0 : WriteDPCondition(aPrevFilterField, aQueryParam.bCaseSens, aQueryParam.bRegExp);
258 0 : aPrevFilterField = aQueryParam.GetEntry(j);
259 0 : if (j == nQueryEntryCount - 1)
260 0 : WriteDPCondition(aPrevFilterField, aQueryParam.bCaseSens, aQueryParam.bRegExp);
261 : }
262 0 : }
263 0 : }
264 : }
265 : }
266 0 : }
267 :
268 0 : void ScXMLExportDataPilot::WriteFieldReference(ScDPSaveDimension* pDim)
269 : {
270 0 : const sheet::DataPilotFieldReference* pRef = pDim->GetReferenceValue();
271 0 : if (pRef)
272 : {
273 0 : rtl::OUString sValueStr;
274 0 : switch (pRef->ReferenceType)
275 : {
276 : case sheet::DataPilotFieldReferenceType::NONE :
277 0 : sValueStr = GetXMLToken(XML_NONE);
278 0 : break;
279 : case sheet::DataPilotFieldReferenceType::ITEM_DIFFERENCE :
280 0 : sValueStr = GetXMLToken(XML_MEMBER_DIFFERENCE);
281 0 : break;
282 : case sheet::DataPilotFieldReferenceType::ITEM_PERCENTAGE :
283 0 : sValueStr = GetXMLToken(XML_MEMBER_PERCENTAGE);
284 0 : break;
285 : case sheet::DataPilotFieldReferenceType::ITEM_PERCENTAGE_DIFFERENCE :
286 0 : sValueStr = GetXMLToken(XML_MEMBER_PERCENTAGE_DIFFERENCE);
287 0 : break;
288 : case sheet::DataPilotFieldReferenceType::RUNNING_TOTAL :
289 0 : sValueStr = GetXMLToken(XML_RUNNING_TOTAL);
290 0 : break;
291 : case sheet::DataPilotFieldReferenceType::ROW_PERCENTAGE :
292 0 : sValueStr = GetXMLToken(XML_ROW_PERCENTAGE);
293 0 : break;
294 : case sheet::DataPilotFieldReferenceType::COLUMN_PERCENTAGE :
295 0 : sValueStr = GetXMLToken(XML_COLUMN_PERCENTAGE);
296 0 : break;
297 : case sheet::DataPilotFieldReferenceType::TOTAL_PERCENTAGE :
298 0 : sValueStr = GetXMLToken(XML_TOTAL_PERCENTAGE);
299 0 : break;
300 : case sheet::DataPilotFieldReferenceType::INDEX :
301 0 : sValueStr = GetXMLToken(XML_INDEX);
302 0 : break;
303 : }
304 0 : if (!sValueStr.isEmpty())
305 0 : rExport.AddAttribute(XML_NAMESPACE_TABLE, XML_TYPE, sValueStr);
306 :
307 0 : if (!pRef->ReferenceField.isEmpty())
308 0 : rExport.AddAttribute(XML_NAMESPACE_TABLE, XML_FIELD_NAME, pRef->ReferenceField);
309 :
310 0 : if (pRef->ReferenceItemType == sheet::DataPilotFieldReferenceItemType::NAMED)
311 : {
312 0 : rExport.AddAttribute(XML_NAMESPACE_TABLE, XML_MEMBER_TYPE, XML_NAMED);
313 0 : rExport.AddAttribute(XML_NAMESPACE_TABLE, XML_MEMBER_NAME, pRef->ReferenceItemName);
314 : }
315 : else
316 : {
317 0 : sValueStr = rtl::OUString();
318 0 : switch(pRef->ReferenceItemType)
319 : {
320 : case sheet::DataPilotFieldReferenceItemType::PREVIOUS :
321 0 : sValueStr = GetXMLToken(XML_PREVIOUS);
322 0 : break;
323 : case sheet::DataPilotFieldReferenceItemType::NEXT :
324 0 : sValueStr = GetXMLToken(XML_NEXT);
325 0 : break;
326 : }
327 0 : if (!sValueStr.isEmpty())
328 0 : rExport.AddAttribute(XML_NAMESPACE_TABLE, XML_MEMBER_TYPE, sValueStr);
329 : }
330 0 : SvXMLElementExport aElemDPFR(rExport, XML_NAMESPACE_TABLE, XML_DATA_PILOT_FIELD_REFERENCE, true, true);
331 : }
332 0 : rExport.CheckAttrList();
333 0 : }
334 :
335 0 : void ScXMLExportDataPilot::WriteSortInfo(ScDPSaveDimension* pDim)
336 : {
337 0 : const sheet::DataPilotFieldSortInfo* pSortInfo = pDim->GetSortInfo();
338 0 : if (pSortInfo)
339 : {
340 0 : if (pSortInfo->IsAscending)
341 0 : rExport.AddAttribute(XML_NAMESPACE_TABLE, XML_ORDER, XML_ASCENDING);
342 : else
343 0 : rExport.AddAttribute(XML_NAMESPACE_TABLE, XML_ORDER, XML_DESCENDING);
344 :
345 0 : rtl::OUString sValueStr;
346 0 : switch (pSortInfo->Mode)
347 : {
348 : case sheet::DataPilotFieldSortMode::NONE:
349 0 : sValueStr = GetXMLToken(XML_NONE);
350 0 : break;
351 : case sheet::DataPilotFieldSortMode::MANUAL:
352 0 : sValueStr = GetXMLToken(XML_MANUAL);
353 0 : break;
354 : case sheet::DataPilotFieldSortMode::NAME:
355 0 : sValueStr = GetXMLToken(XML_NAME);
356 0 : break;
357 : case sheet::DataPilotFieldSortMode::DATA:
358 0 : sValueStr = GetXMLToken(XML_DATA);
359 0 : if (!pSortInfo->Field.isEmpty())
360 0 : rExport.AddAttribute(XML_NAMESPACE_TABLE, XML_DATA_FIELD, pSortInfo->Field);
361 0 : break;
362 : }
363 0 : if (!sValueStr.isEmpty())
364 0 : rExport.AddAttribute(XML_NAMESPACE_TABLE, XML_SORT_MODE, sValueStr);
365 0 : SvXMLElementExport aElemDPLSI(rExport, XML_NAMESPACE_TABLE, XML_DATA_PILOT_SORT_INFO, true, true);
366 : }
367 0 : }
368 :
369 0 : void ScXMLExportDataPilot::WriteAutoShowInfo(ScDPSaveDimension* pDim)
370 : {
371 0 : const sheet::DataPilotFieldAutoShowInfo* pAutoInfo = pDim->GetAutoShowInfo();
372 0 : if (pAutoInfo)
373 : {
374 0 : if (pAutoInfo->IsEnabled)
375 0 : rExport.AddAttribute(XML_NAMESPACE_TABLE, XML_ENABLED, XML_TRUE);
376 : else
377 0 : rExport.AddAttribute(XML_NAMESPACE_TABLE, XML_ENABLED, XML_FALSE);
378 :
379 0 : rtl::OUString sValueStr;
380 0 : switch (pAutoInfo->ShowItemsMode)
381 : {
382 : case sheet::DataPilotFieldShowItemsMode::FROM_TOP:
383 0 : sValueStr = GetXMLToken(XML_FROM_TOP);
384 0 : break;
385 : case sheet::DataPilotFieldShowItemsMode::FROM_BOTTOM:
386 0 : sValueStr = GetXMLToken(XML_FROM_BOTTOM);
387 0 : break;
388 : }
389 0 : if (!sValueStr.isEmpty())
390 0 : rExport.AddAttribute(XML_NAMESPACE_TABLE, XML_DISPLAY_MEMBER_MODE, sValueStr);
391 :
392 0 : rtl::OUStringBuffer sBuffer;
393 0 : ::sax::Converter::convertNumber(sBuffer, pAutoInfo->ItemCount);
394 0 : rExport.AddAttribute(XML_NAMESPACE_TABLE, XML_MEMBER_COUNT, sBuffer.makeStringAndClear());
395 :
396 0 : rExport.AddAttribute(XML_NAMESPACE_TABLE, XML_DATA_FIELD, pAutoInfo->DataField);
397 :
398 0 : SvXMLElementExport aElemDPLAI(rExport, XML_NAMESPACE_TABLE, XML_DATA_PILOT_DISPLAY_INFO, true, true);
399 : }
400 0 : }
401 :
402 0 : void ScXMLExportDataPilot::WriteLayoutInfo(ScDPSaveDimension* pDim)
403 : {
404 0 : const sheet::DataPilotFieldLayoutInfo* pLayoutInfo = pDim->GetLayoutInfo();
405 0 : if (pLayoutInfo)
406 : {
407 0 : if (pLayoutInfo->AddEmptyLines)
408 0 : rExport.AddAttribute(XML_NAMESPACE_TABLE, XML_ADD_EMPTY_LINES, XML_TRUE);
409 : else
410 0 : rExport.AddAttribute(XML_NAMESPACE_TABLE, XML_ADD_EMPTY_LINES, XML_FALSE);
411 :
412 0 : rtl::OUString sValueStr;
413 0 : switch (pLayoutInfo->LayoutMode)
414 : {
415 : case sheet::DataPilotFieldLayoutMode::TABULAR_LAYOUT:
416 0 : sValueStr = GetXMLToken(XML_TABULAR_LAYOUT);
417 0 : break;
418 : case sheet::DataPilotFieldLayoutMode::OUTLINE_SUBTOTALS_TOP:
419 0 : sValueStr = GetXMLToken(XML_OUTLINE_SUBTOTALS_TOP);
420 0 : break;
421 : case sheet::DataPilotFieldLayoutMode::OUTLINE_SUBTOTALS_BOTTOM:
422 0 : sValueStr = GetXMLToken(XML_OUTLINE_SUBTOTALS_BOTTOM);
423 0 : break;
424 : }
425 0 : if (!sValueStr.isEmpty())
426 0 : rExport.AddAttribute(XML_NAMESPACE_TABLE, XML_LAYOUT_MODE, sValueStr);
427 0 : SvXMLElementExport aElemDPLLI(rExport, XML_NAMESPACE_TABLE, XML_DATA_PILOT_LAYOUT_INFO, true, true);
428 : }
429 0 : }
430 :
431 0 : void ScXMLExportDataPilot::WriteSubTotals(ScDPSaveDimension* pDim)
432 : {
433 : using sheet::GeneralFunction;
434 :
435 0 : sal_Int32 nSubTotalCount = pDim->GetSubTotalsCount();
436 0 : const OUString* pLayoutName = NULL;
437 0 : if (rExport.getDefaultVersion() > SvtSaveOptions::ODFVER_012)
438 : // Export display names only for 1.2 extended or later.
439 0 : pLayoutName = pDim->GetSubtotalName();
440 :
441 0 : if (nSubTotalCount > 0)
442 : {
443 0 : SvXMLElementExport aElemSTs(rExport, XML_NAMESPACE_TABLE, XML_DATA_PILOT_SUBTOTALS, true, true);
444 0 : rExport.CheckAttrList();
445 0 : for (sal_Int32 nSubTotal = 0; nSubTotal < nSubTotalCount; nSubTotal++)
446 : {
447 0 : rtl::OUString sFunction;
448 0 : GeneralFunction nFunc = static_cast<GeneralFunction>(pDim->GetSubTotalFunc(nSubTotal));
449 0 : ScXMLConverter::GetStringFromFunction( sFunction, nFunc);
450 0 : rExport.AddAttribute(XML_NAMESPACE_TABLE, XML_FUNCTION, sFunction);
451 0 : if (pLayoutName && nFunc == sheet::GeneralFunction_AUTO)
452 0 : rExport.AddAttribute(XML_NAMESPACE_TABLE_EXT, XML_DISPLAY_NAME, *pLayoutName);
453 0 : SvXMLElementExport aElemST(rExport, XML_NAMESPACE_TABLE, XML_DATA_PILOT_SUBTOTAL, true, true);
454 0 : }
455 : }
456 0 : }
457 :
458 0 : void ScXMLExportDataPilot::WriteMembers(ScDPSaveDimension* pDim)
459 : {
460 0 : const ScDPSaveDimension::MemberList &rMembers = pDim->GetMembers();
461 0 : if (rMembers.begin() != rMembers.end())
462 : {
463 0 : SvXMLElementExport aElemDPMs(rExport, XML_NAMESPACE_TABLE, XML_DATA_PILOT_MEMBERS, true, true);
464 0 : rExport.CheckAttrList();
465 0 : for (ScDPSaveDimension::MemberList::const_iterator i=rMembers.begin(); i != rMembers.end() ; ++i)
466 : {
467 0 : rExport.AddAttribute(XML_NAMESPACE_TABLE, XML_NAME, rtl::OUString((*i)->GetName()));
468 :
469 0 : if (rExport.getDefaultVersion() > SvtSaveOptions::ODFVER_012)
470 : {
471 : // Export display names only for ODF 1.2 extended or later.
472 0 : const OUString* pLayoutName = (*i)->GetLayoutName();
473 0 : if (pLayoutName)
474 0 : rExport.AddAttribute(XML_NAMESPACE_TABLE_EXT, XML_DISPLAY_NAME, *pLayoutName);
475 : }
476 :
477 0 : rtl::OUStringBuffer sBuffer;
478 0 : ::sax::Converter::convertBool(sBuffer, (*i)->GetIsVisible());
479 0 : rExport.AddAttribute(XML_NAMESPACE_TABLE, XML_DISPLAY, sBuffer.makeStringAndClear());
480 0 : ::sax::Converter::convertBool(sBuffer, (*i)->GetShowDetails());
481 0 : rExport.AddAttribute(XML_NAMESPACE_TABLE, XML_SHOW_DETAILS, sBuffer.makeStringAndClear());
482 0 : SvXMLElementExport aElemDPM(rExport, XML_NAMESPACE_TABLE, XML_DATA_PILOT_MEMBER, true, true);
483 0 : rExport.CheckAttrList();
484 0 : }
485 : }
486 0 : }
487 :
488 0 : void ScXMLExportDataPilot::WriteLevels(ScDPSaveDimension* pDim)
489 : {
490 : // #i114202# GetShowEmpty is only valid if HasShowEmpty is true.
491 0 : if (pDim->HasShowEmpty())
492 : {
493 0 : rtl::OUStringBuffer sBuffer;
494 0 : ::sax::Converter::convertBool(sBuffer, pDim->GetShowEmpty());
495 0 : rExport.AddAttribute(XML_NAMESPACE_TABLE, XML_SHOW_EMPTY, sBuffer.makeStringAndClear());
496 : }
497 0 : SvXMLElementExport aElemDPL(rExport, XML_NAMESPACE_TABLE, XML_DATA_PILOT_LEVEL, true, true);
498 :
499 0 : WriteSubTotals(pDim);
500 0 : WriteMembers(pDim);
501 0 : WriteAutoShowInfo(pDim);
502 0 : WriteSortInfo(pDim);
503 0 : WriteLayoutInfo(pDim);
504 0 : rExport.CheckAttrList();
505 0 : }
506 :
507 0 : void ScXMLExportDataPilot::WriteDatePart(sal_Int32 nPart)
508 : {
509 0 : switch(nPart)
510 : {
511 : case com::sun::star::sheet::DataPilotFieldGroupBy::SECONDS :
512 : {
513 0 : rExport.AddAttribute(XML_NAMESPACE_TABLE, XML_GROUPED_BY, XML_SECONDS);
514 : }
515 0 : break;
516 : case com::sun::star::sheet::DataPilotFieldGroupBy::MINUTES :
517 : {
518 0 : rExport.AddAttribute(XML_NAMESPACE_TABLE, XML_GROUPED_BY, XML_MINUTES);
519 : }
520 0 : break;
521 : case com::sun::star::sheet::DataPilotFieldGroupBy::HOURS :
522 : {
523 0 : rExport.AddAttribute(XML_NAMESPACE_TABLE, XML_GROUPED_BY, XML_HOURS);
524 : }
525 0 : break;
526 : case com::sun::star::sheet::DataPilotFieldGroupBy::DAYS :
527 : {
528 0 : rExport.AddAttribute(XML_NAMESPACE_TABLE, XML_GROUPED_BY, XML_DAYS);
529 : }
530 0 : break;
531 : case com::sun::star::sheet::DataPilotFieldGroupBy::MONTHS :
532 : {
533 0 : rExport.AddAttribute(XML_NAMESPACE_TABLE, XML_GROUPED_BY, XML_MONTHS);
534 : }
535 0 : break;
536 : case com::sun::star::sheet::DataPilotFieldGroupBy::QUARTERS :
537 : {
538 0 : rExport.AddAttribute(XML_NAMESPACE_TABLE, XML_GROUPED_BY, XML_QUARTERS);
539 : }
540 0 : break;
541 : case com::sun::star::sheet::DataPilotFieldGroupBy::YEARS :
542 : {
543 0 : rExport.AddAttribute(XML_NAMESPACE_TABLE, XML_GROUPED_BY, XML_YEARS);
544 : }
545 0 : break;
546 : }
547 0 : }
548 :
549 0 : void ScXMLExportDataPilot::WriteNumGroupInfo(const ScDPNumGroupInfo& rGroupInfo)
550 : {
551 : OSL_ENSURE(rGroupInfo.mbEnable, "group dimension should be enabled");
552 0 : if (rGroupInfo.mbDateValues)
553 : {
554 0 : if (rGroupInfo.mbAutoStart)
555 0 : rExport.AddAttribute(XML_NAMESPACE_TABLE, XML_DATE_START, XML_AUTO);
556 : else
557 : {
558 0 : rtl::OUStringBuffer sDate;
559 0 : rExport.GetMM100UnitConverter().convertDateTime(sDate, rGroupInfo.mfStart);
560 0 : rExport.AddAttribute(XML_NAMESPACE_TABLE, XML_DATE_START, sDate.makeStringAndClear());
561 : }
562 0 : if (rGroupInfo.mbAutoEnd)
563 0 : rExport.AddAttribute(XML_NAMESPACE_TABLE, XML_DATE_END, XML_AUTO);
564 : else
565 : {
566 0 : rtl::OUStringBuffer sDate;
567 0 : rExport.GetMM100UnitConverter().convertDateTime(sDate, rGroupInfo.mfEnd);
568 0 : rExport.AddAttribute(XML_NAMESPACE_TABLE, XML_DATE_END, sDate.makeStringAndClear());
569 : }
570 : }
571 : else
572 : {
573 0 : if (rGroupInfo.mbAutoStart)
574 0 : rExport.AddAttribute(XML_NAMESPACE_TABLE, XML_START, XML_AUTO);
575 : else
576 : {
577 : rtl::OUString sValue( ::rtl::math::doubleToUString( rGroupInfo.mfStart,
578 : rtl_math_StringFormat_Automatic,
579 0 : rtl_math_DecimalPlaces_Max, '.', true));
580 0 : rExport.AddAttribute(XML_NAMESPACE_TABLE, XML_START, sValue);
581 : }
582 0 : if (rGroupInfo.mbAutoEnd)
583 0 : rExport.AddAttribute(XML_NAMESPACE_TABLE, XML_END, XML_AUTO);
584 : else
585 : {
586 0 : rtl::OUStringBuffer sDate;
587 : rtl::OUString sValue( ::rtl::math::doubleToUString( rGroupInfo.mfEnd,
588 : rtl_math_StringFormat_Automatic,
589 0 : rtl_math_DecimalPlaces_Max, '.', true));
590 0 : rExport.AddAttribute(XML_NAMESPACE_TABLE, XML_END, sValue);
591 : }
592 : }
593 : rtl::OUString sValue( ::rtl::math::doubleToUString( rGroupInfo.mfStep,
594 : rtl_math_StringFormat_Automatic,
595 0 : rtl_math_DecimalPlaces_Max, '.', true));
596 0 : rExport.AddAttribute(XML_NAMESPACE_TABLE, XML_STEP, sValue);
597 0 : }
598 :
599 0 : void ScXMLExportDataPilot::WriteGroupDimAttributes(const ScDPSaveGroupDimension* pGroupDim)
600 : {
601 0 : if (pGroupDim)
602 : {
603 0 : OUString aSrcFieldName = ScDPUtil::getSourceDimensionName(pGroupDim->GetSourceDimName());
604 0 : rExport.AddAttribute(XML_NAMESPACE_TABLE, XML_IS_GROUP_FIELD, XML_TRUE);
605 0 : rExport.AddAttribute(XML_NAMESPACE_TABLE, XML_SOURCE_FIELD_NAME, aSrcFieldName);
606 0 : if (pGroupDim->GetDatePart())
607 : {
608 0 : WriteDatePart(pGroupDim->GetDatePart());
609 0 : WriteNumGroupInfo(pGroupDim->GetDateInfo());
610 0 : }
611 : }
612 0 : }
613 :
614 0 : void ScXMLExportDataPilot::WriteNumGroupDim(const ScDPSaveNumGroupDimension* pNumGroupDim)
615 : {
616 0 : if (pNumGroupDim)
617 : {
618 0 : rExport.AddAttribute(XML_NAMESPACE_TABLE, XML_IS_GROUP_FIELD, XML_TRUE);
619 0 : if (pNumGroupDim->GetDatePart())
620 : {
621 0 : WriteDatePart(pNumGroupDim->GetDatePart());
622 0 : WriteNumGroupInfo(pNumGroupDim->GetDateInfo());
623 : }
624 : else
625 : {
626 0 : WriteNumGroupInfo(pNumGroupDim->GetInfo());
627 : }
628 : }
629 0 : }
630 :
631 0 : void ScXMLExportDataPilot::WriteGroupDimElements(ScDPSaveDimension* pDim, const ScDPDimensionSaveData* pDimData)
632 : {
633 0 : const ScDPSaveGroupDimension* pGroupDim = NULL;
634 0 : const ScDPSaveNumGroupDimension* pNumGroupDim = NULL;
635 0 : if (pDimData)
636 : {
637 0 : pGroupDim = pDimData->GetNamedGroupDim(pDim->GetName());
638 0 : WriteGroupDimAttributes(pGroupDim);
639 0 : pNumGroupDim = pDimData->GetNumGroupDim(pDim->GetName());
640 0 : WriteNumGroupDim(pNumGroupDim);
641 :
642 : OSL_ENSURE((!pGroupDim || !pNumGroupDim), "there should be no NumGroup and Group at the same field");
643 : }
644 0 : if (pGroupDim || pNumGroupDim)
645 : {
646 0 : SvXMLElementExport aElemDPGs(rExport, XML_NAMESPACE_TABLE, XML_DATA_PILOT_GROUPS, true, true);
647 0 : if (pGroupDim)
648 : {
649 0 : if (!pGroupDim->GetDatePart())
650 : {
651 0 : sal_Int32 nCount = pGroupDim->GetGroupCount();
652 0 : for (sal_Int32 i = 0; i < nCount; ++i)
653 : {
654 0 : const ScDPSaveGroupItem* pGroup = pGroupDim->GetGroupByIndex( i );
655 0 : if (pGroup)
656 : {
657 0 : rExport.AddAttribute(XML_NAMESPACE_TABLE, XML_NAME, pGroup->GetGroupName());
658 0 : SvXMLElementExport aElemDPG(rExport, XML_NAMESPACE_TABLE, XML_DATA_PILOT_GROUP, true, true);
659 0 : sal_Int32 nElemCount = pGroup->GetElementCount();
660 0 : for(sal_Int32 j = 0; j < nElemCount; ++j)
661 : {
662 0 : const rtl::OUString* pElem = pGroup->GetElementByIndex(j);
663 0 : if (pElem)
664 : {
665 0 : rExport.AddAttribute(XML_NAMESPACE_TABLE, XML_NAME, *pElem);
666 0 : SvXMLElementExport aElemDPM(rExport, XML_NAMESPACE_TABLE, XML_DATA_PILOT_MEMBER, true, true);
667 : }
668 0 : }
669 : }
670 : }
671 : }
672 0 : }
673 : }
674 0 : }
675 :
676 0 : void ScXMLExportDataPilot::WriteDimension(ScDPSaveDimension* pDim, const ScDPDimensionSaveData* pDimData)
677 : {
678 0 : OUString aSrcDimName = ScDPUtil::getSourceDimensionName(pDim->GetName());
679 0 : rExport.AddAttribute(XML_NAMESPACE_TABLE, XML_SOURCE_FIELD_NAME, aSrcDimName);
680 0 : if (rExport.getDefaultVersion() > SvtSaveOptions::ODFVER_012)
681 : {
682 : // Export display names only for ODF 1.2 extended or later.
683 0 : const OUString* pLayoutName = pDim->GetLayoutName();
684 0 : if (pLayoutName)
685 0 : rExport.AddAttribute(XML_NAMESPACE_TABLE_EXT, XML_DISPLAY_NAME, *pLayoutName);
686 : }
687 :
688 0 : if (pDim->IsDataLayout())
689 0 : rExport.AddAttribute(XML_NAMESPACE_TABLE, XML_IS_DATA_LAYOUT_FIELD, XML_TRUE);
690 0 : rtl::OUString sValueStr;
691 : ScXMLConverter::GetStringFromOrientation( sValueStr,
692 0 : (sheet::DataPilotFieldOrientation) pDim->GetOrientation() );
693 0 : if( !sValueStr.isEmpty() )
694 0 : rExport.AddAttribute(XML_NAMESPACE_TABLE, XML_ORIENTATION, sValueStr );
695 0 : if (pDim->GetUsedHierarchy() != 1)
696 : {
697 0 : rtl::OUStringBuffer sBuffer;
698 0 : ::sax::Converter::convertNumber(sBuffer, pDim->GetUsedHierarchy());
699 0 : rExport.AddAttribute(XML_NAMESPACE_TABLE, XML_USED_HIERARCHY, sBuffer.makeStringAndClear());
700 : }
701 : ScXMLConverter::GetStringFromFunction( sValueStr,
702 0 : (sheet::GeneralFunction) pDim->GetFunction() );
703 0 : rExport.AddAttribute(XML_NAMESPACE_TABLE, XML_FUNCTION, sValueStr);
704 :
705 0 : SvXMLElementExport aElemDPF(rExport, XML_NAMESPACE_TABLE, XML_DATA_PILOT_FIELD, true, true);
706 0 : WriteFieldReference(pDim);
707 0 : WriteLevels(pDim);
708 0 : if( pDim->GetOrientation() != sheet::DataPilotFieldOrientation_DATA )
709 0 : WriteGroupDimElements(pDim, pDimData);
710 0 : }
711 :
712 0 : void ScXMLExportDataPilot::WriteDimensions(ScDPSaveData* pDPSave)
713 : {
714 0 : const boost::ptr_vector<ScDPSaveDimension> &rDimensions = pDPSave->GetDimensions();
715 0 : boost::ptr_vector<ScDPSaveDimension>::const_iterator iter;
716 0 : for (iter = rDimensions.begin(); iter != rDimensions.end(); ++iter)
717 0 : WriteDimension(const_cast<ScDPSaveDimension*>(&(*iter)), pDPSave->GetExistingDimensionData());
718 0 : }
719 :
720 0 : void ScXMLExportDataPilot::WriteGrandTotal(::xmloff::token::XMLTokenEnum eOrient, bool bVisible, const OUString* pGrandTotal)
721 : {
722 0 : rExport.AddAttribute(XML_NAMESPACE_TABLE, XML_DISPLAY, bVisible ? XML_TRUE : XML_FALSE);
723 0 : rExport.AddAttribute(XML_NAMESPACE_TABLE, XML_ORIENTATION, eOrient);
724 0 : if (pGrandTotal)
725 0 : rExport.AddAttribute(XML_NAMESPACE_TABLE_EXT, XML_DISPLAY_NAME, *pGrandTotal);
726 :
727 0 : SvXMLElementExport aElemGrandTotal(rExport, XML_NAMESPACE_TABLE_EXT, XML_DATA_PILOT_GRAND_TOTAL, true, true);
728 0 : }
729 :
730 2 : void ScXMLExportDataPilot::WriteDataPilots(const uno::Reference <sheet::XSpreadsheetDocument>& /* xSpreadDoc */)
731 : {
732 2 : pDoc = rExport.GetDocument();
733 2 : if (!pDoc)
734 : return;
735 :
736 2 : ScDPCollection* pDPs = pDoc->GetDPCollection();
737 2 : if (!pDPs)
738 : return;
739 :
740 2 : size_t nDPCount = pDPs->GetCount();
741 2 : if (!nDPCount)
742 : return;
743 :
744 0 : SvXMLElementExport aElemDPs(rExport, XML_NAMESPACE_TABLE, XML_DATA_PILOT_TABLES, true, true);
745 0 : rExport.CheckAttrList();
746 0 : for (size_t i = 0; i < nDPCount; ++i)
747 : {
748 0 : ScDPSaveData* pDPSave = (*pDPs)[i]->GetSaveData();
749 0 : if (!pDPSave)
750 0 : continue;
751 :
752 0 : ScRange aOutRange((*pDPs)[i]->GetOutRange());
753 0 : rtl::OUString sTargetRangeAddress;
754 0 : ScRangeStringConverter::GetStringFromRange( sTargetRangeAddress, aOutRange, pDoc, ::formula::FormulaGrammar::CONV_OOO );
755 0 : ScDocAttrIterator aAttrItr(pDoc, aOutRange.aStart.Tab(),
756 0 : aOutRange.aStart.Col(), aOutRange.aStart.Row(),
757 0 : aOutRange.aEnd.Col(), aOutRange.aEnd.Row());
758 : SCCOL nCol;
759 : SCROW nRow1, nRow2;
760 0 : rtl::OUString sOUButtonList;
761 0 : const ScPatternAttr* pAttr = aAttrItr.GetNext(nCol, nRow1, nRow2);
762 0 : while (pAttr)
763 : {
764 0 : ScMergeFlagAttr& rItem = (ScMergeFlagAttr&)pAttr->GetItem(ATTR_MERGE_FLAG);
765 0 : if (rItem.HasPivotButton())
766 : {
767 0 : for (SCROW nButtonRow = nRow1; nButtonRow <= nRow2; ++nButtonRow)
768 : {
769 0 : ScAddress aButtonAddr(nCol, nButtonRow, aOutRange.aStart.Tab());
770 : ScRangeStringConverter::GetStringFromAddress(
771 0 : sOUButtonList, aButtonAddr, pDoc, ::formula::FormulaGrammar::CONV_OOO, ' ', true );
772 : }
773 : }
774 0 : pAttr = aAttrItr.GetNext(nCol, nRow1, nRow2);
775 : }
776 0 : rtl::OUString sName((*pDPs)[i]->GetName());
777 0 : rtl::OUString sApplicationData((*pDPs)[i]->GetTag());
778 0 : bool bRowGrand = pDPSave->GetRowGrand();
779 0 : bool bColumnGrand = pDPSave->GetColumnGrand();
780 0 : rExport.AddAttribute(XML_NAMESPACE_TABLE, XML_NAME, sName);
781 0 : rExport.AddAttribute(XML_NAMESPACE_TABLE, XML_APPLICATION_DATA, sApplicationData);
782 0 : rExport.AddAttribute(XML_NAMESPACE_TABLE, XML_TARGET_RANGE_ADDRESS, sTargetRangeAddress);
783 0 : rExport.AddAttribute(XML_NAMESPACE_TABLE, XML_BUTTONS, sOUButtonList);
784 0 : if (!(bRowGrand && bColumnGrand))
785 : {
786 0 : if (bRowGrand)
787 0 : rExport.AddAttribute(XML_NAMESPACE_TABLE, XML_GRAND_TOTAL, XML_ROW);
788 0 : else if (bColumnGrand)
789 0 : rExport.AddAttribute(XML_NAMESPACE_TABLE, XML_GRAND_TOTAL, XML_COLUMN);
790 : else
791 0 : rExport.AddAttribute(XML_NAMESPACE_TABLE, XML_GRAND_TOTAL, XML_NONE);
792 : }
793 0 : if (pDPSave->GetIgnoreEmptyRows())
794 0 : rExport.AddAttribute(XML_NAMESPACE_TABLE, XML_IGNORE_EMPTY_ROWS, XML_TRUE);
795 0 : if (pDPSave->GetRepeatIfEmpty())
796 0 : rExport.AddAttribute(XML_NAMESPACE_TABLE, XML_IDENTIFY_CATEGORIES, XML_TRUE);
797 0 : if (!pDPSave->GetFilterButton())
798 0 : rExport.AddAttribute(XML_NAMESPACE_TABLE, XML_SHOW_FILTER_BUTTON, XML_FALSE);
799 0 : if (!pDPSave->GetDrillDown())
800 0 : rExport.AddAttribute(XML_NAMESPACE_TABLE, XML_DRILL_DOWN_ON_DOUBLE_CLICK, XML_FALSE);
801 0 : if ((*pDPs)[i]->GetHeaderLayout())
802 0 : rExport.AddAttribute(XML_NAMESPACE_TABLE, XML_HEADER_GRID_LAYOUT, XML_TRUE);
803 :
804 0 : SvXMLElementExport aElemDP(rExport, XML_NAMESPACE_TABLE, XML_DATA_PILOT_TABLE, true, true);
805 :
806 : // grand total elements.
807 :
808 0 : const OUString* pGrandTotalName = pDPSave->GetGrandTotalName();
809 0 : if (pGrandTotalName && rExport.getDefaultVersion() > SvtSaveOptions::ODFVER_012)
810 : {
811 : // Use the new data-pilot-grand-total element.
812 0 : if (bRowGrand && bColumnGrand)
813 : {
814 0 : WriteGrandTotal(XML_BOTH, true, pGrandTotalName);
815 : }
816 : else
817 : {
818 0 : WriteGrandTotal(XML_ROW, bRowGrand, pGrandTotalName);
819 0 : WriteGrandTotal(XML_COLUMN, bColumnGrand, pGrandTotalName);
820 : }
821 : }
822 :
823 0 : rExport.CheckAttrList();
824 0 : if ((*pDPs)[i]->IsSheetData())
825 : {
826 0 : const ScSheetSourceDesc* pSheetSource = (*pDPs)[i]->GetSheetDesc();
827 :
828 0 : if (rExport.getDefaultVersion() > SvtSaveOptions::ODFVER_012)
829 : {
830 0 : if (pSheetSource->HasRangeName())
831 : rExport.AddAttribute(
832 0 : XML_NAMESPACE_TABLE, XML_NAME, pSheetSource->GetRangeName());
833 : }
834 :
835 0 : OUString sCellRangeAddress;
836 : ScRangeStringConverter::GetStringFromRange(
837 0 : sCellRangeAddress, pSheetSource->GetSourceRange(), pDoc,
838 0 : ::formula::FormulaGrammar::CONV_OOO);
839 :
840 0 : rExport.AddAttribute(XML_NAMESPACE_TABLE, XML_CELL_RANGE_ADDRESS, sCellRangeAddress);
841 0 : SvXMLElementExport aElemSCR(rExport, XML_NAMESPACE_TABLE, XML_SOURCE_CELL_RANGE, true, true);
842 0 : rExport.CheckAttrList();
843 0 : WriteDPFilter(pSheetSource->GetQueryParam());
844 : }
845 0 : else if ((*pDPs)[i]->IsImportData())
846 : {
847 0 : const ScImportSourceDesc* pImpSource = (*pDPs)[i]->GetImportSourceDesc();
848 0 : switch (pImpSource->nType)
849 : {
850 0 : case sheet::DataImportMode_NONE : break;
851 : case sheet::DataImportMode_QUERY :
852 : {
853 0 : rExport.AddAttribute(XML_NAMESPACE_TABLE, XML_DATABASE_NAME, pImpSource->aDBName);
854 0 : rExport.AddAttribute(XML_NAMESPACE_TABLE, XML_QUERY_NAME, pImpSource->aObject);
855 0 : SvXMLElementExport aElemID(rExport, XML_NAMESPACE_TABLE, XML_DATABASE_SOURCE_QUERY, true, true);
856 0 : rExport.CheckAttrList();
857 : }
858 0 : break;
859 : case sheet::DataImportMode_TABLE :
860 : {
861 0 : rExport.AddAttribute(XML_NAMESPACE_TABLE, XML_DATABASE_NAME, pImpSource->aDBName);
862 0 : rExport.AddAttribute(XML_NAMESPACE_TABLE, XML_TABLE_NAME, pImpSource->aObject);
863 0 : SvXMLElementExport aElemID(rExport, XML_NAMESPACE_TABLE, XML_DATABASE_SOURCE_TABLE, true, true);
864 0 : rExport.CheckAttrList();
865 : }
866 0 : break;
867 : case sheet::DataImportMode_SQL :
868 : {
869 0 : rExport.AddAttribute(XML_NAMESPACE_TABLE, XML_DATABASE_NAME, pImpSource->aDBName);
870 0 : rExport.AddAttribute(XML_NAMESPACE_TABLE, XML_SQL_STATEMENT, pImpSource->aObject);
871 0 : if (!pImpSource->bNative)
872 0 : rExport.AddAttribute(XML_NAMESPACE_TABLE, XML_PARSE_SQL_STATEMENT, XML_TRUE);
873 0 : SvXMLElementExport aElemID(rExport, XML_NAMESPACE_TABLE, XML_DATABASE_SOURCE_SQL, true, true);
874 0 : rExport.CheckAttrList();
875 : }
876 0 : break;
877 : }
878 : }
879 0 : else if ((*pDPs)[i]->IsServiceData())
880 : {
881 0 : const ScDPServiceDesc* pServSource = (*pDPs)[i]->GetDPServiceDesc();
882 0 : rExport.AddAttribute(XML_NAMESPACE_TABLE, XML_NAME, pServSource->aServiceName);
883 0 : rExport.AddAttribute(XML_NAMESPACE_TABLE, XML_SOURCE_NAME, pServSource->aParSource);
884 0 : rExport.AddAttribute(XML_NAMESPACE_TABLE, XML_OBJECT_NAME, pServSource->aParName);
885 0 : rExport.AddAttribute(XML_NAMESPACE_TABLE, XML_USER_NAME, pServSource->aParUser);
886 : // #i111754# leave out password attribute as long as DataPilotSource doesn't specify the content
887 : // rExport.AddAttribute(XML_NAMESPACE_TABLE, XML_PASSWORD, rtl::OUString(pServSource->aParPass));
888 0 : SvXMLElementExport aElemSD(rExport, XML_NAMESPACE_TABLE, XML_SOURCE_SERVICE, true, true);
889 0 : rExport.CheckAttrList();
890 : }
891 0 : WriteDimensions(pDPSave);
892 0 : }
893 15 : }
894 :
895 : /* vim:set shiftwidth=4 softtabstop=4 expandtab: */
|