Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/vba/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Perl 是否将Word文档或docx文件转换为文本文件?_Perl_Vba_Text Files_Docx_Doc - Fatal编程技术网

Perl 是否将Word文档或docx文件转换为文本文件?

Perl 是否将Word文档或docx文件转换为文本文件?,perl,vba,text-files,docx,doc,Perl,Vba,Text Files,Docx,Doc,我需要一种方法将.doc或.docx扩展转换为.txt,而无需安装任何东西。我也不想手动打开Word来做这件事。只要它是自动运行的 我认为Perl或VBA都可以做到这一点,但我在网上找不到这两者的任何东西 有什么建议吗?.doc使用并可以解析其XML以检索文档的实际文本。您必须阅读它们的规范,以确定哪些标记包含可读文本。如果您不想启动Word(或其他Office应用程序),则无法在VBA中执行此操作。即使你是指VB,你仍然需要启动一个Word的(隐藏)实例来进行处理。我强烈建议你是否可以使用Ja

我需要一种方法将
.doc
.docx
扩展转换为
.txt
,而无需安装任何东西。我也不想手动打开Word来做这件事。只要它是自动运行的

我认为Perl或VBA都可以做到这一点,但我在网上找不到这两者的任何东西


有什么建议吗?

.doc使用并可以解析其XML以检索文档的实际文本。您必须阅读它们的规范,以确定哪些标记包含可读文本。

如果您不想启动Word(或其他Office应用程序),则无法在VBA中执行此操作。即使你是指VB,你仍然需要启动一个Word的(隐藏)实例来进行处理。

我强烈建议你是否可以使用Java或.NET。它可以在不安装Word的情况下在所有主要文本文件类型之间进行转换。

请注意,对象浏览器是Microsoft Office应用程序的一个极好的信息源。您可以通过
工具
→ <代码>宏→ <代码>Visual Basic编辑器。进入编辑器后,按F2键浏览Microsoft Office应用程序提供的接口、方法和属性

下面是一个示例,使用:


docx的一个简单的纯Perl解决方案:

  • 用于从
    docx
    文件中获取
    word/document.xml
    文件。(docx只是一个压缩的归档文件。)

  • 用于解析它

  • 然后使用将其转换为文本或html格式。搜索web以找到一个好的文件:)

  • 干杯


    J.

    如果您安装了某种风格的unix,您可以使用“strings”实用程序从文档中查找并提取所有可读字符串。在你要查找的文本前后会有一些混乱,但是结果是可读的

    我需要一种无需安装任何东西即可将.doc或.docx扩展名转换为.txt的方法

    只是开玩笑


    您可以对旧版本的Word文档使用antiword,并尝试解析新文档的xml。

    注意,您还可以在Windows和*nix平台上使用antiword执行其他文档、绘图、spreadhseet等转换

    您可以通过多种存在UNO绑定的语言(包括通过模块从Perl)以编程方式访问OpenOffice(类似于Windows上的COM)


    在上,您还可以找到一个打开文档的示例Perl scriptlet,然后您只需使用
    document.storetour()
    方法将其导出到
    txt
    ,看看哪种方法可以轻松地适应您的Perl需要。

    对于.doc,我在linux命令行工具方面取得了一些成功。它可以非常快速地从.doc中提取文本,提供了良好的缩进效果。然后,您可以通过管道将其传输到bash中的文本文件

    对于.docx,正如其他一些用户提到的那样,我使用了OOXMLSDK。它只是一个.NET库,可以更轻松地使用压缩在OOXML文件中的OOXML。如果您只对文本感兴趣,那么有很多元数据需要丢弃。其他一些人已经编写了我看到的代码:

    Words有一个非常简单的API,我发现它也有很好的支持

    commandlinefu.com中还有一个bash命令,它通过解压缩.docx来工作:

    unzip -p some.docx word/document.xml | sed -e 's/<[^>]\{1,\}>//g; s/[^[:print:]]\{1,\}//g'
    
    unzip-psome.docx word/document.xml | sed-e的//\{1,\}>//g;s/[^[:print:][]\{1,\}//g'
    
    斯南·努尔的方法很有效。
    然而,我在转换文件时遇到了一些问题

    另一种方法是使用Win32::OLE和Win32::剪贴板:

    • 打开Word文档
    • 选择所有文本
    • 在剪贴板中复制
    • 在txt文件中打印剪贴板的内容
    • 清空剪贴板并关闭Word文档
    根据年Sigvald Refsu给出的脚本,我提出了以下脚本

    注意:我选择使用与.docx文件相同的基本名称将txt文件保存在同一文件夹中,但这很容易更改

    希望它能帮助您。

    使用,您可以轻松获取单词的全文(仅适用于docx)

    下面是代码(Node.JS)


    这仅仅是三行代码,不依赖于任何word实例(全部为纯JS)

    只要它可以通过windows pc上的计划任务自动执行,word是否打开都无所谓。。。。我会回答这个问题这是一个很好的工具。。。直到现在我才真正使用过它,我想知道我是从哪里得到这些信息的。再次感谢
    for I in *.doc?; do mv $I `echo $ | sed 's/\.docx?/\.txt'`; done
    
    unzip -p some.docx word/document.xml | sed -e 's/<[^>]\{1,\}>//g; s/[^[:print:]]\{1,\}//g'
    
    ########################################### 
    use strict; 
    use File::Spec::Functions qw( catfile );
    use FindBin '$Bin';
    use Win32::OLE qw(in with); 
    use Win32::OLE::Const 'Microsoft Word'; 
    use Win32::Clipboard; 
    
    my $monitor_word=0; #set 1 to watch MS Word being opened and closed
    
    sub docx2txt {
        ##Note: the path shall be in the form "C:\dir\ with\ space\file.docx"; 
        my $docx_file=shift; 
    
        #MS Word object
        my $Word = Win32::OLE->new('Word.Application', 'Quit') or die "Couldn't run Word"; 
        #Monitor what happens in MS Word 
        $Word->{Visible} = 1 if $monitor_word; 
    
        #Open file 
        my $Doc = $Word->Documents->Open($docx_file); 
        with ($Doc, ShowRevisions => 0); #Turn of revision marks 
    
        #Select the complete document
        $Doc->Select(); 
        my $Range = $Word->Selection();
        with ($Range, ExtendMode => 1);
        $Range->SelectAll(); 
    
        #Copy selection to clipboard 
        $Range->Copy();
    
        #Create txt file 
        my $txt_file=$docx_file; 
        $txt_file =~ s/\.docx$/.txt/;
        open(TextFile,">$txt_file") or die "Error while trying to write in $txt_file (!$)"; 
        printf TextFile ("%s\n", Win32::Clipboard::Get()); 
        close TextFile; 
    
        #Empty the Clipboard (to prevent warning about "huge amount of data in clipboard")
        Win32::Clipboard::Set("");
    
        #Close Word file without saving 
        $Doc->Close({SaveChanges => wdDoNotSaveChanges});
    
        # Disconnect OLE 
        undef $Word; 
    }
    
    DocxTemplater=require('docxtemplater');
    doc=new DocxTemplater().loadFromFile("input.docx");
    result=doc.getFullText();