29 #include <unonames.hxx>
31 #include <document.hxx>
42 #include <com/sun/star/beans/XPropertySet.hpp>
43 #include <com/sun/star/frame/XModel.hpp>
44 #include <com/sun/star/sheet/DataImportMode.hpp>
45 #include <com/sun/star/sheet/XDatabaseRanges.hpp>
46 #include <com/sun/star/sheet/XDatabaseRange.hpp>
48 #include <osl/diagnose.h>
53 #define SC_USERLIST "UserList"
61 size_t nSortCount = 0;
96 for (
size_t i = 0;
i < nSortCount; ++
i)
136 uno::Reference <beans::XPropertySet> xPropertySet (
rExport.
GetModel(), uno::UNO_QUERY);
137 if (xPropertySet.is())
139 uno::Reference <sheet::XDatabaseRanges> xDatabaseRanges(xPropertySet->getPropertyValue(
SC_UNO_DATABASERNG), uno::UNO_QUERY);
141 if (xDatabaseRanges.is())
143 const uno::Sequence <OUString> aRanges(xDatabaseRanges->getElementNames());
144 for (
const OUString& sDatabaseRangeName : aRanges)
146 uno::Reference <sheet::XDatabaseRange> xDatabaseRange(xDatabaseRanges->getByName(sDatabaseRangeName), uno::UNO_QUERY);
147 if (xDatabaseRange.is())
149 uno::Reference <beans::XPropertySet> xDatabaseRangePropertySet (xDatabaseRange, uno::UNO_QUERY);
150 if (xDatabaseRangePropertySet.is() &&
153 const uno::Sequence <beans::PropertyValue> aImportProperties(xDatabaseRange->getImportDescriptor());
154 sheet::DataImportMode nSourceType = sheet::DataImportMode_NONE;
155 for (
const auto& rProp : aImportProperties)
157 rProp.Value >>= nSourceType;
158 if (nSourceType != sheet::DataImportMode_NONE)
160 table::CellRangeAddress aArea = xDatabaseRange->getDataArea();
178 class WriteDatabaseRange
187 mrExport(rExport), mpDoc(pDoc), mnCounter(0), meRangeType(
ScDBCollection::GlobalNamed) {}
194 void operator() (const ::std::pair<SCTAB, const ScDBData*>& r)
201 OUString::number(static_cast<sal_Int32>(r.first));
203 write(aBuf, *r.second);
206 void operator() (
const ScDBData& rData)
213 aBuf.append(++mnCounter);
215 write(aBuf.makeStringAndClear(), rData);
221 void operator() (std::unique_ptr<ScDBData>
const& p)
223 return operator()(*p);
227 void write(
const OUString& rName,
const ScDBData& rData)
229 mrExport.
AddAttribute(XML_NAMESPACE_TABLE, XML_NAME, rName);
237 mrExport.
AddAttribute(XML_NAMESPACE_TABLE, XML_TARGET_RANGE_ADDRESS, aRangeStr);
241 mrExport.
AddAttribute(XML_NAMESPACE_TABLE, XML_IS_SELECTION, XML_TRUE);
243 mrExport.
AddAttribute(XML_NAMESPACE_TABLE, XML_DISPLAY_FILTER_BUTTONS, XML_TRUE);
245 mrExport.
AddAttribute(XML_NAMESPACE_TABLE, XML_ON_UPDATE_KEEP_STYLES, XML_TRUE);
247 mrExport.
AddAttribute(XML_NAMESPACE_TABLE, XML_ON_UPDATE_KEEP_SIZE, XML_FALSE);
249 mrExport.
AddAttribute(XML_NAMESPACE_TABLE, XML_HAS_PERSISTENT_DATA, XML_FALSE);
254 mrExport.
AddAttribute(XML_NAMESPACE_TABLE, XML_CONTAINS_HEADER, XML_FALSE);
259 mrExport.
AddAttribute(XML_NAMESPACE_TABLE, XML_ORIENTATION, XML_COLUMN);
266 static_cast<double>(nRefresh) / 86400.0);
267 mrExport.
AddAttribute(XML_NAMESPACE_TABLE, XML_REFRESH_DELAY, aBuf.makeStringAndClear());
270 SvXMLElementExport aElemDR(mrExport, XML_NAMESPACE_TABLE, XML_DATABASE_RANGE,
true,
true);
277 writeSort(mrExport, aParam, aRange, mpDoc);
278 writeSubtotals(rData);
281 void writeImport(
const ScDBData& rData)
286 OUString sDatabaseName;
293 sDatabaseName = aParam.
aDBName;
300 sheet::DataImportMode nSourceType = sheet::DataImportMode_NONE;
304 nSourceType = sheet::DataImportMode_SQL;
306 nSourceType = sheet::DataImportMode_QUERY;
308 nSourceType = sheet::DataImportMode_TABLE;
313 case sheet::DataImportMode_NONE :
break;
314 case sheet::DataImportMode_QUERY :
316 if (!sDatabaseName.isEmpty())
317 mrExport.
AddAttribute(XML_NAMESPACE_TABLE, XML_DATABASE_NAME, sDatabaseName);
319 SvXMLElementExport aElemID(mrExport, XML_NAMESPACE_TABLE, XML_DATABASE_SOURCE_QUERY,
true,
true);
320 if (!sConRes.isEmpty())
322 mrExport.
AddAttribute( XML_NAMESPACE_XLINK, XML_HREF, sConRes );
323 SvXMLElementExport aElemCR(mrExport, XML_NAMESPACE_FORM, XML_CONNECTION_RESOURCE,
true,
true);
327 case sheet::DataImportMode_TABLE :
329 if (!sDatabaseName.isEmpty())
330 mrExport.
AddAttribute(XML_NAMESPACE_TABLE, XML_DATABASE_NAME, sDatabaseName);
332 SvXMLElementExport aElemID(mrExport, XML_NAMESPACE_TABLE, XML_DATABASE_SOURCE_TABLE,
true,
true);
333 if (!sConRes.isEmpty())
335 mrExport.
AddAttribute( XML_NAMESPACE_XLINK, XML_HREF, sConRes );
336 SvXMLElementExport aElemCR(mrExport, XML_NAMESPACE_FORM, XML_CONNECTION_RESOURCE,
true,
true);
340 case sheet::DataImportMode_SQL :
342 if (!sDatabaseName.isEmpty())
343 mrExport.
AddAttribute(XML_NAMESPACE_TABLE, XML_DATABASE_NAME, sDatabaseName);
346 mrExport.
AddAttribute(XML_NAMESPACE_TABLE, XML_PARSE_SQL_STATEMENT, XML_TRUE);
347 SvXMLElementExport aElemID(mrExport, XML_NAMESPACE_TABLE, XML_DATABASE_SOURCE_SQL,
true,
true);
348 if (!sConRes.isEmpty())
350 mrExport.
AddAttribute( XML_NAMESPACE_XLINK, XML_HREF, sConRes );
351 SvXMLElementExport aElemCR(mrExport, XML_NAMESPACE_FORM, XML_CONNECTION_RESOURCE,
true,
true);
421 explicit WriteSetItem(
ScXMLExport& r) : mrExport(r) {}
425 SvXMLElementExport aElem(mrExport, XML_NAMESPACE_TABLE, XML_FILTER_SET_ITEM,
true,
true);
435 OSL_FAIL(
"Query entry has no items at all! It must have at least one!");
439 mrExport.
AddAttribute(XML_NAMESPACE_TABLE, XML_FIELD_NUMBER, OUString::number(rEntry.
nField - nFieldStart));
441 mrExport.
AddAttribute(XML_NAMESPACE_TABLE, XML_CASE_SENSITIVE, XML_TRUE);
443 if (rItems.size() == 1)
451 mrExport.
AddAttribute(XML_NAMESPACE_TABLE, XML_DATA_TYPE, XML_NUMBER);
454 mrExport.
AddAttribute(XML_NAMESPACE_TABLE, XML_VALUE, aBuf.makeStringAndClear());
457 mrExport.
AddAttribute(XML_NAMESPACE_TABLE, XML_OPERATOR, getOperatorXML(rEntry, eSearchType));
458 SvXMLElementExport aElemC(mrExport, XML_NAMESPACE_TABLE, XML_FILTER_CONDITION,
true,
true);
463 assert( rItems.size() > 1 &&
"rItems should have more than 1 element");
467 mrExport.
AddAttribute(XML_NAMESPACE_TABLE, XML_VALUE, rItem.maString.getString());
468 mrExport.
AddAttribute(XML_NAMESPACE_TABLE, XML_OPERATOR, OUString(
"="));
469 SvXMLElementExport aElemC(mrExport, XML_NAMESPACE_TABLE, XML_FILTER_CONDITION,
true,
true);
471 std::for_each(rItems.begin(), rItems.end(), WriteSetItem(mrExport));
475 void writeFilter(
const ScDBData& rData)
495 mrExport.
AddAttribute(XML_NAMESPACE_TABLE, XML_TARGET_RANGE_ADDRESS, aAddrStr);
504 if (!aAddrStr.isEmpty())
505 mrExport.
AddAttribute(XML_NAMESPACE_TABLE, XML_CONDITION_SOURCE_RANGE_ADDRESS, aAddrStr);
509 mrExport.
AddAttribute(XML_NAMESPACE_TABLE, XML_DISPLAY_DUPLICATES, XML_FALSE);
516 for (
size_t i = 0;
i < nCount; ++
i)
533 for (
size_t i = 0;
i < nCount; ++
i)
536 else if (bAnd && !bOr)
538 SvXMLElementExport aElemAnd(mrExport, XML_NAMESPACE_TABLE, XML_FILTER_AND,
true,
true);
539 for (
size_t i = 0;
i < nCount; ++
i)
542 else if (nCount == 1)
551 bool bOpenAndElement =
false;
557 bOpenAndElement =
true;
560 bOpenAndElement =
false;
562 for (
size_t i = 1;
i < nCount; ++
i)
571 bOpenAndElement =
true;
578 bOpenAndElement =
false;
588 bOpenAndElement =
false;
607 void writeSubtotals(
const ScDBData& rData)
623 mrExport.
AddAttribute(XML_NAMESPACE_TABLE, XML_BIND_STYLES_TO_CONTENT, XML_FALSE);
626 mrExport.
AddAttribute(XML_NAMESPACE_TABLE, XML_PAGE_BREAKS_ON_GROUP_CHANGE, XML_TRUE);
629 mrExport.
AddAttribute(XML_NAMESPACE_TABLE, XML_CASE_SENSITIVE, XML_TRUE);
631 SvXMLElementExport aElemSTRs(mrExport, XML_NAMESPACE_TABLE, XML_SUBTOTAL_RULES,
true,
true);
636 mrExport.
AddAttribute(XML_NAMESPACE_TABLE, XML_ORDER, XML_DESCENDING);
641 mrExport.
AddAttribute(XML_NAMESPACE_TABLE, XML_DATA_TYPE, aBuf);
643 SvXMLElementExport aElemSGs(mrExport, XML_NAMESPACE_TABLE, XML_SORT_GROUPS,
true,
true);
652 sal_Int32 nFieldCol =
static_cast<sal_Int32
>(aParam.
nField[
i]);
653 mrExport.
AddAttribute(XML_NAMESPACE_TABLE, XML_GROUP_BY_FIELD_NUMBER, OUString::number(nFieldCol));
654 SvXMLElementExport aElemSTR(mrExport, XML_NAMESPACE_TABLE, XML_SUBTOTAL_RULE,
true,
true);
658 sal_Int32 nCol =
static_cast<sal_Int32
>(aParam.
pSubTotals[
i][j]);
661 mrExport.
AddAttribute(XML_NAMESPACE_TABLE, XML_FIELD_NUMBER, OUString::number(nCol));
664 mrExport.
AddAttribute(XML_NAMESPACE_TABLE, XML_FUNCTION, aFuncStr);
666 SvXMLElementExport aElemSTF(mrExport, XML_NAMESPACE_TABLE, XML_SUBTOTAL_FIELD,
true,
true);
682 std::map<SCTAB, const ScDBData*> aSheetDBs;
683 for (
SCTAB i = 0;
i < nTabCount; ++
i)
687 aSheetDBs.emplace(
i, p);
690 bool bHasRanges = !aSheetDBs.empty();
713 ::std::for_each(rNamedDBs.
begin(), rNamedDBs.
end(), func);
718 ::std::for_each(rAnonDBs.
begin(), rAnonDBs.
end(), func);
723 ::std::for_each(aSheetDBs.begin(), aSheetDBs.end(), func);
::std::vector< ScSortKeyState > maKeyState
bool bGroupActive[MAXSUBTOTAL]
active groups
#define SC_UNONAME_SRCTYPE
bool HasAutoFilter() const
SC_DLLPUBLIC ScDBCollection * GetDBCollection() const
OUString getString() const
SCCOL nField[MAXSUBTOTAL]
associated field
bool bUserDef
sort user defined
SC_DLLPUBLIC ScDBData * GetAnonymousDBData(SCTAB nTab)
void setDataSource(const OUString &_sDataSourceNameOrLocation)
css::lang::Locale aCollatorLocale
static void GetStringFromRange(OUString &rString, const ScRange &rRange, const ScDocument *pDocument, formula::FormulaGrammar::AddressConvention eConv, sal_Unicode cSeparator= ' ', bool bAppendStr=false, ScRefFlags nFormatFlags=ScRefFlags::VALID|ScRefFlags::TAB_3D)
SC_DLLPUBLIC void GetSortParam(ScSortParam &rSortParam) const
#define STR_DB_LOCAL_NONAME
QueryItemsType & GetQueryItems()
ScMySharedData * GetSharedData()
#define SC_USERLIST
not found in unonames.hxx
XML_BIND_STYLES_TO_CONTENT
bool IsQueryByEmpty() const
bool bPagebreak
page break at change of group
static void GetStringFromAddress(OUString &rString, const ScAddress &rAddress, const ScDocument *pDocument, formula::FormulaGrammar::AddressConvention eConv, sal_Unicode cSeparator= ' ', bool bAppendStr=false, ScRefFlags nFormatFlags=ScRefFlags::VALID|ScRefFlags::TAB_3D)
Range to String core.
static void convertDouble(OUStringBuffer &rBuffer, double fNumber, bool bWriteUnits, sal_Int16 nSourceUnit, sal_Int16 nTargetUnit)
const css::uno::Reference< css::frame::XModel > & GetModel() const
sal_uInt16 nUserIndex
index into list
const BorderLinePrimitive2D *pCandidateB assert(pCandidateA)
sal_Int32 SCCOLROW
a type capable of holding either SCCOL or SCROW
SC_DLLPUBLIC SCTAB GetTableCount() const
void AddLanguageTagAttributes(sal_uInt16 nPrefix, sal_uInt16 nPrefixRfc, const css::lang::Locale &rLocale, bool bWriteEmpty)
SC_DLLPUBLIC SCSIZE GetEntryCount() const
void AddAttribute(sal_uInt16 nPrefix, const char *pName, const OUString &rValue)
void StartElement(sal_uInt16 nPrefix, enum::xmloff::token::XMLTokenEnum eName, bool bIgnWSOutside)
SC_DLLPUBLIC const ScQueryEntry & GetEntry(SCSIZE n) const
void writeSort(ScXMLExport &mrExport, const ScSortParam &aParam, const ScRange &aRange, const ScDocument *mpDoc)
SCCOL * pSubTotals[MAXSUBTOTAL]
array of columns to be calculated
Stores global anonymous database ranges.
ScXMLExportDatabaseRanges(ScXMLExport &rExport)
ScSubTotalFunc * pFunctions[MAXSUBTOTAL]
array of associated functions
SCCOL nSubTotals[MAXSUBTOTAL]
number of SubTotals
bool IsQueryByNonEmpty() const
const OUString & GetName() const
void GetImportParam(ScImportParam &rImportParam) const
static void convertDuration(OUStringBuffer &rBuffer, const double fTime)
OUString GetQNameByKey(sal_uInt16 nKey, const OUString &rLocalName, bool bCache=true) const
void GetArea(SCTAB &rTab, SCCOL &rCol1, SCROW &rRow1, SCCOL &rCol2, SCROW &rRow2) const
svl::SharedString maString
const SvXMLNamespaceMap & GetNamespaceMap() const
void GetSubTotalParam(ScSubTotalParam &rSubTotalParam) const
void WriteDatabaseRanges()
void AddNewEmptyDatabaseRange(const css::table::CellRangeAddress &aCellRangeAddress)
Stores global named database ranges.
ScDocument * GetDocument()
constexpr sal_uInt16 XML_NAMESPACE_TABLE
void EndElement(sal_uInt16 nPrefix, enum::xmloff::token::XMLTokenEnum eName, bool bIgnWSInside)
bool has(DataAccessDescriptorProperty _eWhich) const
const OUString & GetXMLToken(enum XMLTokenEnum eToken)
void SetLastRow(const sal_Int32 nTable, const sal_Int32 nRow)
#define STR_DB_GLOBAL_NONAME
sal_uInt16 GetSortKeyCount() const
void SetLastColumn(const sal_Int32 nTable, const sal_Int32 nCol)
bool bIncludePattern
sort formats
ScMyEmptyDatabaseRangesContainer GetEmptyDatabaseRanges()
~ScXMLExportDatabaseRanges()
SC_DLLPUBLIC void GetQueryParam(ScQueryParam &rQueryParam) const
bool HasImportSelection() const
OUString aCollatorAlgorithm
#define SC_UNO_DATABASERNG
std::vector< Item > QueryItemsType
static void GetStringFromFunction(OUString &rString, const sal_Int16 eFunction)
SC_DLLPUBLIC bool GetAdvancedQuerySource(ScRange &rSource) const
css::uno::Any const SvXMLExport & rExport
sal_uLong GetRefreshDelay() const
bool bAscending
sort ascending
Each instance of this struct represents a single filtering criteria.
utl::SearchParam::SearchType eSearchType
#define SC_UNONAME_STRIPDAT