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

如何用Java更新MS Word 2003中嵌入的excel电子表格

翟淇
2023-03-14

我必须更新一个word文档,它以可编辑表格的形式嵌入了excel电子表格。我必须使用Java以编程方式更新这个表,以替换文档中嵌入的excel表中的值。为了获得excel电子表格对象的句柄,我研究了Apache POI(HWPFDocument方法)的所有可能选项,但到目前为止还没有找到任何方法选项可以控制该对象。

共有1个答案

宗乐池
2023-03-14

我有同样的问题,我一直在寻找,但我没有找到明确的答案,我们如何更新嵌入式excel文件到一个word文件,尝试了许多解决方案后,我找到了一种方法,更新或复制数据到excel嵌入式文件使用POI,也许是晚了,但我希望它能帮助其他人面临同样的问题。下面的代码示例基于此链接中的代码

在本例中,我们有一个word文档(Microsoft Office2007及以上版本),它有两个嵌入式excel文件,我们将用不同的内容(数据)更新这两个文件,

您可以尝试修改此代码以支持Word2003

import org.apache.poi.openxml4j.exceptions.OpenXML4JException;
import org.apache.poi.openxml4j.opc.PackagePart;
import org.apache.poi.ss.usermodel.Workbook;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;
import org.apache.poi.xwpf.usermodel.XWPFDocument;

import java.io.*;
import java.util.List;
import java.util.logging.Logger;

public class UpdateEmbeddedDoc {

    private XWPFDocument doc;
    private File docFile;

    private static final String BINARY_EXTENSION = "xls";
    private static final String OPENXML_EXTENSION = "xlsx";

    private final static Logger LOGGER =
            Logger.getLogger(UpdateEmbeddedDoc.class.getName());

    // Here in the contractor we give the path of the word document (docFilePath) that it contains the excel embedded files
    public UpdateEmbeddedDoc(String docFilePath) throws FileNotFoundException,
            IOException {
        this.docFile = new File(docFilePath);
        if (!this.docFile.exists()) {
            throw new FileNotFoundException("The Word document " + docFilePath + " does not exist.");
        }
        try (FileInputStream fis = new FileInputStream(this.docFile)) {
            // Open the Word document file and instantiate the XWPFDocument class.
            this.doc = new XWPFDocument(fis);
        }
    }

    public void updateEmbeddedDoc(String ExcelFile1, String ExcelFile2) throws OpenXML4JException, IOException {
        List<PackagePart> embeddedDocs = this.doc.getAllEmbeddedParts();

        //in this example we have two embedded excel files the first one it is in first index 0
        //the second excel file will be on the second index 1 (0 based index)
        PackagePart pPart0 = embeddedDocs.get(0);
        PackagePart pPart1 = embeddedDocs.get(1);
        LOGGER.info("embedded first part : " + embeddedDocs.get(0));
        LOGGER.info("embedded second part : " + embeddedDocs.get(1));

        //Here we are calling copyWorkbook method and give the path of the excel file (ExcelFile1 and ExcelFile2 )
        // that it contains the data that we want to copy to embedded execl files (pPart0 and pPart1 )
        copyWorkbook(ExcelFile1, pPart0);
        copyWorkbook(ExcelFile2, pPart1);


        if (!embeddedDocs.isEmpty()) {
            try (FileOutputStream fos = new FileOutputStream(this.docFile)) {
                this.doc.write(fos);
            }
        }


    }

    public void copyWorkbook(String inputExelFilePath, PackagePart pPart) {
        try {

            FileInputStream file = new FileInputStream(inputExelFilePath);
            Workbook workbookInput = new XSSFWorkbook(file);
            String ext = pPart.getPartName().getExtension();

            if (BINARY_EXTENSION.equals(ext) || OPENXML_EXTENSION.equals(ext)) {
                try (
                        OutputStream os = pPart.getOutputStream()) {
                    //Here we write our workbook (excel file) to the outputStream that refer to excel embedded file
                    workbookInput.write(os);

                } catch (IOException e) {
                    LOGGER.severe("Could not update the excel file : " + e.getMessage());
                }
            }

        } catch (IOException e) {
            LOGGER.severe("Could not update the excel file : " + e.getMessage());
        }
    }
public class VdslmopApplication {
    private final static Logger logger = Logger.getLogger(VdslmopApplication.class.getName());

