首页 > 解决方案 > 打开文件时文件显示以只读方式打开

问题描述

我正在尝试使用 Java 中的 XSSFWorkBook 创建一个 .xlsx 文件。使用下面的代码我正在尝试

try
{
    File tempFile = new File(validateFileUrl);
    XSSFWorkbook workbook = null;
    XSSFSheet sheet = null;
    if(!rowList.isEmpty()) // rowList contains comma(,) separated string values
    {
        workbook = new XSSFWorkbook();
        sheet = workbook.createSheet();
        int rownum=0;
        for(String rowStr : rowList)
        {
            XSSFRow row = sheet.createRow(rownum++);
            String[] cellArr = rowStr.split(",");
            int cellCount=0;
            for(String cellStr : cellArr)
            {
                XSSFCell crrCell = row.createCell(cellCount++);
                crrCell.setCellValue(cellStr);
            }
        }
        
        FileOutputStream fos = new FileOutputStream(tempFile);
        workbook.write(fos);
        workbook.close();
    }
}
catch(Exception e)
{
    e.printStackTrace();
}

文件已成功创建,但问题是创建的文件以只读模式打开,如何以可写模式创建它?

我也尝试过以下选项

tempFile.setWritable(true);

但它不起作用,请帮助解决这个问题。谢谢

标签: java

解决方案


Excel 不允许编辑其他应用程序仍在写入的文件。相反,它正在等待独占访问。

您需要确保在 Java 中文件缓冲区在您完成写入文件后关闭。这发生在 JVM 终止或您的代码显式关闭 FileOutputStream 时。请注意,如果抛出异常,显式调用 close 可能会很棘手。这是利用 FileOutputStream 的 AutoClose 功能的安全方法:

try {
    File tempFile = new File(validateFileUrl);
    XSSFWorkbook workbook = null;
    XSSFSheet sheet = null;
    if(!rowList.isEmpty()) { // rowList contains comma(,) separated string values 
        workbook = new XSSFWorkbook();
        sheet = workbook.createSheet();
        int rownum=0;
        for(String rowStr : rowList) {
            XSSFRow row = sheet.createRow(rownum++);
            String[] cellArr = rowStr.split(",");
            int cellCount=0;
            for(String cellStr : cellArr) {
                XSSFCell crrCell = row.createCell(cellCount++);
                crrCell.setCellValue(cellStr);
            }
        }
    
        try (FileOutputStream fos = new FileOutputStream(tempFile)) {
            workbook.write(fos);
        }
        workbook.close();
    }
}
catch(Exception e) {
    e.printStackTrace();
}

请注意,反之亦然,Excel 仅拥有对该文件的访问权限。因此,如果您想从应用程序中再次编写它,请确保 Excel 已关闭文档。


推荐阅读