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

创建一个新的。xls文件,如果它不存在,则修改它[Apache POI]

姬康平
2023-03-14

我正在使用Apache POI创建和修改excel文件。我希望我的程序用给定的名称创建一个新的。xls文件,如果它不存在于目录中。但是,如果它存在,我希望我的程序只打开那个。xls文件并修改它。

我的程序能够创建一个新的。xls文件,但是每当我试图将该文件作为HSSFWorkbook打开时,程序就会吐出一个错误,说“无效的头签名;读取0x0000000000000000,预期为0xE11AB1A1E011CFD0-您的文件似乎不是有效的OLE2文档”

我用来创建新文件的代码是:

         File excelFile = new File("Test.xls");
         excelFile.createNewFile();
         wb = new HSSFWorkbook(new FileInputStream(excelFile.getName())); // Throws the error right here [wb is an HSSFWorkbook object from the Apache POI Library]
        FileOutputStream fileout = new FileOutputStream("Test.xls", true);
        wb.write(fileout);
        fileout.close();
        wb.close(); // wb is an HSSFWorkbook object from the Apache POI Library

完整堆栈跟踪的错误消息为:

notole2FileException:无效的标头
签名;读取0x000000000000000000,预期为0xE11AB1A1E011CFD0-您的文件在org.apache.poi.poifs.storage.headerblock.(headerblock.java:162)在org.apache.poi.poifs.storage.headerblock.(headerblock.java:112)在org.apache.poi.poifs.filesystem.(headerblock.java:302)在org.apache.poi.poifs.filesystem.(book.(hssfworkbook.java:374)在prototpye_2.frameJscraperTool.processworkbook(frameJscraperTool.java:224)在prototpye_2.frameJscraperTool.run(frameJscraperTool.java:54)在prototpye_2.jframeJscraperTool.run(frameJscraperTool.java:54)在prototpye_2.jframeMetest$open.actionPerformed(单击javax.sw(来源未知)basicMenuitemui.doClick(未知源)位于javax.swing.plaf.basic.basicMenuitemui$handler.mouseLelemed(未知源)位于java.awt.awtEventMulticaster.mouserLelemed(未知源)位于java.awt.component.processMouseEvent(未知源)位于java.awt.component.processMouseEvent(未知源)位于java.awt.component.processMouseEvent(未知源)位于在java.awt.lightweightdispatcher.retargetMouseEvent(未知源)在java.awt.lightweightdispatcher.processMouseEvent(未知源)在java.awt.lightweightdispatcher.dispatchEvent(未知源)在java.awt.container.dispatchEvent(未知源)在java.awt.window.dispatchEvent(未知源)在java.awt.window.dispatchEventImpl(未知源)在java.awt.EventQueue.Access$500(未知源)在java.awt.EventQueue$3.运行(未知源)在java.awt.EventQueue$3.运行(未知源)在java.security.AccessController.Doprivileged(本机方法)在java.security.ProtectionDomain$JavaSecurity.ProtectionDomain$JavaSecurityAccessiblemprivilege(本机方法)在java.security.ProtectionDomain位于java.awt.EventQueue.DispatchEvent(未知源)位于java.awt.EventDispatchThread.PumponeEventForFilters(未知源)位于java.awt.EventDispatchThread.PumpEventsForFilters(未知源)位于java.awt.EventDispatchThread.PumpEventsForFilters(未知源)位于java.awt.EventDispatchThread.PumpEventsForFilters(未知源)位于pEvents(未知源)位于java.awt.eventDispatchThread.run(未知源)

此外,当生成此错误时,在该目录中创建了一个.xls文件,但它的大小为0 KB,如果我们试图打开该文件,它会抱怨该文件已损坏。excel中出现以下提示:

尝试打开生成的。xls时在excel中出现的提示:

让我知道是否有更好的方法来实现我正在尝试做的事情,例如,如果一个。xls文件不存在,创建它,然后写入它,但如果它存在,只需访问它,并在其中写入数据。

谢谢

共有1个答案

孙成化
2023-03-14

创建新的Excel.xls文件:

import org.apache.poi.hssf.usermodel.HSSFSheet;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;
//..
HSSFWorkbook workbook = new HSSFWorkbook();
HSSFSheet sheet = workbook.createSheet("FuSsA sheet");
//Create a new row in current sheet
Row row = sheet.createRow(0);
//Create a new cell in current row
Cell cell = row.createCell(0);
//Set value to new value
cell.setCellValue("Slim Shady");
    try {
        FileOutputStream out = 
                new FileOutputStream(new File("C:\\new.xls"));
        workbook.write(out);
        out.close();
        System.out.println("Excel written successfully..");

    } catch (FileNotFoundException e) {
        e.printStackTrace();
    } catch (IOException e) {
        e.printStackTrace();
    }

更新现有Excel文件(.xls.xlsx)

try {
            File file = new File"C:\\update.xls");
            Workbook workbook = WorkbookFactory.create(file);
            Sheet sheet = workbook.getSheetAt(0);
            Cell cell = null;

            //Update the value of cell
            cell = sheet.getRow(1).getCell(2);
            cell.setCellValue(cell.getNumericCellValue() * 2);
            cell = sheet.getRow(2).getCell(2);
            cell.setCellValue(cell.getNumericCellValue() * 2);
            cell = sheet.getRow(3).getCell(2);
            cell.setCellValue(cell.getNumericCellValue() * 2);

            file.close();

            FileOutputStream outFile =new FileOutputStream(new File("C:\\update.xls"));
            workbook.write(outFile);
            outFile.close();

        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }

有关更多详细信息,请查看以下问题:使用Apache POI读/写不同的Microsoft Office文件格式

 类似资料:
  • 问题内容: 我很沮丧,我不知道该怎么做。 基本上,我只想创建一个表,但是如果它存在,则需要将其删除并重新创建,而不是将其截断,但是如果不存在,则可以创建它。 有人可以帮忙吗? 谢谢乔治 问题答案: 放在tablename您的发言之前。 该语句将删除该表(如果存在),但如果不存在则不会引发错误。

  • rank ▲ ✰ vote url 17 776 241 907 url 检查一个文件夹是否存在,如果不存在就创建它 有什么好的方法吗?这个是我想的: filename = "/my/directory/filename.txt" dir = os.path.dirname(filename) try: os.stat(dir) except: os.mkdir(dir) f

  • 如果CSV文件不存在,我想写一个新的CSV文件,并在其中附加行数据。不确定以下代码为什么不添加文件头?(罚款)

  • 你好,我尝试在ant中创建一个构建,如果它创建一个html报告,它将从eclips启动我的.class文件 “ “ 生成失败D:\Automation\Eclipse\MyWork\OpenCart\BUILD.xml:23:编译失败;有关详细信息,请参阅编译器错误输出。 总时间:1秒 ${lib}包含用于创建该类的所有库,并且只运行该类可以100%工作,但是当我试图在eclips中作为ant构建

  • 当然,这是我的错误,但我看不到它和我的理解的差距。谢谢!

  • 问题内容: 如果我这样做: 然后创建文件,并始终返回“文件存在”。是否可以不创建文件就检查文件是否存在? 编辑: 我忘了提到它处于for循环中。所以这是真实的东西: 问题答案: 实例化a时,您并没有在磁盘上创建任何东西,而只是构建了一个可以调用某些方法的对象,例如。 既好又便宜,不要试图避免这种实例化。 该实例只有两个字段: 这是构造函数: 如您所见,实例只是路径的封装。创建它以便进行调用是继续进