本代码使用的Android版本:android-studio-2024.2.1.11-windows
目录
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[]数据、指定行数,实现对于表格中的某一行的数据覆盖。
注意:仅仅是覆盖,如果原先表格行内容为:
| 1 | 1 | 1 |
String[]中内容为"2","2"
最后实现效果如下:
| 2 | 2 | 1 |
/**
* 已测试
* 对于已经写过的内容的覆写
*
* @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中的选项,重新进行选择就好。

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

被折叠的 条评论
为什么被折叠?



