diff --git a/sw/qa/extras/ooxmlexport/data/tdf170438_dropdown.odt b/sw/qa/extras/ooxmlexport/data/tdf170438_dropdown.odt new file mode 100644 index 000000000000..02bbe360bf25 Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/tdf170438_dropdown.odt differ diff --git a/sw/qa/extras/ooxmlexport/ooxmlexport25.cxx b/sw/qa/extras/ooxmlexport/ooxmlexport25.cxx index 2ea0d1a6a50f..110211a7c2c9 100644 --- a/sw/qa/extras/ooxmlexport/ooxmlexport25.cxx +++ b/sw/qa/extras/ooxmlexport/ooxmlexport25.cxx @@ -150,6 +150,18 @@ DECLARE_OOXMLEXPORT_TEST(testTdf165478_bottomAligned, "tdf165478_bottomAligned.d CPPUNIT_ASSERT_EQUAL(sal_Int32(1887), nFlyTop); } +CPPUNIT_TEST_FIXTURE(Test, testTdf170438_dropdown) +{ + createSwDoc("tdf170438_dropdown.odt"); + + saveAndReload(TestFilter::DOCX); + + xmlDocUniquePtr pXmlDoc = parseExport(u"word/document.xml"_ustr); + // MS Word reports document as corrupt if displayText is empty + assertXPath(pXmlDoc, "//w:listItem[1]", "displayText", u" "); + assertXPath(pXmlDoc, "//w:listItem[1]", "value", u""); // value may be empty +} + CPPUNIT_TEST_FIXTURE(Test, testTdf170389_manyTabstops) { createSwDoc("tdf170389_manyTabstops.odt"); diff --git a/sw/source/filter/ww8/docxattributeoutput.cxx b/sw/source/filter/ww8/docxattributeoutput.cxx index ddcc2c629a2b..e1a2e450ee14 100644 --- a/sw/source/filter/ww8/docxattributeoutput.cxx +++ b/sw/source/filter/ww8/docxattributeoutput.cxx @@ -2882,9 +2882,10 @@ void DocxAttributeOutput::WriteSdtDropDownStart( for (auto const& rItem : rListItems) { auto const item(OUStringToOString(rItem, RTL_TEXTENCODING_UTF8)); + OString sDisplayText = item.isEmpty() ? " "_ostr : item; // displayText must not be empty m_pSerializer->singleElementNS(XML_w, XML_listItem, FSNS(XML_w, XML_value), item, - FSNS(XML_w, XML_displayText), item); + FSNS(XML_w, XML_displayText), sDisplayText); } m_pSerializer->endElementNS(XML_w, XML_dropDownList); @@ -5894,8 +5895,9 @@ void DocxAttributeOutput::WritePostponedFormControl(const SdrObject* pObject) for (const auto& rItem : aItems) { + OUString sDisplayText = rItem.isEmpty() ? " " : rItem; // displayText must not be empty m_pSerializer->singleElementNS(XML_w, XML_listItem, - FSNS(XML_w, XML_displayText), rItem, + FSNS(XML_w, XML_displayText), sDisplayText, FSNS(XML_w, XML_value), rItem); }