Apache POI: новая строка без переноса

Я хочу написать многострочный текст в одной ячейке, но без их переноса.

Ожидание:

Я начинаю с простого:

Row row = sheet.createRow(0);
Cell cell = row.createCell(0);
cell.setCellValue("First text line. \r\nNew line.");

Это не работает, но я обнаружил (1 , 2 , 3 , 4), что мне нужно setWrapText(true), чтобы показать новые строки и установить высоту строки:

Row row = sheet.createRow(0);
Cell cell = row.createCell(0);
cell.setCellValue("First text line. \r\nNew line.");
CellStyle cellStyle = workbook.createCellStyle();
cellStyle.setWrapText(true);
cell.setCellStyle(cellStyle);
row.setHeightInPoints(2 * sheet.getDefaultRowHeightInPoints());

Работает (видны новые строки, высота в две строки), но текст переносится.

Если я setWrapText(false), я возвращаюсь к тому, с чего начал (новые строки не видны):

Как показать новые строки, но не переносить текст?

Apache POI 5.2.4, Libre Office.

Если вы откроете Excel и щелкните правой кнопкой мыши пустую ячейку, а затем выберите format cell, вы увидите, что Wrap text под Alignment не выбрано. Если вы скопируете строку с новой строкой и повторите те же действия еще раз, вы увидите, что Wrap text был автоматически проверен. Для меня это означает, что новая линия не будет работать, если Wrap text не будет правдой.

SedJ601 14.03.2024 16:08

В MS Excel вы правы. Даже если я вставляю многострочный текст и снимаю флажок Wrap text, новые строки скрываются. Но в LibreOffice Calc это работает по-другому. Если я вставляю многострочный текст, он не переносится. Я могу Format Cells -> Wrap text устанавливать и снимать отметки, и новые строки сохраняются. Вы можете увидеть это на первом экране (я сделал это вручную в Libre). Вот почему я предположил, что это возможно в Apache POI. Возможно, библиотека делает именно то, что возможно в MS Excel.

mkczyk 14.03.2024 17:30

Хорошие наблюдения! Я не уверен, почему существует разница. Удачи!

SedJ601 14.03.2024 17:38
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
1
3
131
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Apache POI создает формат файла Office Open XML, и этот формат файла не может хранить то, что показывает ваш первый снимок экрана — одна ячейка с несколькими текстовыми строками, где текст, тем не менее, выходит за правую границу ячейки.

Libreoffice использует формат файлов Open Document, который может хранить то, что показывает ваш первый снимок экрана.

Создайте то, что показывает ваш первый снимок экрана, с помощью Libreoffice Calc. Затем сохраните это как *.xlsx (в Libreoffice это формат Excel 2007-365). Теперь закройте и снова откройте файл. Вы увидите переполнение: правая граница ячейки исчезла.

Теперь снова создайте то, что показано на вашем первом снимке экрана, с помощью Libreoffice Calc. Затем сохраните это как *.ods (формат ODF). Теперь закройте и снова откройте файл. Вы получите его в точности таким, каким получили спасение.

Итак, проблема заключается в формате файла Office Open XML *.xlsx и формате файла Open Document *.ods. А Apache POI предназначен только для создания формата файлов Office Open XML.

Примечание к последнему предложению: Apache POI может создавать *xlsx (XSSFWorkbook), но также может создавать *.xls (HSSFWorkbook). Но в целом вы, конечно, правы (он не может создать *.ods, поэтому невозможно то, что я хотел).

mkczyk 15.03.2024 16:13

Другие вопросы по теме