每次我写入 excel 时,它都会用一个空白文件覆盖整个文件 - PUZZLED

Posted

技术标签:

【中文标题】每次我写入 excel 时,它都会用一个空白文件覆盖整个文件 - PUZZLED【英文标题】:Every time I write to excel, it overwrites the entire file with a blank file - PUZZLED 【发布时间】:2014-11-18 01:06:27 【问题描述】:

我正在尝试做的是 onTestFailure (TestNG) 我正在尝试将通过/失败写入指定列。在下面的代码中,我只是想做一个小测试来将 Fail 写入指定的单元格。但是发生的事情是,它没有将通过/失败写入指定的单元格,而是从字面上覆盖整个文件并擦除我的所有数据,我对为什么会发生这种情况感到困惑。我在这里看过并用谷歌搜索但找不到答案。以下是以下代码:

 @Override
public synchronized void onTestFailure(ITestResult tr)
    try 
        Workbook workbook = Workbook.getWorkbook(new File(testData), workbookSettings);
        WritableWorkbook wb = Workbook.createWorkbook(new File(testData), workbook);
        WritableSheet ws = wb.getSheet("OrderEditQA3");
        Label label = new Label(5,2, "Fail");
        ws.addCell(label);
        wb.write();
     catch (IOException e) 
        e.printStackTrace();
     catch (BiffException b)
        System.out.print("Error!");
     catch (WriteException we)
        System.out.print("");
    

任何帮助将不胜感激。

更新...

下面是我用来将测试数据返回到 Dataprovider 的另一个类,我还从指定的工作表中加载我的所有元素。下面是代码

//获取所有测试数据的代码

protected static Object[][] loadTestData(String sheetName)throws BiffException, IOException
    Sheet sheet = null;
    try
        sheet = getWorkBook().getSheet(sheetName);
        rowCount = sheet.getRows();
        colCount = sheet.getColumns();
        data = new String[rowCount -1][colCount-1];
        int ci;
        int cj;
        ci=0;
        for(int i=1; i< rowCount; i++, ci++)
            cj=0;
            for(int j=1; j< colCount; j++, cj++)
                Cell cell = sheet.getCell(j,i);
                if(cell.getContents().isEmpty()) continue;
                System.out.print(cell.getContents() + "\n");
                data[ci][cj] = cell.getContents();
            
        
    catch (IOException io)
        System.out.print(String.format("File: %s not found!", testData));
    
    getWorkBook().close();
    return data;

//获取所有元素属性的代码:

@BeforeClass
protected static List<String> loadElements()throws BiffException, IOException 
    Sheet sheet = null;
    sheet = getWorkBook().getSheet("Elements");
    rowCount = sheet.getRows();
    colCount = sheet.getColumns();
    List<String> list = new ArrayList<>(rowCount);
    for (int i = 1; i < rowCount; i++) 
        for (int j = 0; j < colCount; j++) 
            Cell cell = sheet.getCell(j,i);
            if(cell.getContents().isEmpty()) continue;
            String cellContents = cell.getContents();
            list.add(cellContents);
            System.out.print(cell.getContents() + "\n");
        
    
    elements = list;
    getWorkBook().close();
    return list;

【问题讨论】:

我假设您使用的是 jexcel api? 是的,我正在使用 jexcel api - 关于为什么它会完全覆盖整本书而没有任何想法? 我正在查看 API,我没有发现您的代码有任何问题。你要关闭两个工作簿吗? 我更新了以上内容。在检索到测试所需的数据后,我将关闭工作簿,但我认为这不会影响正在发生的事情,因为我再次打开工作簿而不是关闭它。 Eureka - 使用 .close() 方法工作。但我很困惑为什么它需要关闭才能成功?信息是否位于某个缓冲区中,如果您未能关闭它,它仍保留在此缓冲区中? - 谢谢你,我很感激! 【参考方案1】:

忘了那个讨厌的 close() 方法

@Override
public synchronized void onTestFailure(ITestResult tr)
    try 
        Workbook workbook = Workbook.getWorkbook(new File(testData), workbookSettings);
        WritableWorkbook wb = Workbook.createWorkbook(new File(testData), workbook);
        WritableSheet ws = wb.getSheet("OrderEditQA3");
        Label label = new Label(5,2, "Fail");
        ws.addCell(label);
        wb.write();
        wb.close();
     catch (IOException e) 
        e.printStackTrace();
     catch (BiffException b)
        System.out.print("Error!");
     catch (WriteException we)
        System.out.print("");
    

【讨论】:

如果愿意,请通过复选标记将此标记为答案以关闭问题 刚刚点击了复选标记 - 我还是新手,所以我希望这个问题现在正式关闭

以上是关于每次我写入 excel 时,它都会用一个空白文件覆盖整个文件 - PUZZLED的主要内容,如果未能解决你的问题,请参考以下文章

每次在c#中写入新文件

每当我尝试将数字数据写入我的 .txt 文件时,它都会引发错误

Excel中的CSV空白行问题

每次我捕获视频并将其写入文件时如何给出不同的文件名? [关闭]

每次我执行 docker run ./gradlew 命令时,它都会下载所有 gradle 文件和依赖项。如何只下载和安装一次?

每次我想运行hibernate jpa应用程序时它都会挂起