java - 打开文件时文件显示以只读方式打开
问题描述
我正在尝试使用 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);
但它不起作用,请帮助解决这个问题。谢谢
解决方案
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 已关闭文档。
推荐阅读
- amazon-web-services - AWS CDK 错误:存储桶上已存在存储桶策略
- node.js - 会话 Cookie 和 CORS。Cookie 设置不正确
- mysql - 两个mysql查询的执行变得非常慢
- c# - 如何使用 SIMD 计算找到 4 个不同 Vector128 之间的最大值
- sql - SQLite 中的条件 FROM 子句
- service - 应用程序无法在后台 android studio 中运行
- java - 如何使用 android studio Java 获得 ssh 会话?
- python - 我需要使用 python 验证电子邮件
- php - 每次第二个循环运行php时如何呈现不同的Html
- c - 如何在列表中找到最大的索引