java 操作excel

if (v.getId() == R.id.button9) {

                try {
                    Workbook wbDangqian = Workbook.getWorkbook(new File(getActivity().getFilesDir(), "sfyuan.xls"));
                    WritableWorkbook book2 = Workbook.createWorkbook(new File(getActivity().getFilesDir(), "sfyuan.xls"), wbDangqian);
                    WritableSheet sheetDangqian0 = book2.getSheet(0);
                    int xuhao;
                    xuhao = Integer.valueOf(sheetDangqian0.getCell(0, 0).getContents().toString());
                    xuhao=xuhao+1;
                    textView8.setText(String.valueOf(xuhao));
                    Label label1 = new Label(0, 0, String.valueOf(xuhao));
                    sheetDangqian0.addCell(label1);
                    book2.write();
                    book2.close();
                    wbDangqian.close();
                } catch (Exception e) {
                    System.out.println(e);
                }
            }

我编写了一个android简易APP,我通过引入了一个包,可以用java来实现对excel表格数据的操作(被操作的excel数据文件放在手机的存储器里),上面的代码,我先读取表格sheet1第一行第一列单元格的内容,转化成整形数据后后加上1,然后再写回表格sheet1第一行第一列单元格,同时通过textView8来展示这个变化。奇了怪了,这个按钮点击10次后,点击第11次时程序就崩溃了,也就是说点击第1至第10次时,都能正常运行,点击第11次时程序就崩溃了,哪位给找找原因。

如果跟点击次数有关系,大概率是有内存泄漏
很可能前面点击都进了catch,导致资源并没有释放

关闭的操作,写到finally模块里。假如有异常的话,关闭逻辑不会执行。

                    book2.close();
                    wbDangqian.close();

你可以在try和catch中间加一个log。在logcat里面看一下抛出什么异常。但是你try里面有内容报错了。

打个断点 或者输出一下 看一下是不是 取的excel 行数超出了

try-catch加
finally(
book2.close();
wbDangqian.close();)

是源文件excel本身出了问题,重新建了一个源文件,问题就解决了。

是不是excel本身权限或者宏问题。获取单元格没有第十一个。可以输出日志到可以查看的地方

把点击11次的异常打印出来

前边的问题我也都看了,就不再询问,excel 一共有多少行数据? 是否考虑先将这个excel 读取到,然后再进行展示或者点击,减少重复读取excel的次数,也避免出现 读取超过行的空指针报错。
实在不行的话可以联系我远程看一下

可能是由于 Workbook 对象和 WritableWorkbook 对象未正确关闭引起的。在每次操作完 Excel 表格后,应确保调用 ​close()​ 方法来释放资源。

批量地读取excel表中的数据:

package com.dongmu;

import org.apache.poi.hssf.usermodel.HSSFDateUtil;
import org.apache.poi.ss.usermodel.*;
import org.apache.poi.xssf.usermodel.XSSFCell;
import org.apache.poi.xssf.usermodel.XSSFFormulaEvaluator;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;
import org.apache.poi.xssf.usermodel.helpers.XSSFFormulaUtils;

import java.io.FileInputStream;

public class TestExcelRead {
    public static void main(String[] args) throws Exception {


        FileInputStream inputStream = new FileInputStream("D:\\word文档\\武汉理工大学\\过去文件夹\\通信1904班云动会参赛情况.xlsx");

        Workbook workbook = new XSSFWorkbook(inputStream);

        Sheet sheet = workbook.getSheetAt(0);

        Row row = sheet.getRow(2);

        int physicalNumberOfCells = row.getPhysicalNumberOfCells();

        for (int i = 0; i < physicalNumberOfCells; i++) {
            Cell cell = row.getCell(i);
            String stringCellValue = cell.getStringCellValue();

            System.out.print(stringCellValue+"| ");
        }
        System.out.println("一共"+physicalNumberOfCells+"列。");

        int physicalNumberOfRows = sheet.getPhysicalNumberOfRows();

        for (int i = 4; i < physicalNumberOfRows; i++) {
            Row row1 = sheet.getRow(i);

            int physicalNumberOfCells1 = row1.getPhysicalNumberOfCells();

            for (int i1 = 0; i1 < physicalNumberOfCells1; i1++) {
                Cell cell = row1.getCell(i1);
                if (cell!=null){
                    int cellType = cell.getCellType();
                    switch (cellType){
//                    case XSSFCell.
                        case XSSFCell.CELL_TYPE_STRING:
                            System.out.print(cell.getStringCellValue()+"| ");
                            break;
                        case XSSFCell.CELL_TYPE_BLANK:
                            System.out.print("空值| ");break;
                        case XSSFCell.CELL_TYPE_BOOLEAN:
                            System.out.print(cell.getBooleanCellValue()+"| ");
                            break;
                        case XSSFCell.CELL_TYPE_FORMULA:
                            FormulaEvaluator formulaEvaluator = new XSSFFormulaEvaluator((XSSFWorkbook) workbook);
                            //获得计算公式
                            String cellFormula = cell.getCellFormula();
                            CellValue evaluate = formulaEvaluator.evaluate(cell);
                            String s = evaluate.formatAsString();
                            System.out.print(s+"| ");
                            break;
                        case XSSFCell.CELL_TYPE_NUMERIC:
                            if (HSSFDateUtil.isCellDateFormatted(cell)){
                                System.out.print(cell.getDateCellValue()+"| ");
                            }else {
                                cell.setCellType(XSSFCell.CELL_TYPE_STRING);
                                System.out.print(cell.getStringCellValue()+"| ");
                            }
                            break;
                        case XSSFCell.CELL_TYPE_ERROR:
                            System.out.print("数据类型错误| ");
                            break;
                    }
                }
//                System.out.println();
            }
            System.out.println();
        }

    }
}




