如何将 docx 文件表格单元格中的完整文本获取为单个字符串

发布于 2024-10-15 15:51:58 字数 915 浏览 5 评论 0原文

我正在尝试使用 docx4j api 获取 java 代码中的 docx 文件表数据。 在这里,我试图一次获取每个单元格数据。如何获取该数据。这里我放置具有递归方法调用的代码。

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());
        }
    }
}

I am trying to get the docx file table data in java code using docx4j api.
Here i am trying to get the each cell data at a time .how to get that data..here i am placing my code which have recursive method calls.

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());
        }
    }
}

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

蛮可爱 2024-10-22 15:51:58

这部分看起来很可疑:

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());
        }
    }
}

Also List;JAXBElement 是泛型类型。有什么理由使用原始类型吗?

This part looks suspicious:

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

The first must be a mutable static field (because otherwise your code will not compile) which is usually a bad idea. The second is local to the method but is never used.

If you are trying to combine all content into a single String I suggest you create a StringBuilder and pass that to your recursive calls, e.g.:

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());
        }
    }
}

Also List<T> and JAXBElement<T> are generic types. Is there any reason to use the raw types?

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文