[英]How to read xlsx file using POI?
我使用 POI HSSF 讀取了 xls 文件,一切正常。 但是我沒有學會如何讀取輸入文件xlsx。 之前沒用過xlsx,看了網絡上不同資源上的資料,除了用XSSF替換HSSF並額外連接外,沒發現有什么區別。 圖書館。 但是,它會引發錯誤:
線程“main”中的異常 java.lang.NoSuchMethodError: org.apache.poi.util.XMLHelper.newDocumentBuilder() Ljavax/xml/parsers/DocumentBuilder;
發誓
XSSFWorkbook wb = new XSSFWorkbook (p_file);
def res = SSC.execute (connection, file, "test.xlsx")
代碼如下(如果有人能幫忙解決現在/上“;”的問題,我將不勝感激,不要關注,因為我用的是groovy,其余的和java類似):
import groovy.sql.Sql
import org.apache.poi.xssf.usermodel.XSSFCell
import javax.xml.soap.Text
import java.sql.Blob
import java.sql.Connection
import java.sql.DriverManager
import org.apache.poi.ss.usermodel.*
import org.apache.poi.hssf.usermodel.*
import org.apache.poi.xssf.usermodel.XSSFWorkbook; //New imports to read XLSX format
import org.apache.poi.xssf.usermodel.XSSFSheet; //New imports to read XLSX format
import org.apache.poi.ss.usermodel.*;
import java.util.Iterator;
import java.io.*;
class XM_PARSE_XLS {
def execute(Connection conn, InputStream p_file, String p_filename) {
Sql sql = new Sql(conn)
XSSFWorkbook wb = new XSSFWorkbook(p_file);
ArrayList<HashMap<String, String>> arrAllData = new ArrayList<HashMap<String, String>>();
String strsql
Integer cntStr = 0
HashSet rw_okpo = new HashSet();
// идем по листам в файле
wb.each { XSSFSheet myExcelSheet ->
DataFormatter formatter = new DataFormatter(Locale.ROOT);
// идем по страницам файла
myExcelSheet.each{ Row myrow ->
HashMap<String, String> hm = new HashMap<String, String>();
if (cntStr >= 0) {
// идем по строкам с данными
Integer numCell = 0;
String typ = '';
myrow.each { Cell mycell ->
String value = ""; // приводит любые ячейки к строковому формату
// если тип Строка
if (mycell.getCellType() == XSSFCell.CELL_TYPE_STRING) {
value = mycell.getStringCellValue();
typ = 'S'
// если тип число
} else {
// а для числовых ячеек или ячеек даты значение будет отформатировано на основе правил форматирования / стиля, примененных к ячейке, а затем возвращено как строка
value = formatter.formatCellValue(mycell);
value = value.replace(',','');
typ = 'N'
if (cntStr >= 0){
switch(numCell) { //0-17
case 0:
hm.put("t0", value + ";");
break;
case 1:
hm.put("t1", value + ";");
break;
case 2:
hm.put("t2", value + ";");
break;
case 3:
hm.put("t3", value + ";");
break;
case 4:
hm.put("t4", value + ";");
break;
case 5:
hm.put("t5", value + ";");
break;
case 6:
hm.put("t6", value + ";");
break;
case 7:
hm.put("t7", value + ";");
break;
case 8:
hm.put("t8", value + ";");
break;
case 9:
hm.put("t9", value + ";");
break;
case 10:
hm.put("t10", value + ";");
break;
case 11:
hm.put("t11", value + ";");
break;
case 12:
hm.put("t12", value + ";");
break;
case 13:
hm.put("t13", value + ";");
break;
case 14:
hm.put("t14", value + ";");
break;
case 15:
hm.put("t15", value + ";");
break;
case 16:
hm.put("t16", value + ";");
break;
case 17:
hm.put("t17", value + "\r\n");
break;
}
numCell = numCell + 1;
}
}
}
if(hm) arrAllData.add(hm);
cntStr = cntStr + 1;
}
}
return res;
}
static void main(String... args) {
Class.forName("oracle.jdbc.driver.OracleDriver")
//Connection connection = DriverManager.getConnection("jdbc:oracle:thin:@10.193.21.75:3333/OLAP2", "LAS", "ASfDER7F4FA")
connection.setAutoCommit(true)
try {
def file = new File("test.xlsx").newInputStream()
def SSC = new XM_PARSE_XLS()
def res = SSC.execute(connection,file,"test.xlsx")
} finally {
connection.close()
}
}
}
如果代碼運行時使用的庫版本不同於編譯時使用的庫版本,則會在運行時發生NoSuchMethodError
。
這里的代碼可能是使用apache poi 4.1.2
編譯的,但在運行時使用了較低版本的apache poi
。
方法public static DocumentBuilder newDocumentBuilder()
是在apache poi 4.1.2
org.apache.poi.util.XMLHelper
中引入的。 它在較低版本中不存在。
還要確保您沒有混合不同的apache poi
版本。 這不受支持,也可能導致此類錯誤,因為不同的版本也導出不同版本的方法。 請參閱常見問題解答-N10204 。
也許較低版本的apache poi
類也來自其他庫。 您可以詢問ClassLoader
一個特殊的類(在您的例子中是org.apache.poi.util.XMLHelper
)在運行時來自哪里:
...
ClassLoader classloader = org.apache.poi.util.XMLHelper.class.getClassLoader();
java.net.URL res = classloader.getResource("org/apache/poi/util/XMLHelper.class");
String path = res.getPath();
System.out.println("XMLHelper came from " + path);
...
如果這不是您期望的jar
,您至少可以了解其他圖書館也提供該類。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.