当前位置: 首页 > 知识库问答 >
问题:

优化DOC、XLS文件中的元数据写入

仲孙思源
2023-03-14

我正在做一个程序,只修改文件Doc,xls,ppt和Vsd中的元数据(标准和自定义),程序可以正常工作,但我想知道是否有办法在不将整个文件加载到内存中的情况下执行此操作:

POIFSFileSystem=new POIFSFileSystem(new FileInputStream("file.xls"))

NPOIFSFileSystem方法速度更快,占用的内存更少,但它是只读的。

我使用的是ApachePOI 3.9

共有2个答案

濮阳和泰
2023-03-14

在你提问的时候,很遗憾没有非常低的内存方法来做到这一点。好消息是,从2014-04-28开始,这是可能的!(发布时此代码应该在3.11中,但现在它太新了)

既然NPOIFS支持写入,包括就地写入,那么您要做的就是:

// Open the file, and grab the entries for the summary streams
NPOIFSFileSystem poifs = new NPOIFSFileSystem(file, false);
DocumentNode sinfDoc = 
     (DocumentNode)root.getEntry(SummaryInformation.DEFAULT_STREAM_NAME);
DocumentNode dinfDoc = 
     (DocumentNode)root.getEntry(DocumentSummaryInformation.DEFAULT_STREAM_NAME);

// Open and parse the metadata
SummaryInformation sinf = (SummaryInformation)PropertySetFactory.create(
     new NDocumentInputStream(sinfDoc));
DocumentSummaryInformation dinf = (DocumentSummaryInformation)PropertySetFactory.create(
     new NDocumentInputStream(dinfDoc));

// Make some metadata changes
sinf.setAuthor("Changed Author");
sinf.setTitle("Le titre \u00e9tait chang\u00e9");
dinf.setManager("Changed Manager");

// Update the metadata streams in the file
sinf.write(new NDocumentOutputStream(sinfDoc));
dinf.write(new NDocumentOutputStream(dinfDoc));

// Write out our changes
fs.writeFilesystem();
fs.close();

您应该能够在文件大小的20%以下的内存中完成所有这些操作,很可能小于较大文件的内存!

(如果您想了解更多信息,请查看ModifyDocumentSummaryInformation示例和HPSF TestWrite单元测试)

严宇
2023-03-14

您可以将所需的部分映射到内存中,然后使用< code > Java . nio . file channel 对其进行处理。

除了熟悉的字节通道读、写和关闭操作外,此类还定义了以下文件特定操作:

>

  • 可以以不影响通道当前位置的方式在文件中的绝对位置读取或写入字节

    文件的一个区域可以直接映射到存储器中;对于大文件,这通常比调用通常的读或写方法更有效。

  •  类似资料:
    • 我有保存在表中的数据(我已经从一个文件中收集了它),我想用java把它写在Excel xls文件中 我只共享主类,因为它显示了我如何将数据保存在表中

    • 我正在开发一个 iOS 应用程序,我正在使用 Documentum REST 服务。到目前为止,所有“GET”服务部分都工作正常,所有数据都从服务器正确响应。但现在我需要做一些“POST”部分将文档文件上传到服务器。 但是我被服务器的错误卡住了。 所以下面的代码,我用来上传文件文件到服务器,也提供了详细的错误信息。 法典: 详细错误: 错误:Error Domain=com.alamofire.E

    • 本文向大家介绍Nginx配置txt、pdf、doc、xls等文件直接下载的方法,包括了Nginx配置txt、pdf、doc、xls等文件直接下载的方法的使用技巧和注意事项,需要的朋友参考一下 使用Nginx时,如果要让一些附件比如 txt,pdf,doc等不直接在浏览器打开,而弹出另存为的对话框(也就是下载) 则可以在nginx的加上头配置如下: 如果客户端请求的文件以txt、pdf、doc、xl

    • 问题内容: 我已经搜索了stackoverflow,但是没有找到明确的答案。如何将数据从XLS文件的特定行和列读取到我的Android应用程序?如何读取XLS文件?我不想将其转换为CSV,因为在尝试将其转换时出现错误。 也许我可以使用此http://www.andykhan.com/jexcelapi/tutorial.html#reading,但我什至不知道如何将其导入到我的项目中。请帮忙。 问

    • 我正在编写一个java代码,它利用Apache-poi读取ms-office.doc文件,利用itext jar API创建并写入pdf文件。我已经阅读了.doc文件中打印的文本和表格。现在我正在寻找一个读取文档中写入的图像的解决方案。我已经编写了如下代码来读取文档文件中的图像。为什么这段代码不起作用。 存在的问题是:1。条件if(Picture.HasPicture(run))不满足,但文档具有

    • 问题内容: 有谁知道可以在Android上运行的良好Java Microsoft Office API?我知道有一个OpenOffice Java API,但我还没有听说有人在Android上使用它。 我知道使用意图是另一种选择,但是预安装的Office查看器在各种Android发行版中有多普遍?开发人员期望用户安装这些查看器之一是否合理?如果还没有安装这些应用程序中的一种,是否合理? 问题答案: