From 270fe90efbb275a670d063303e395ed88ea4731d Mon Sep 17 00:00:00 2001 From: Justin Luth Date: Thu, 22 Jan 2026 13:22:17 -0500 Subject: [PATCH] tdf#170438 docx export: never export listItem with empty displayText MS Word was reporting a document as corrupt after LO round-tripped it with an empty displayText. However, an empty w:value is not a 'corrupt' result. Note that this situation was possible also while importing DOCX. We don't always import SDTs as content controls (e.g. in tables). In that case, only the 'values' are considered, so an empty entry is created in the dropdown field, which then got exported as an empty displayText. make CppunitTest_sw_ooxmlexport25 \ CPPUNIT_TEST_NAME=testTdf170438_dropdown ooxmlexport13's tdf119809.docx is a VML shape that is called a combobox, and it exported with WritePostponedFormControl. It sounds like it can only have 'values' when added by a VBA macro, so likely these will almost never output a displayText. Change-Id: Ib306eda90b4179e10402c276e7c47a3bfdd83cfb Reviewed-on: https://gerrit.libreoffice.org/c/core/+/197867 Reviewed-by: Justin Luth Tested-by: Jenkins --- .../ooxmlexport/data/tdf170438_dropdown.odt | Bin 0 -> 10606 bytes sw/qa/extras/ooxmlexport/ooxmlexport25.cxx | 12 ++++++++++++ sw/source/filter/ww8/docxattributeoutput.cxx | 6 ++++-- 3 files changed, 16 insertions(+), 2 deletions(-) create mode 100644 sw/qa/extras/ooxmlexport/data/tdf170438_dropdown.odt 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 0000000000000000000000000000000000000000..02bbe360bf256380d8ebde110007c17b910e0eeb GIT binary patch literal 10606 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, 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); }