    public static void main(String[] args) {
        // here we provide all the path for the files word document file and the two excel files 
        //its better to provide relative path to the files
        String docFilePath = "docfile/docTest.docx";
        String excelFile1Path = "excelFile/excelFile1.xlsx";
        String excelFile2Path = "excelFile/excelFile2.xlsx";

        try {
            UpdateEmbeddedDoc ued = new UpdateEmbeddedDoc(docFilePath);
            ued.updateEmbeddedDoc(excelFile1Path, excelFile2Path);
            logger.info("Doc file has been successfully updated ");
        } catch (IOException e) {
            e.printStackTrace();
        } catch (OpenXML4JException e) {
            e.printStackTrace();
        }
    }
}
 类似资料:
  • 我是Python新手。我需要将程序中的一些数据写入电子表格。我在网上搜索过,似乎有很多可用的软件包(xlwt、XlsXcessive、openpyxl)。其他人建议写信给一家公司。csv文件(从未使用过csv,也不了解它是什么)。 程序非常简单。我有两个列表(float)和三个变量(string)。我不知道这两个列表的长度,它们可能不会是相同的长度。 我希望布局如下图: 粉红色列将具有第一个列表的

  • 问题内容: 我需要将程序中的一些数据写入电子表格。我在网上搜索过,似乎有很多可用的软件包(xlwt,XlsXcessive,openpyxl)。其他人则建议写入.csv文件(从未使用过CSV,也不真正了解它是什么)。 该程序非常简单。我有两个列表(浮点数)和三个变量(字符串)。我不知道两个列表的长度,它们的长度可能不一样。 粉色列将具有第一个列表的值,绿色列将具有第二个列表的值。 那么最好的方法是

  • 我在更新google drive上的现有电子表格时遇到了一个问题,没有使用批量更新(现在我甚至不确定是否可能) 我已经有一些数据现有的电子表格,然后我检索文件从谷歌驱动器通过 我很容易通过名称匹配我的文件,然后我只想在创建的文件中更新电子表格。 这里我从匹配名称的文件中获取电子表格,然后我只想把empy表放在那里(例如)。 第一点,我不确定如何正确地“更新”驱动器上的电子表格,因为我无法使用 我不

  • 问题内容: 我正在寻找使用openpyxl将行插入电子表格的最佳方法。 实际上,我有一个电子表格(Excel 2007),该电子表格具有标题行,其后最多(数千)行数据。我希望将行插入为实际数据的第一行,因此在标题之后。我的理解是,附加功能适合于将内容添加到 结尾 的文件。 阅读有关openpyxl和xlrd(以及xlwt)的文档,除了手动循环浏览内容并将其插入新表(在插入所需行之后)之外,我找不到

  • 问题内容: 我想在数据库中建立表格以在Excel工作表中获取大量联系信息,以便我可以在数据库中进行维护。 我尝试遵循从SQL Server 2008 R2导入导入/导出平面文件的操作,但此操作不起作用。谁能告诉我如何将电子表格成功导入数据库中的表中? 谢谢 问题答案: 有一个Microsoft知识库文章,列出了所有可能的方法。 http://support.microsoft.com/kb/321

  • 问题内容: 我需要在电子邮件中嵌入图像。我该怎么做? 我既不想使用第三方工具,也不想对特定于语言的答案感兴趣(但是如果您想知道的话,它就是PHP)。 我只对生成的电子邮件正文的格式感兴趣。 问题答案: 如您所知,作为电子邮件传递的所有内容都必须文本化。 您必须创建包含多部分/ mime消息的电子邮件。 如果要添加物理图像,则该图像必须使用base 64编码并分配了Content-ID(cid)。如