![](/img/trans.png)
[英]How to populate an Excel sheet with the data from an arraylist using Apache POI
[英]Adding data to ArrayList while reading data from Excel using POI Apache
我正在嘗試使用 POI Apache 從 Excel 工作表中讀取數據。 我遇到的問題是我想同時讀取一行的所有單元格的數據並將其存儲在類型類的 ArrayList 中,但輸出只是逐個單元格的。
這是打開 excel 表並逐個單元格讀取數據的類。
package testing;
import javax.swing.JFileChooser;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.Map;
import java.util.Set;
import java.util.TreeMap;
import org.apache.poi.ss.usermodel.Cell;
import org.apache.poi.ss.usermodel.Row;
import org.apache.poi.ss.usermodel.Sheet;
import org.apache.poi.ss.usermodel.Workbook;
import org.apache.poi.xssf.usermodel.XSSFSheet;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;
public class ReadExcelDemo
{
ArrayList<Data> list = new ArrayList<>();
String path;
public ReadExcelDemo(String path)
{
this.path = path;
try
{
FileInputStream file = new FileInputStream(new File(path));
//Create Workbook instance holding reference to .xlsx file
XSSFWorkbook workbook = new XSSFWorkbook(file);
//Get first/desired sheet from the workbook
XSSFSheet sheet = workbook.getSheetAt(0);
System.out.println("");
//Iterate through each rows one by one
Iterator<Row> rowIterator = sheet.iterator();
while (rowIterator.hasNext())
{
Row row = rowIterator.next();
//For each row, iterate through all the columns
Iterator<Cell> cellIterator = row.cellIterator();
while (cellIterator.hasNext())
{
Cell cell = cellIterator.next();
//Check the cell type and format accordingly
switch (cell.getCellType())
{
case Cell.CELL_TYPE_NUMERIC:
System.out.print(cell.getNumericCellValue() + "\t");
break;
case Cell.CELL_TYPE_STRING:
System.out.print(cell.getStringCellValue() + "\t");
break;
}
}
System.out.println("");
}
file.close();
}
catch (Exception e)
{
e.printStackTrace();
}
}
}
數據類
package testing;
public class Data {
int ID;
String F_Name,L_Name;
public Data(int ID, String F_Name, String L_Name) {
this.ID = ID;
this.F_Name = F_Name;
this.L_Name = L_Name;
}
public int getID() {
return ID;
}
public String getF_Name() {
return F_Name;
}
public String getL_Name() {
return L_Name;
}
我想像這樣一次在 Arraylist 中添加單元格數據
List.add(new Data(1,"Amit","shukla"));
但是迭代器返回的數據是一個接一個,首先它輸出1 ,然后是amit ,然后是shukla ,這真的很難添加到 arraylist
我試圖在一行中向 ArrayList 添加數據,但我做不到。 如果你能幫我解決這個問題,那將非常有幫助。
this.path = 路徑;
try
{
FileInputStream file = new FileInputStreaHashMap<K, V>ile(path));
HashMap<Integer, Data> mp= new HashMap<Integer, Data>();
//Create Workbook instance holding reference to .xlsx file
XSSFWorkbook workbook = new XSSFWorkbook(file);
//Get first/desired sheet from the workbook
XSSFSheet sheet = workbook.getSheetAt(0);
System.out.println("");
//Iterate through each rows one by one
Iterator<Row> rowIterator = sheet.iterator();
while (rowIterator.hasNext())
{
Row row = rowIterator.next();
//For each row, iterate through all the columns
Iterator<Cell> cellIterator = row.cellIterator();
while (cellIterator.hasNext())
{
Cell cell = cellIterator.next();
//Check the cell type and format accordingly
int i=0;
int j=0;
switch (cell.getCellType())
{
case Cell.CELL_TYPE_NUMERIC:
System.out.print(cell.getNumericCellValue() + "\t");
i=Integer.parseInt(cell.getNumericCellValue());
Data d= new Data();
d.setId(cell.getNumericCellvalue());
break;
case Cell.CELL_TYPE_STRING:
System.out.print(cell.getStringCellValue() + "\t");
if( j==0){
Data data= mp.get(i);
data.setName(cell.getStringCellValue());
mp.put(i, data);
j=j+1;
}
else
{
Data data= mp.get(i);
data.setLastName(cell.getStringCellValue());
mp.put(i, data);
j=0;
}
break;
}
}
System.out.println("");
}
List<Data> dataList= new ArrayList<Data>();
for (Data d : mp.values()) {
dataList.add(d);
}
file.close();
}
catch (Exception e)
{
e.printStackTrace();
}
您可以使用此功能通過單次迭代添加單行 Excel 工作表,
public void ReadExcel(String filePath,String fileName,String sheetName) throws InterruptedException, IOException{
File file = new File(filePath+"\\"+fileName);
//Create an object of FileInputStream class to read excel file
FileInputStream inputStream = new FileInputStream(file);
Workbook AddCatalog = null;
//Find the file extension by splitting file name in substring and getting only extension name
String fileExtensionName = fileName.substring(fileName.indexOf("."));
//Check condition if the file is a .xls file or .xlsx file
if(fileExtensionName.equals(".xls")){
//If it is .xls file then create object of HSSFWorkbook class
AddCatalog = new HSSFWorkbook(inputStream);
}
else if(fileExtensionName.equals(".xlsx")){
//If it is .xlsx file then create object of XSSFWorkbook class
AddCatalog = new XSSFWorkbook(inputStream);
}
//Read sheet inside the workbook by its name
Sheet AddCatalogSheet = AddCatalog.getSheet(sheetName);
//Find number of rows in excel file
int rowcount = AddCatalogSheet.getLastRowNum()- AddCatalogSheet.getFirstRowNum();
System.out.println("Total row number: "+rowcount);
for(int i=1; i<rowcount+1; i++){
//Create a loop to get the cell values of a row for one iteration
Row row = AddCatalogSheet.getRow(i);
List<String> arrName = new ArrayList<String>();
for(int j=0; j<row.getLastCellNum(); j++){
// Create an object reference of 'Cell' class
Cell cell = row.getCell(j);
// Add all the cell values of a particular row
arrName.add(cell.getStringCellValue());
}
System.out.println(arrName);
System.out.println("Size of the arrayList: "+arrName.size());
// Create an iterator to iterate through the arrayList- 'arrName'
Iterator<String> itr = arrName.iterator();
while(itr.hasNext()){
System.out.println("arrayList values: "+itr.next());
}
}
}
您在Switch 和 Case部分更改時遇到問題應該可以:
switch (cell.getCellType()) {
case NUMERIC:
System.out.print(cell.getNumericCellValue() + "\t");
break;
case STRING:
System.out.print(cell.getStringCellValue() + "\t");
break;
}
實現此目的的最簡單方法如下
你可以參考下面的代碼
//declare list of column headers in the excel file
List<String> header = new ArrayList<>(Arrays.asList("ID","FirstName","LastName"));
//list for holding each row of data as list of custom objects
List<CustomObject> rawDataList = new ArrayList<>();
while (rowIterator.hasNext()) {
Row row = rowIterator.next();
//map for holding cell values of current row as key value pair
Map<String, String> rowDataMap = new HashMap<>();
Cell cell;
for (int k = 0; k < row.getLastCellNum(); k++) {
if (null != (cell = row.getCell(k))) {
switch (cell.getCellType()) {
case NUMERIC:
//Get the column name from header array and push the cell value into hashmap
rowDataMap.put(header.get(k),NumberToTextConverter.toText(cell.getNumericCellValue()));
break;
case STRING:
//Get the column name from header array and push the cell value into hashmap
rowDataMap.put(header.get(k), cell.getStringCellValue());
break;
}
}
}
//create object of jackson object mnapper (Better configure as a bean)
ObjectMapper mapper = new ObjectMapper()
.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
mapper.configure(DeserializationFeature.ACCEPT_SINGLE_VALUE_AS_ARRAY, true);
mapper.configure(DeserializationFeature.ACCEPT_EMPTY_ARRAY_AS_NULL_OBJECT, true);
// after reading all the cells of current row map the hashmap into
//custom pojo class using object mapper
CustomObject rawData = mapper.convertValue(rowDataMap, CustomObject.class);
//add the cusom pojo object into the list
rawDataList.add(rawData);
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.