Android超详细实现对于Excel表格的创建,查找,追加,覆写,获取有效行数等方法

        本代码使用的Android版本:android-studio-2024.2.1.11-windows

目录

一、准备工作:

二、创建方法类(JxlHelper)

1.创建表格:

2.追加一行内容:

3.覆写一行的数据:

4.覆写单个单元格

5.查询一行的数据:

6.查询符合条件单元格的行数据:

7.获取有效行数:

三、完整的类代码,可直接使用:

四、该方法类在Android中的使用须知:

1.使用表名获取虚拟机/实机的表路径

2.虚拟机或者实机中Excel存储位置         

3.如何在Device Explorer界面,双击.xlsx文件,直接使用wps打开Excel表格呢?

五、结语


        看完方法说明,可以仔细看下在Android中使用该类的须知,基本可以解决大部分在使用时候遇到的问题

一、准备工作:

        先导入一个依赖

        在项目下Gradle Scripts→build.gradle.kts(Module.app)→dependencies{}中加入依赖

        依赖代码:

implementation("net.sourceforge.jexcelapi:jxl:2.6.12")

        导入后点击重构:

二、创建方法类(JxlHelper)

        这边我自己创建了一个包专门放这些Helper,先把这些方法先介绍一遍吧,完整的代码请见最后的一个部分。

1.创建表格:

        输入文件地址、文件名、标题栏,实现对于表格的创建

