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