Java 无法使用Apache POI获取.docx文件的超链接标签
我的目标是计算docs.google.com类型的超链接在MS Word文档(.docx)中出现的次数 除了计算超链接外,我还试图计算包含“docs.google.com”的“纯文本” 例如,考虑一个具有以下文本的Word文档:Java 无法使用Apache POI获取.docx文件的超链接标签,java,apache-poi,openxml,docx,Java,Apache Poi,Openxml,Docx,我的目标是计算docs.google.com类型的超链接在MS Word文档(.docx)中出现的次数 除了计算超链接外,我还试图计算包含“docs.google.com”的“纯文本” 例如,考虑一个具有以下文本的Word文档: https://docs.google.com/1234 根据我想要的逻辑,链接的总数应该是1+2+1=4。 第二个是2,因为显示值是一个google文档链接,而目标URL是一个google文档链接 我很难在下面的Java代码中获取“纯文本”类型链接的显示值: i
https://docs.google.com/1234
根据我想要的逻辑,链接的总数应该是1+2+1=4。 第二个是2,因为显示值是一个google文档链接,而目标URL是一个google文档链接 我很难在下面的Java代码中获取“纯文本”类型链接的显示值:
int[] getNumGDocLinksFromWord(String filepath) {
int [] numLinks = {0, 0};
File file = new File(filepath);
try (FileInputStream fis = new FileInputStream(file.getAbsolutePath())) {
XWPFDocument document = new XWPFDocument(fis);
List<XWPFParagraph> paragraphs = document.getParagraphs();
for (XWPFParagraph para : paragraphs) {
numLinks[0] += numOccurrences(para.getText(), GOOG_DOC_URL_HOST);
for(XWPFRun run : para.getRuns()) {
if(run instanceof XWPFHyperlinkRun) {
XWPFHyperlink link = ((XWPFHyperlinkRun)run).getHyperlink(document);
if(link != null && link.getURL().contains(GOOG_DOC_URL_HOST)) {
numLinks[1]++;
}
}
}
}
} catch (Exception e) {
e.printStackTrace();
}
return numLinks;
}
private int numOccurrences(String text, String sequence) {
int n = 0, i = 0;
while (i != -1) {
i = text.indexOf(sequence, i + 1);
if (i != -1) {
n++;
}
}
return n;
}
int[]getNumGDocLinksFromWord(字符串文件路径){
int[]numLinks={0,0};
文件文件=新文件(文件路径);
try(FileInputStream fis=newfileinputstream(file.getAbsolutePath())){
XWPF文件=新的XWPF文件(fis);
列表段落=document.getPages();
对于(XWPF段落:段落){
numLinks[0]+=numOccurrences(para.getText(),GOOG_DOC_URL_HOST);
对于(XWPFRun:para.getRuns()){
if(运行XWPFHyperlinkRun的实例){
XWPFHyperlink=((XWPFHyperlinkRun)run).getHyperlink(文档);
if(link!=null&&link.getURL().contains(GOOG\u DOC\u URL\u HOST)){
numLinks[1]++;
}
}
}
}
}捕获(例外e){
e、 printStackTrace();
}
返回numLinks;
}
私有整数货币(字符串文本、字符串序列){
int n=0,i=0;
而(i!=-1){
i=text.indexOf(序列,i+1);
如果(i!=-1){
n++;
}
}
返回n;
}
numLinks[0]捕获显示值出现次数,numLinks捕获超链接的目标值出现次数
有人能告诉我如何准确地计算这两种类型的值吗?您到底有什么问题?具有
静态字符串GOOG\u DOC\u URL\u HOST=“docs.google.com”
和您描述的word文档,您的代码为我生成了numLinks[0]
和numLinks[1]
这两个2
,这是正确的。否?@AxelRichter,请对此文档尝试相同的操作:。numLinks应该是[3,3],但它现在是[2,3]。我添加了一些打印语句,它似乎没有拾取显示值“”。在/word/document.xml
中有:。。。。。。http://docs.google.com/doc...3
。正如您看到的文本http://docs.google.com/doc
是在外部超链接中的超链接中运行的文本。文本3
是在外部超链接中运行的文本。到目前为止,apachepoi
没有考虑到这一点。但根据Ecma-376中的XML定义,CT\u超链接
可能包含其他CT\u超链接
。所以这是ApachePOI中的一个bug。