Хобрук: Ваш путь к мастерству в программировании

Таблица слов Apache Poi, информация об альтернативном тексте

Как получить альтернативный текст из таблицы в Word, например. Название или описание. Вся информация, которую я нашел, имела контекст, текст, ширину, стиль и т. д. для чтения или изменения.

Моя цель — определить определенные таблицы в шаблоне, чтобы я мог их изменить.


Ответы:


1

Здесь я сделаю некоторые предположения. Во-первых, вы говорите о формате docx, а во-вторых, под «Alt Text» вы подразумеваете заголовок.

Подпись — это просто абзац, который либо предшествует таблице, либо следует за ней. Он будет иметь стиль Caption, прогон с некоторым текстом, например Таблица, и, возможно, будет включать простое поле SEQ Table. Это будет заголовок таблицы по умолчанию, но это может быть просто прогон с названием, например Руководители отделов. Ключ — это имя стиля. Word использует стандартные имена стилей для вычисления других вещей, таких как TOC.

Примечание. В Word нельзя изменить заголовок, выбрав таблицу и щелкнув пункт меню. На самом деле это не связано каким-либо значимым образом. Вы должны изменить абзац.

Итак, чтобы найти заголовок, вам нужно просмотреть список элементов документа XWPFDocument.getBodyElements() и найти каждый абзац со стилем Caption. Как только вы нашли тот, который вам нужен, вы можете посмотреть на элемент непосредственно выше или ниже, чтобы найти таблицу. Ваш поиск будет проще, если вы будете знать, что все подписи находятся выше или все ниже таблиц.

Итак, чтобы получить таблицу после определенного именованного заголовка, я бы попробовал что-то вроде этого:

public XWPFTable FindTable(String name) {
    boolean foundTable = false;
    XWPFParagraph p;
    for (IBodyElement elem : doc.getBodyElements()) {
        switch (elem.getElementType()) {
        case PARAGRAPH:
            foundTable = false;
            p = (XWPFParagraph) elem;
            if (p.getStyle() == "Caption" && p.getText() == name) {
                foundTable = true;
            }
            break;
        case TABLE:
            if (foundTable) {
                return (XWPFTable) elem;
            }
            break;
        case CONTENTCONTROL:
            foundTable = false;
            break;
        default:
            foundTable = false;
            break;
        }
    }

    return null;
}
03.05.2017
  • Большое спасибо, за исчерпывающий ответ. Под замещающим текстом я имею в виду запись свойств таблицы в слове. Если вы щелкнете правой кнопкой мыши по таблице и выберете свойства таблицы, а в диалоге последняя вкладка, это означает замещающий текст. Это было, я имел в виду. Но ваше решение возможно и для меня. Спасибо. 03.05.2017
  • Хорошо, я вижу проблему. POI использует спецификацию 2006 года. Alt Text является частью элемента tblCaption элемента table properties (tblPr). Этого нет в спецификации 2006 года и, следовательно, нет в используемой нами схеме ooxml. Если вам нужен Alt Text, вы все равно сможете получить его, самостоятельно перемещаясь по XML, но POI не поможет вам сделать это напрямую. Если вы можете использовать заголовок таблицы, это будет вашим лучшим выбором. В противном случае вам нужно будет создать метод для получения значения узла tblCaption в XML. 03.05.2017
  • Большое Вам спасибо. Ваша информация очень полезна. 04.05.2017
  • Если ответ полезен, либо проголосуйте, либо отметьте его как ответ. 04.05.2017

  • 2

    В Word вы можете установить уникальный заголовок таблицы, а затем получить таблицу в формате xml:

    String tableXML = mytable.getCTTbl();
    

    Чтобы извлечь заголовок таблицы:

    String[] xml = tableXML.split(System.lineSeparator());
    String caption = null;
    for (String x : xml)
    {
        if (x.contains("w:tblCaption"))
        {
            caption = x.split("w:val=")[1].replace("/>", "");
            caption = caption.replace("\"", "");
        }
    }
    
    03.01.2018
    Новые материалы

    ВЫ РЕГРЕСС ЭТО?
    Чтобы понять, когда использовать регрессионный анализ, мы должны сначала понять, что именно он делает. Вот простой ответ, который появляется, когда вы используете Google: Регрессионный..

    Не зря же это называют интеллектом
    Стек — C#, Oracle Опыт — 4 года Работа — Разведывательный корпус Мне пора служить Может быть, я немного приукрашиваю себя, но там, где я живу, есть обязательная военная служба на 3..

    LeetCode Проблема 41. Первый пропущенный положительный результат
    LeetCode Проблема 41. Первый пропущенный положительный результат Учитывая несортированный массив целых чисел, найдите наименьшее пропущенное положительное целое число. Пример 1: Input:..

    Расистский и сексистский робот, обученный в Интернете
    Его ИИ основан на предвзятых данных, которые создают предрассудки. Он словно переходит из одного эпизода в другой из серии Черное зеркало , а вместо этого представляет собой хронику..

    Управление состоянием в микрофронтендах
    Стратегии бесперебойного сотрудничества Микро-фронтенды — это быстро растущая тенденция в сфере фронтенда, гарантирующая, что удовольствие не ограничивается исключительно бэкэнд-системами..

    Декларативное и функциональное программирование в стиле LINQ с использованием JavaScript с использованием каррирования и генератора ...
    LINQ - одна из лучших функций C #, которая обеспечивает элегантный способ написания кода декларативного и функционального стиля, который легко читать и понимать. Благодаря таким функциям ES6,..

    Структуры данных в C ++ - Часть 1
    Реализация общих структур данных в C ++ C ++ - это расширение языка программирования C, которое поддерживает создание классов, поэтому оно известно как C с классами . Он используется для..