Как получить полный текст, который находится в ячейке таблицы файла DOCX в одну строку - PullRequest
0 голосов
/ 31 января 2011

Я пытаюсь получить данные таблицы файла docx в коде java, используя docx4j api .Здесь я пытаюсь получить данные каждой ячейки за раз. Как получить эти данные ... здесь я размещаю свой код, который имеет рекурсивные вызовы методов.

static void walkList1(List children) {
    i=children.size();
    int i=1;
    for (Object o : children) {
        if (o instanceof javax.xml.bind.JAXBElement) {
            if (((JAXBElement) o).getDeclaredType().getName()
                    .equals("org.docx4j.wml.Text")) {
                org.docx4j.wml.Text t = (org.docx4j.wml.Text) ((JAXBElement) o)
                .getValue();
                System.out.println(" 1 1    " + t.getValue());
            }
        }
        else if (o instanceof org.docx4j.wml.R) {
            org.docx4j.wml.R run = (org.docx4j.wml.R) o;
            walkList1(run.getRunContent());
        } else {
            System.out.println(" IGNORED " + o.getClass().getName());
        }
    }
}

1 Ответ

0 голосов
/ 31 января 2011

Эта часть выглядит подозрительно:

i=children.size();
int i=1;

Первое должно быть изменяемым статическим полем (потому что иначе ваш код не будет компилироваться), что обычно является плохой идеей. Второй является локальным для метода, но никогда не используется.

Если вы пытаетесь объединить весь контент в один String, я предлагаю вам создать StringBuilder и передать его рекурсивным вызовам, например ::

static String walkList(List children) {
    StringBuilder dst = new StringBuilder();
    walkList1(children, dst);
    return dst.toString();
}
static void walkList1(List children, StringBuilder dst) {
    for (Object o : children) {
        if (o instanceof javax.xml.bind.JAXBElement) {
            if (((JAXBElement) o).getDeclaredType().getName()
                    .equals("org.docx4j.wml.Text")) {
                org.docx4j.wml.Text t = (org.docx4j.wml.Text) ((JAXBElement) o)
                .getValue();
                dst.append(t);
            }
        }
        else if (o instanceof org.docx4j.wml.R) {
            org.docx4j.wml.R run = (org.docx4j.wml.R) o;
            walkList1(run.getRunContent(), dst);
        } else {
            System.out.println(" IGNORED " + o.getClass().getName());
        }
    }
}

Также List<T> и JAXBElement<T> являются общими типами. Есть ли причина использовать необработанные типы?

...