你在try catch里面把错误的信息打印出来看具体是什么类型的错误。其次,如果跟使用次数有关系,那么你要检查下是否存在内存方面的问题,打开的文件流之类是否有及时关闭掉等等。检查下代码或者调试下看看。

根据你提供的代码和描述,这个崩溃的原因可能是:

每次点击按钮时,你都会创建一个新的 WritableWorkbook 来打开原来的 excel 文件。但前面的 WritableWorkbook 并没有关闭,所以会越积越多未关闭的 WritableWorkbook。

Excel 每个文件同一时刻只允许一个 WritableWorkbook 打开,多开会引发异常。

所以点击多次后,积累多个未关闭的 WritableWorkbook,超过 Excel 的限制就会崩溃。

可以修改代码,使每次点击只打开一个 WritableWorkbook,并在操作完成后立即关闭它:

WritableWorkbook book = null;
try {
  book = Workbook.createWorkbook(new File(file));
  
  // 你的其他代码
  
  book.write();

} finally {
  if(book != null) {
    book.close(); 
  }
}

另外也要关闭 wbDangqian,不要积累太多未关闭的 Workbook 对象。

这样每次点击只打开一个 WritableWorkbook,用完立即关闭,就可以避免崩溃的问题。

TechWhizKid参考GPT回答:

你的问题可能出在Excel文件的操作上,尤其是读取和写入的操作。你在每次点击按钮时都打开了Excel文件,并进行了读取和写入操作,然后再关闭。这种频繁的操作可能导致文件在某次读写操作中发生了错误,导致程序崩溃。

这个问题的解决方式有两个建议:

  1. 减少对Excel文件的频繁操作。例如,你可以在程序开始时打开文件,并在程序结束时关闭文件,而不是每次点击按钮时都打开和关闭。这样可以降低文件操作的频率,避免可能的错误。

  2. 增加错误处理机制。在文件操作的代码中增加try-catch语句,可以捕获并处理可能出现的错误,防止程序崩溃。你的代码中已经包含了一些错误处理,但可能还不够全面。你可以尝试增加更多的错误处理代码,例如处理文件打开失败、读取失败或写入失败的情况。

你可以修改你的代码,参考以下样例:

if (v.getId() == R.id.button9) {
    Workbook wbDangqian = null;
    WritableWorkbook book2 = null;
    try {
        wbDangqian = Workbook.getWorkbook(new File(getActivity().getFilesDir(), "sfyuan.xls"));
        book2 = Workbook.createWorkbook(new File(getActivity().getFilesDir(), "sfyuan.xls"), wbDangqian);
        WritableSheet sheetDangqian0 = book2.getSheet(0);
        int xuhao = Integer.valueOf(sheetDangqian0.getCell(0, 0).getContents().toString());
        xuhao = xuhao + 1;
        textView8.setText(String.valueOf(xuhao));
        Label label1 = new Label(0, 0, String.valueOf(xuhao));
        sheetDangqian0.addCell(label1);
        book2.write();
    } catch (Exception e) {
        System.out.println(e);
    } finally {
        if (book2 != null) {
            try {
                book2.close();
            } catch (Exception e) {
                System.out.println(e);
            }
        }
        if (wbDangqian != null) {
            try {
                wbDangqian.close();
            } catch (Exception e) {
                System.out.println(e);
            }
        }
    }
}

这个修改的代码使用了try-finally语句,确保了无论是否发生异常,Workbook和WritableWorkbook都会被正确地关闭。这样做可以避免资源泄漏,有助于稳定程序运行。

最后,你也可以尝试打印更详细的异常信息,或者使用调试工具进行调试,这样可以帮助你更准确地找到问题的位置。