Apache POI生成的Excel文件无法被Ms Excel打开(损坏)

10

我不知道为什么使用POI编写的文件无法被Microsoft Excel 2013打开,但该文件仍可被POI读取。(单元格值可更改)

这里是文件中出现的错误。

以下是代码:

FileInputStream fis = null;
    try {
        fis = new FileInputStream(fileUri); //not error at fileUri
    } catch (FileNotFoundException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
    String urii = fileUri.replace(".xls", "0.xls"); //not error
    File fisx = new File(urii);

    Workbook workbook = null;
        workbook = new HSSFWorkbook(fis);

    Sheet sheet = workbook.getSheetAt(0);

    Row row = sheet.getRow(0);

    Cell cell = row.getCell(0);

    String p = cell.getStringCellValue();

    TextView a = (TextView) findViewById(R.id.txtUri);

    cell.setCellValue(new String("popo"));
    String x = cell.getStringCellValue();

    TextView b = (TextView) findViewById(R.id.txtFile);

    a.setText(p);
    b.setText(x);

    OutputStream fos = null;

    fos = new FileOutputStream(fisx);
    workbook.write(fos); //main problem
    fos.flush();
    fos.close();

谢谢您的帮助!!

5个回答

7

您的代码存在两个问题。首先是这个:

FileInputStream fis = null;
try {
    fis = new FileInputStream(fileUri);

Apache POI文档中所述,如果您有一个文件,请勿使用InputStream!

其次,这个:

 Workbook workbook = null;
 workbook = new HSSFWorkbook(fis);

那只适用于 .xls 文件,不适用于 .xlsx 文件。相反,你需要使用 WorkbookFactory,它可以识别文件类型并为格式提供正确的工作簿。

因此,请更改您的代码:

File file = new File(fileUri);
Workbook workbook = WorkbookFactory.create(file);

我仍然得到相同的错误,原始文件大小为25kb,但输出文件大小只有17kb(内容相同或可能略有不同)。 - ketelagoreng
请确保保存到不同的文件。POI目前不支持原地写入,因此需要使用不同的文件。 - Gagravarr
String urii = fileUri.replace(".xls", "0.xls"); 这行代码用于更改文件的URI和名称,请帮帮我..... :(( - ketelagoreng
我在Java项目中尝试了这段代码,它可以正常工作。但是当我将这段代码用于Android项目(使用Bluestack模拟器)时,会出现错误输出(文件损坏)。 - ketelagoreng
这两个文件有什么不同?可惜听起来像是Android的一个bug,如果在普通Java环境中可以正常工作的话... - Gagravarr
1
来自模拟器的错误(可能),使用真实的安卓设备没有给我错误文件输出,我之前一直在使用蓝叠模拟器。 - ketelagoreng

2
我看到的主要问题是:
Workbook workbook = null;
    workbook = new HSSFWorkbook(fis);

相反,您必须使用:

Workbook workbook = null;
    workbook = new XSSFWorkbook(fis);

为了让MS EXCEL 2013能够读取文档。


是的,但为了能在 MS Excel 2013 上打开,您需要使用...XSSFWorkbook。 - Akash Rajbanshi
我的输入文件是xls类型,输出也是xls类型。此外,我尝试将输出文件上传到Google文档,但上传失败(我认为是因为输出文件损坏了)。 - ketelagoreng
@AkashRajbanshi 我需要将文件类型写成xlsx,我使用FileOutputStream类。你能建议一下使用正确的工作簿类写入文件的方法吗? - Suresh

0
解决方案:
使用真实的安卓设备而不是Bluestack模拟器,我不知道为什么,但它可以工作!!
谢谢大家 :D

0

你正在调用 getSheetAt(0),但是在此之前你没有创建任何工作表(workbook.createSheet("name"))


-1

解决方案是使用 .xls 扩展名而不是 .xlsx,如答案中所述。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接