微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

读取XSSF工作簿.xlsx会使Android应用崩溃

如何解决读取XSSF工作簿.xlsx会使Android应用崩溃

问题::我正在尝试读取XLSX文件获取输入值。该代码适用于XLS,但应用程序因XLSX文件而崩溃。但是hssf和XSSF的实现似乎大致相同。下面是记录的错误

到目前为止::尝试了许多SO答案。下载并随附以下罐子。但仍然没有区别。

xmlbeans-3.1.0.jar
poi-ooxml-4.1.0.jar
poi-ooxml-schemas-4.1.0.jar  
commons-compress-1.18.jar
curvesapi-1.06.jar
poi-4.1.0.jar
commons-codec-1.12.jar
commons-collections4-4.3.jar
commons-math3-3.6.1.jar

代码

if (GetFileExtension(FilePath).equals(".xls")) {

       wb = new hssfWorkbook(inStream);
       sheet1 = wb.getSheetAt(0);
       Formeval = new hssfFormulaEvaluator((hssfWorkbook) wb);

}else if (GetFileExtension(FilePath).equals(".xlsx")) {
   
       wb = new XSSFWorkbook(inStream);
       sheet1 = wb.getSheetAt(0);
       Formeval = new XSSFFormulaEvaluator((XSSFWorkbook) wb);
}

错误日志:

    Process: com.example.newtest,PID: 14295
    java.lang.BootstrapMethodError: Exception from call site #238 bootstrap method
        at org.apache.poi.openxml4j.opc.PackagePartCollection.<init>(PackagePartCollection.java:47)
        at org.apache.poi.openxml4j.opc.ZipPackage.getPartsImpl(ZipPackage.java:241)
        at org.apache.poi.openxml4j.opc.OPCPackage.getParts(OPCPackage.java:732)
        at org.apache.poi.openxml4j.opc.OPCPackage.open(OPCPackage.java:310)
        at org.apache.poi.ooxml.util.PackageHelper.open(PackageHelper.java:47)
        at org.apache.poi.xssf.usermodel.XSSFWorkbook.<init>(XSSFWorkbook.java:309)
        at com.example.newtest.DNsuper.onActivityResult(DNsuper.java:963)
        at android.app.Activity.dispatchActivityResult(Activity.java:7276)
        at android.app.ActivityThread.deliverResults(ActivityThread.java:4264)
        at android.app.ActivityThread.handleSendResult(ActivityThread.java:4312)
        at android.app.ActivityThread.-wrap19(UnkNown Source:0)
        at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1644)
        at android.os.Handler.dispatchMessage(Handler.java:106)
        at android.os.Looper.loop(Looper.java:164)
        at android.app.ActivityThread.main(ActivityThread.java:6494)
        at java.lang.reflect.Method.invoke(Native Method)
        at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:438)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:807)
     Caused by: java.lang.NoClassDefFoundError: Invalid descriptor: AFTER.
        at org.apache.poi.openxml4j.opc.PackagePartCollection.<init>(PackagePartCollection.java:47) 
        at org.apache.poi.openxml4j.opc.ZipPackage.getPartsImpl(ZipPackage.java:241) 
        at org.apache.poi.openxml4j.opc.OPCPackage.getParts(OPCPackage.java:732) 
        at org.apache.poi.openxml4j.opc.OPCPackage.open(OPCPackage.java:310) 
        at org.apache.poi.ooxml.util.PackageHelper.open(PackageHelper.java:47) 
        at org.apache.poi.xssf.usermodel.XSSFWorkbook.<init>(XSSFWorkbook.java:309) 
        at com.example.newtest.DNsuper.onActivityResult(DNsuper.java:963) 
        at android.app.Activity.dispatchActivityResult(Activity.java:7276) 
        at android.app.ActivityThread.deliverResults(ActivityThread.java:4264) 
        at android.app.ActivityThread.handleSendResult(ActivityThread.java:4312) 
        at android.app.ActivityThread.-wrap19(UnkNown Source:0) 
        at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1644) 
        at android.os.Handler.dispatchMessage(Handler.java:106) 
        at android.os.Looper.loop(Looper.java:164) 
        at android.app.ActivityThread.main(ActivityThread.java:6494) 
        at java.lang.reflect.Method.invoke(Native Method) 
        at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:438) 
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:807) 

解决方法

Apache POI与Google的Android之间存在兼容性问题(长期待解决的情况-经过数周的研究后才知道),这使得XSSF [.XLSX]读起来很复杂,但HSSF(.XLS)读起来并不复杂。向后移植到以前的库可解决此问题。

库-依赖项:[JAVA Jars-GRADLE-MAVEN]使用以下版本,并忽略更新消息。

对于格拉德:将其保留在build.gradle(:app)

implementation "org.apache.poi:poi:3.10-FINAL"
    implementation "org.apache.poi:poi-ooxml:3.10-FINAL"
    implementation "org.apache.poi:poi-ooxml-schemas:3.10-FINAL"
    implementation group: 'org.apache.xmlbeans',name: 'xmlbeans',version: '2.3.0'
    implementation group: 'stax',name: 'stax-api',version: '1.0.1'
    implementation group: 'commons-codec',name: 'commons-codec',version: '1.5'
    implementation group: 'xml-apis',name: 'xml-apis',version: '1.0.b2'
    implementation group: 'dom4j',name: 'dom4j',version: '1.6.1'
    implementation group: 'org.apache.httpcomponents',name: 'httpclient-android',version: '4.3.5.1'

.XLSX和.XLS Reader:(即分别是XSSF和HSSF工作簿)

import android.content.ContentValues;
import android.util.Log;
import androidx.appcompat.app.AppCompatActivity;
import org.apache.poi.ss.usermodel.Cell;
import org.apache.poi.ss.usermodel.Row;
import org.apache.poi.ss.usermodel.Sheet;
import java.util.Iterator;

public class Import2SQLite extends AppCompatActivity {
    
    public static final String DNN = "DO";// 0 text(String)
    public static final String ITT = "IT";// 1 integer
    public static final String DNQ = "DN";// 2 text(String)
   
    
    public static void ExcelToSqlite(ActiononDB dbAdapter,Sheet sheet) {

      
        for (Iterator<Row> rit = sheet.rowIterator();
             rit.hasNext(); ) {
            Row row = rit.next();

            ContentValues contentValues = new ContentValues();

            row.getCell(0,Row.CREATE_NULL_AS_BLANK ).setCellType(Cell.CELL_TYPE_STRING);
            row.getCell(1,Row.CREATE_NULL_AS_BLANK).setCellType(Cell.CELL_TYPE_STRING);
            row.getCell(2,Row.CREATE_NULL_AS_BLANK).setCellType(Cell.CELL_TYPE_STRING);
            

            contentValues.put(DNN,row.getCell(0,Row.CREATE_NULL_AS_BLANK).getStringCellValue());
            contentValues.put(ITT,row.getCell(1,Row.CREATE_NULL_AS_BLANK).getStringCellValue());
            contentValues.put(DNQ,row.getCell(2,Row.CREATE_NULL_AS_BLANK).getStringCellValue());
                   
            try {
                if (dbAdapter.insert("Usertypes",contentValues) < 0) {
                    return;
                }

            } catch (Exception ex) {
                Log.d("Exception in importing",ex.getMessage());
            }
        }

    }
}

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。