/**
     * 已测试
     * 创建表格excel
     *
     * @param filePath  传入的文件地址
     * @param sheetName 传入的excel文件名
     * @param colName   传入首列标题栏
     */
    public static void createExcel(String filePath, String sheetName, String[] colName) {
        WritableWorkbook workbook = null;
        try {
            //检测表是否存在,不存在则重新创建一个
            File file = new File(filePath);
            if (!file.exists()) {
                file.createNewFile();
            } else {
                return;
            }
            //创建通用写手
            workbook = Workbook.createWorkbook(file);
            //对于表的一些设置
            WritableSheet writableSheet = workbook.createSheet(sheetName, 0);//设置表格的名字
            writableSheet.addCell((WritableCell) new Label(0, 0, filePath));//创建标题栏
            for (int col = 0; col < colName.length; col++) {
                writableSheet.addCell(new Label(col, 0, colName[col]));
            }
            workbook.write();
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            //关闭读写流
            if (workbook != null) {
                try {
                    workbook.close();
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
        }
    }
2.追加一行内容:

        输入文件名、和一个String[],实现对已填写数据的下一行填充数据。

/**
     * 已测试
     * 实现对于excel中一行的追加
     *
     * @param filePath 需要包括表名的全路径
     * @param data     输入的信息
     */
    public static void insertRowInformationIntoExcel(String filePath, String[] data) {
        if (data != null) {
            WritableWorkbook writebook = null;
            InputStream in = null;
            try {
                //设置编码格式
                WorkbookSettings setEncode = new WorkbookSettings();
                setEncode.setEncoding("UTF-8");
                //定义输入的操作者writebook
                Workbook workbook = Workbook.getWorkbook(new FileInputStream(new File(filePath)));//定义了一个通用的写手
                writebook = Workbook.createWorkbook(new File(filePath), workbook);//定义了一个对于一个表特定的写手
                WritableSheet sheet = writebook.getSheet(0);//获取第几张表
                //把组件的内容重新输入excel中
//                Log.d("Code", "insertRowInformationIntoExcel: " + sheet.getRows());
                int index = sheet.getRows();
                for (int i = 0; i < data.length; i++) {
                    sheet.addCell(new Label(i, index, data[i]));
                }
                writebook.write();
                workbook.close();
            } catch (Exception e) {
                e.printStackTrace();
            } finally {
                //关闭两个写入手
                if (writebook != null) {
                    try {
                        writebook.close();
                    } catch (Exception e) {
                        e.printStackTrace();
                    }
                }
                if (in != null) {
                    try {
                        in.close();
                    } catch (IOException e) {
                        e.printStackTrace();
                    }
                }
            }
        }

    }
3.覆写一行的数据:

        输入文件地址、String[]数据、指定行数,实现对于表格中的某一行的数据覆盖。

        注意:仅仅是覆盖,如果原先表格行内容为:

111

        String[]中内容为"2","2"

        最后实现效果如下:

221
/**
     * 已测试
     * 对于已经写过的内容的覆写
     *
     * @param filePath
     * @param data
     * @param row
     */
    public static void overWriteRowInformation(String filePath, String[] data, String row) {
        if (data != null) {
            WritableWorkbook writebook = null;
            InputStream in = null;
            try {
                // 打开工作簿
                Workbook workbook = Workbook.getWorkbook(new File(filePath));
                WritableWorkbook writableWorkbook = Workbook.createWorkbook(new File(filePath), workbook);

                // 获取第一个工作表
                WritableSheet sheet = writableWorkbook.getSheet(0);
                int indexRow = sheet.getRows();
                if (indexRow >= Integer.parseInt(row)) {
                    // 遍历要覆写的行的每个单元格,并更新其内容
                    for (int col = 0; col < data.length; col++) {
                        // 检查单元格是否存在
                        Cell oldCell = sheet.getCell(col, Integer.parseInt(row));
                        if (oldCell != null) {
                            // 创建一个新的Label对象来覆写单元格内容
                            Label newCellContent = new Label(col, Integer.parseInt(row), data[col]);
                            // 将新的Label对象添加到工作表中,会覆盖旧的内容
                            sheet.addCell(newCellContent);
                        }
                    }
                } else Log.d("Code", "overWriteRowInformation: 已经超过当前条例");
                // 写入并关闭工作簿
                writableWorkbook.write();
                writableWorkbook.close();
                workbook.close();

                System.out.println("Excel 行数据覆写成功!");
            } catch (Exception e) {
                e.printStackTrace();
            } finally {
                //关闭两个写入手
                if (writebook != null) {
                    try {
                        writebook.close();
                    } catch (Exception e) {
                        e.printStackTrace();
                    }
                }
                if (in != null) {
                    try {
                        in.close();
                    } catch (IOException e) {
                        e.printStackTrace();
                    }
                }
            }
        }

    }
4.覆写单个单元格

        输入文件地址、String[]数据、指定行数,列名(之前设置的标题栏中内容),实现对于表格中的某一行的数据修改,仅限覆盖。

//添加一个修改单个单元格的方法

    /**已测试
     *根据某行和定位某列来将data值替代到单元格中
     * @param filePath 路径值
     * @param row 某行
     * @param field 首行列名,用于匹配
     * @param data 更替的数值
     * @return
     */
    public static String overWriteRowInformationSingle(String filePath, String row, String field, String data) {
        String Code = "100";
        int fieldColIndex = 0;
        File file = new File(filePath);
        try {
            Workbook workbook = Workbook.getWorkbook(new File(filePath));
            WritableWorkbook writableWorkbook = Workbook.createWorkbook(new File(filePath), workbook);
            // 获取第一个工作表
            WritableSheet sheet = writableWorkbook.getSheet(0);
            int Cols = sheet.getColumns();
            //定位到自己的所需要的字段
            for (int i = 0; i < Cols; ++i) {
                if (sheet.getCell(i, 0).getContents().trim().equals(field)) {
                    fieldColIndex = i;
                }
            }
            //修改单个单元格
            //获取原单元格
            Cell oldCell = sheet.getCell(fieldColIndex, Integer.parseInt(row));
            if (oldCell != null) {
                // 创建一个新的Label对象来覆写单元格内容
                Label newCellContent = new Label(fieldColIndex, Integer.parseInt(row), data);
                // 将新的Label对象添加到工作表中
                sheet.addCell(newCellContent);
            }
            writableWorkbook.write();
            writableWorkbook.close();
            workbook.close();
        } catch (Exception e) {
            Log.e("yy", "e" + e);
        }
        return Code;
    }
5.查询一行的数据:

        根据表格地址、行数来获取一行数据,存入ArrayList中,返回一个ArrayList<String>

/**
     * 已测试
     * 根据索引值实现对于数据的查询返回一个Arraylist<String>对象(数据)
     *
     * @param filePath
     * @param Row
     * @return
     */
    public static ArrayList<String> findRowInformationIntoExcelbyRow(String filePath, String Row) {
        ArrayList<String> arrayList = new ArrayList<>();
        File file = new File(filePath);
        try {
            InputStream is = new FileInputStream(file);
            Workbook workbook = Workbook.getWorkbook(is);
            workbook.getNumberOfSheets();
            Sheet sheet = workbook.getSheet(0);
            int Cols = sheet.getColumns();
            int Rows = sheet.getRows();
            //遍历一行
            for (int j = 0; j < Cols; j++) {
                arrayList.add(sheet.getCell(j, Integer.parseInt(Row)).getContents());
            }
            workbook.close();
        } catch (Exception e) {
            Log.e("yy", "e" + e);
        }
        return arrayList;
    }
6.查询符合条件单元格的行数据:

        根据表路径、所需要比对的列、比对信息,返回一个ArrayList<String>对象,其中装的是符合条件的行索引。

/**
     * 已测试
     * 根据核对得到的值实现对于数据的查询返回一个Arraylist<String>对象(索引集合) 列项遍历
     *
     * @param filePath   全路径包括表名
     * @param field      核对的col
     * @param fieldValue 核对的值
     * @return
     */
    public static ArrayList<String> findRowInformationRetIds(String filePath, String field, String fieldValue) {
        int fieldColIndex = 0;
        File file = new File(filePath);
        ArrayList<String> arrayList = new ArrayList<>();
        try {
            InputStream is = new FileInputStream(file);
            Workbook workbook = Workbook.getWorkbook(is);
            workbook.getNumberOfSheets();
            Sheet sheet = workbook.getSheet(0);
            int Cols = sheet.getColumns();
            int Rows = sheet.getRows();
            //定位到自己的所需要的字段
            for (int i = 0; i < Cols; ++i) {
                if (sheet.getCell(i, 0).getContents().trim().equals(field)) {
                    fieldColIndex = i;
                }
            }
            for (int i = 1; i < Rows; ++i) {
                //定位字段相同的一行
                if (sheet.getCell(fieldColIndex, i).getContents().trim().equals(fieldValue)) {
                    arrayList.add(String.valueOf(i));
                }

            }
            workbook.close();
        } catch (Exception e) {
            Log.e("yy", "e" + e);
        }
        return arrayList;
    }
7.获取有效行数:

        根据表路径,返回目前该表格的有效行数(有效行数指的是在表格中已经填写过数据的行数)。

/**已测试
     *  获取这个excel以填写的非空的行数
     * @param filePath
     * @return
     */
    public static int getValidRows(String filePath) {
        WritableWorkbook writebook = null;
        InputStream in = null;
        int indexRow = -1;
        try {
            // 打开工作簿
            Workbook workbook = Workbook.getWorkbook(new File(filePath));
            WritableWorkbook writableWorkbook = Workbook.createWorkbook(new File(filePath), workbook);

            // 获取第一个工作表
            WritableSheet sheet = writableWorkbook.getSheet(0);
            indexRow = sheet.getRows();
            // 写入并关闭工作簿
            writableWorkbook.write();
            writableWorkbook.close();
            workbook.close();
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            //关闭两个写入手
            if (writebook != null) {
                try {
                    writebook.close();
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
            if (in != null) {
                try {
                    in.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
        return indexRow;
    }

三、完整的类代码,可直接使用:

该类位于项目中AllHelper包下,AllHelper是自己建立的包。

package com.example.wechattest.AllHelper;

import android.util.Log;
import org.apache.log4j.Logger;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.util.ArrayList;
import jxl.Cell;
import jxl.Sheet;
import jxl.Workbook;
import jxl.WorkbookSettings;
import jxl.write.Label;
import jxl.write.WritableCell;
import jxl.write.WritableSheet;
import jxl.write.WritableWorkbook;

public class JxlHelper {
    private static final Logger log = Logger.getLogger(JxlHelper.class);

    /**
     * 已测试
     * 创建表格excel
     *
     * @param filePath  传入的文件地址
     * @param sheetName 传入的excel文件名
     * @param colName   传入首列标题栏
     */
    public static void createExcel(String filePath, String sheetName, String[] colName) {
        WritableWorkbook workbook = null;
        try {
            //检测表是否存在,不存在则重新创建一个,存在就直接不操作
            File file = new File(filePath);
            if (!file.exists()) {
                file.createNewFile();
            } else {
                return;
            }
            //创建通用写手
            workbook = Workbook.createWorkbook(file);
            //对于表的一些设置
            WritableSheet writableSheet = workbook.createSheet(sheetName, 0);//设置表格的名字
            writableSheet.addCell((WritableCell) new Label(0, 0, filePath));//创建标题栏
            for (int col = 0; col < colName.length; col++) {
                writableSheet.addCell(new Label(col, 0, colName[col]));
            }
            workbook.write();
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            //关闭读写流
            if (workbook != null) {
                try {
                    workbook.close();
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
        }
    }

    /**
     * 已测试
     * 实现对于excel中一行的追加
     *
     * @param filePath 需要包括表名的全路径
     * @param data     输入的信息
     */
    public static void insertRowInformationIntoExcel(String filePath, String[] data) {
        if (data != null) {
            WritableWorkbook writebook = null;
            InputStream in = null;
            try {
                //设置编码格式
                WorkbookSettings setEncode = new WorkbookSettings();
                setEncode.setEncoding("UTF-8");
                //定义输入的操作者writebook
                Workbook workbook = Workbook.getWorkbook(new FileInputStream(new File(filePath)));//定义了一个通用的写手
                writebook = Workbook.createWorkbook(new File(filePath), workbook);//定义了一个对于一个表特定的写手
                WritableSheet sheet = writebook.getSheet(0);//获取第几张表
                //把组件的内容重新输入excel中
//                Log.d("Code", "insertRowInformationIntoExcel: " + sheet.getRows());
                int index = sheet.getRows();
                for (int i = 0; i < data.length; i++) {
                    sheet.addCell(new Label(i, index, data[i]));
                }
                writebook.write();
                workbook.close();
            } catch (Exception e) {
                e.printStackTrace();
            } finally {
                //关闭两个写入手
                if (writebook != null) {
                    try {
                        writebook.close();
                    } catch (Exception e) {
                        e.printStackTrace();
                    }
                }
                if (in != null) {
                    try {
                        in.close();
                    } catch (IOException e) {
                        e.printStackTrace();
                    }
                }
            }
        }

    }

    //根据需求查找一行

    /**
     * 已测试
     * 根据索引值实现对于数据的查询返回一个Arraylist<String>对象(数据)
     *
     * @param filePath
     * @param Row
     * @return
     */
    public static ArrayList<String> findRowInformationIntoExcelbyRow(String filePath, String Row) {
        ArrayList<String> arrayList = new ArrayList<>();
        File file = new File(filePath);
        try {
            InputStream is = new FileInputStream(file);
            Workbook workbook = Workbook.getWorkbook(is);
            workbook.getNumberOfSheets();
            Sheet sheet = workbook.getSheet(0);
            int Cols = sheet.getColumns();
            int Rows = sheet.getRows();
            //遍历一行
            for (int j = 0; j < Cols; j++) {
                arrayList.add(sheet.getCell(j, Integer.parseInt(Row)).getContents());
            }
            workbook.close();
        } catch (Exception e) {
            Log.e("yy", "e" + e);
        }
        return arrayList;
    }

    /**
     * 已测试
     * 根据核对得到的值实现对于数据的查询返回一个Arraylist<String>对象(索引集合) 列项遍历
     *
     * @param filePath   全路径包括表名
     * @param field      核对的col
     * @param fieldValue 核对的值
     * @return
     */
    public static ArrayList<String> findRowInformationRetIds(String filePath, String field, String fieldValue) {
        int fieldColIndex = 0;
        File file = new File(filePath);
        ArrayList<String> arrayList = new ArrayList<>();
        try {
            InputStream is = new FileInputStream(file);
            Workbook workbook = Workbook.getWorkbook(is);
            workbook.getNumberOfSheets();
            Sheet sheet = workbook.getSheet(0);
            int Cols = sheet.getColumns();
            int Rows = sheet.getRows();
            //定位到自己的所需要的字段
            for (int i = 0; i < Cols; ++i) {
                if (sheet.getCell(i, 0).getContents().trim().equals(field)) {
                    fieldColIndex = i;
                }
            }
            for (int i = 1; i < Rows; ++i) {
                //定位字段相同的一行
                if (sheet.getCell(fieldColIndex, i).getContents().trim().equals(fieldValue)) {
                    arrayList.add(String.valueOf(i));
                }

            }
            workbook.close();
        } catch (Exception e) {
            Log.e("yy", "e" + e);
        }
        return arrayList;
    }

    /**
     * 已测试
     * 对于已经写过的内容的覆写
     *
     * @param filePath
     * @param data
     * @param row
     */
    public static void overWriteRowInformation(String filePath, String[] data, String row) {
        if (data != null) {
            WritableWorkbook writebook = null;
            InputStream in = null;
            try {
                // 打开工作簿
                Workbook workbook = Workbook.getWorkbook(new File(filePath));
                WritableWorkbook writableWorkbook = Workbook.createWorkbook(new File(filePath), workbook);

                // 获取第一个工作表
                WritableSheet sheet = writableWorkbook.getSheet(0);
                int indexRow = sheet.getRows();
                if (indexRow >= Integer.parseInt(row)) {
                    // 遍历要覆写的行的每个单元格,并更新其内容
                    for (int col = 0; col < data.length; col++) {
                        // 检查单元格是否存在
                        Cell oldCell = sheet.getCell(col, Integer.parseInt(row));
                        if (oldCell != null) {
                            // 创建一个新的Label对象来覆写单元格内容
                            Label newCellContent = new Label(col, Integer.parseInt(row), data[col]);
                            // 将新的Label对象添加到工作表中,该部分会对旧的内容进行覆写
                            sheet.addCell(newCellContent);
                        }
                    }
                } else Log.d("Code", "overWriteRowInformation: 已经超过当前条例");
                // 写入并关闭工作簿
                writableWorkbook.write();
                writableWorkbook.close();
                workbook.close();

                System.out.println("Excel 行数据覆写成功!");
            } catch (Exception e) {
                e.printStackTrace();
            } finally {
                //关闭两个写入手
                if (writebook != null) {
                    try {
                        writebook.close();
                    } catch (Exception e) {
                        e.printStackTrace();
                    }
                }
                if (in != null) {
                    try {
                        in.close();
                    } catch (IOException e) {
                        e.printStackTrace();
                    }
                }
            }
        }

    }
    /**已测试
     *根据某行和定位某列来将data值替代到单元格中
     * @param filePath 路径值
     * @param row 某行
     * @param field 首行列名,用于匹配
     * @param data 更替的数值
     * @return
     */
    public static String overWriteRowInformationSingle(String filePath, String row, String field, String data) {
        String Code = "100";
        int fieldColIndex = 0;
        File file = new File(filePath);
        try {
            Workbook workbook = Workbook.getWorkbook(new File(filePath));
            WritableWorkbook writableWorkbook = Workbook.createWorkbook(new File(filePath), workbook);
            // 获取第一个工作表
            WritableSheet sheet = writableWorkbook.getSheet(0);
            int Cols = sheet.getColumns();
            //定位到自己的所需要的字段
            for (int i = 0; i < Cols; ++i) {
                if (sheet.getCell(i, 0).getContents().trim().equals(field)) {
                    fieldColIndex = i;
                }
            }
            //修改单个单元格
            //获取原单元格
            Cell oldCell = sheet.getCell(fieldColIndex, Integer.parseInt(row));
            if (oldCell != null) {
                // 创建一个新的Label对象来覆写单元格内容
                Label newCellContent = new Label(fieldColIndex, Integer.parseInt(row), data);
                // 将新的Label对象添加到工作表中,该部分会对旧的内容进行覆写
                sheet.addCell(newCellContent);
            }
            writableWorkbook.write();
            writableWorkbook.close();
            workbook.close();
        } catch (Exception e) {
            Log.e("yy", "e" + e);
        }
        return Code;
    }

    //获取有效的行数

    /**已测试
     *  获取这个excel以填写的非空的行数
     * @param filePath
     * @return
     */
    public static int getValidRows(String filePath) {
        WritableWorkbook writebook = null;
        InputStream in = null;
        int indexRow = -1;
        try {
            // 打开工作簿
            Workbook workbook = Workbook.getWorkbook(new File(filePath));
            WritableWorkbook writableWorkbook = Workbook.createWorkbook(new File(filePath), workbook);

            // 获取第一个工作表
            WritableSheet sheet = writableWorkbook.getSheet(0);
            indexRow = sheet.getRows();
            // 写入并关闭工作簿
            writableWorkbook.write();
            writableWorkbook.close();
            workbook.close();
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            //关闭两个写入手
            if (writebook != null) {
                try {
                    writebook.close();
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
            if (in != null) {
                try {
                    in.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
        return indexRow;
    }

    //添加一个修改单个单元格的方法

}

四、该方法类在Android中的使用须知:

1.使用表名获取虚拟机/实机的表路径

        本文中所有检索Excel位置的部分,填写的是路径,而不是表名,这边下面提供了一个可以直接根据表名获取虚拟机中存储Excel路径的代码段:

    String excelTableName="excelTable1";//excelTable1是这边的表名,可以根据你的需求来更改
    Context context=this;//如果该部分代码不是直接写在OnCreat中,那你需要重新获取一下Context
    Log.d("Code", "SendMessage: " + excelTableName);
    //filePath是该Excel表格的完整路径
    String filePath = context.getExternalFilesDir(null).getAbsoluteFile() +  java.io.File.separator + excelTableName + ".xlsx";
2.虚拟机或者实机中Excel存储位置         

        首先点击下面的按钮,出现菜单栏

        

在菜单View中→Tool Windows→Device Explorer点击后,会在右侧出现Device Explorer界面。

       Device Explorer界面中,如果你是下述图中所示,说明你没有运行项目,这时候点击运行项目就可以看见虚拟机或者实机中的文件

项目运行后为下述图片:

文件层级:storage→emulated→0→Android→data→你的项目名(一般为com.example.xxx)→files

3.如何在Device Explorer界面,双击.xlsx文件,直接使用wps打开Excel表格呢?

        情况1:直接双击Device Explorer界面中的Excel表格,会出现以下页面,请直接圈选“Open matching files in associated application”,然后点击“OK”,即可。

        情况2:如果你一不小心选择了其他类型打开,如:你选中了“Text”打开方式,然后点击了“OK”,也不需要担心。

        点开设置Setting

        

        找到Editor→File Types→找到你刚刚选择错误的类型中,会发现有.xlsx类型在其中,(我上面示范的是错误选择了“Text”类型)直接点击删除,再次返回Device Explorer中再次双击.xlsx类型文件,就又会出现情况1中的选项,重新进行选择就好。

五、结语

        本篇文章的分享就到这里了,制作不易,觉得实用的就点个收藏吧!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值