为了帮助其他人,这里提供一个完整的工作解决方案,使用POI v3.17(适用于Android API 15及更高版本)读取XLS文件(XLSX也可以,但需要更改一些行)。
首先,从
Releases下载POI jar文件的0.5版本,并将其粘贴到Android Studio的/lib文件夹中。
您的布局包括一个简单的TextView和一个简单的Button:
<?xml version="1.0" encoding="utf-8"?>
<android.support.constraint.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="#FFEB3B"
tools:context=".MainActivity">
<TextView
android:id="@+id/textView"
android:layout_width="0dp"
android:layout_height="0dp"
android:layout_marginLeft="24dp"
android:layout_marginTop="24dp"
android:layout_marginRight="24dp"
android:layout_marginBottom="24dp"
android:background="#FFFFFF"
android:inputType="textMultiLine"
android:padding="24dp"
android:singleLine="false"
android:text="Hello World!"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintRight_toRightOf="parent"
app:layout_constraintTop_toTopOf="parent" />
<Button
android:id="@+id/button"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginBottom="8dp"
android:text="Button"
app:layout_constraintBottom_toBottomOf="@+id/textView"
app:layout_constraintEnd_toEndOf="@+id/textView"
app:layout_constraintStart_toStartOf="@+id/textView" />
</android.support.constraint.ConstraintLayout>
然后将这行代码放在gradle模块中:
implementation files('libs/poishadow-all.jar')
现在(为了尝试应用程序)创建一个示例Excel文件,3列,3行,任何数据都可以。您可以创建更多的列和工作表。但是如果您第一次尝试此代码,请仅使用三列。现在将文件名保存为“myexcelsheet.xls”,转到Android项目目录并打开您的Android项目。进入文件夹app-> src-> main。在那里,您会看到两个文件夹名称为java和res。现在在这里创建一个名为assets的新文件夹,并将myexcelsheet.xls文件放入其中。
最后是主Activity代码:
package com.example.readexcelfiles;
import android.content.res.AssetManager;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;
import org.apache.poi.hssf.usermodel.HSSFCell;
import org.apache.poi.hssf.usermodel.HSSFRow;
import org.apache.poi.hssf.usermodel.HSSFSheet;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import org.apache.poi.poifs.filesystem.POIFSFileSystem;
import org.apache.poi.ss.usermodel.Cell;
import org.apache.poi.ss.usermodel.Row;
import java.io.InputStream;
import java.util.Iterator;
public class MainActivity extends AppCompatActivity {
TextView txtView;
Button btnRead;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
txtView = findViewById(R.id.textView);
btnRead = findViewById(R.id.button);
btnRead.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
readExcelFileFromAssets();
}
});
}
public void readExcelFileFromAssets() {
try {
InputStream myInput;
AssetManager assetManager = getAssets();
myInput = assetManager.open("myexcelsheet.xls");
POIFSFileSystem myFileSystem = new POIFSFileSystem(myInput);
HSSFWorkbook myWorkBook = new HSSFWorkbook(myFileSystem);
HSSFSheet mySheet = myWorkBook.getSheetAt(0);
Iterator<Row> rowIter = mySheet.rowIterator();
int rowno =0;
txtView.append("\n");
while (rowIter.hasNext()) {
Log.e("aaa", " row no "+ rowno );
HSSFRow myRow = (HSSFRow) rowIter.next();
if(rowno !=0) {
Iterator<Cell> cellIter = myRow.cellIterator();
int colNum =0;
String sno="", date="", det="";
while (cellIter.hasNext()) {
HSSFCell myCell = (HSSFCell) cellIter.next();
if (colNum==0){
sno = myCell.toString();
}else if (colNum==1){
date = myCell.toString();
}else if (colNum==2){
det = myCell.toString();
}
colNum++;
Log.e("aaa", " Index :" + myCell.getColumnIndex() + " -- " + myCell.toString());
}
txtView.append( sno + " -- "+ date+ " -- "+ det+"\n");
}
rowno++;
}
} catch (Exception e) {
Log.e("aaa", "error "+ e.toString());
}
}
}
为了读取XLSX文件,请阅读Kamal Bunkar先生的评论:
首先要理解符号表示法。
XSSF(XML SpreadSheet Format)-用于读写Open Office XML(XLSX)格式文件。
HSSF(Horrible SpreadSheet Format)-用于读写Microsoft Excel(XLS)格式文件。
HWPF(Horrible Word Processor Format)-用于读写Microsoft Word 97(DOC)格式文件。
在我的教程中,我使用的是:
// Get the first sheet from workbook
HSSFSheet mySheet = myWorkBook.getSheetAt(0);
现在要使用 xlsx ,您应该使用这段代码。
File myFile = new File(“C:
FileInputStream fis = new FileInputStream(myFile);
XSSFWorkbook myWorkBook = new XSSFWorkbook (fis);
XSSFSheet mySheet = myWorkBook.getSheetAt(0);
Iterator rowIterator = mySheet.iterator();
while (rowIterator.hasNext())
{
Row row = rowIterator.next();
Iterator cellIterator = row.cellIterator();
while (cellIterator.hasNext()) {
Cell cell = cellIterator.next();
switch (cell.getCellType()) { case Cell.CELL_TYPE_STRING: System.out.print(cell.getStringCellValue() + “\t”);
break; case Cell.CELL_TYPE_NUMERIC:System.out.print(cell.getNumericCellValue() + “\t”);
break; case Cell.CELL_TYPE_BOOLEAN: System.out.print(cell.getBooleanCellValue() + “\t”);
break; default : }
}
System.out.println(“”);
}
显然需要适应Android文件位置...
希望能有所帮助...