2013-04-09 54 views
1

我使用APACHE POI從excel文件中讀取數據。我想將它們存儲在列表中(如c中的列表),因爲之後我會嘗試將它們存儲在僅調用list [0],list [1]的mysql數據庫中。我會嘗試做的是使這個列表,並在我將使用jdbc驅動程序,並給這個列表在MySQL中的表。 用於讀取Excel文件中的代碼是上述:使用java讀取excel後在列表中存儲數據

import java.io.FileInputStream; 
import java.io.IOException; 
import java.util.ArrayList; 
import java.util.Iterator; 
import java.util.List; 

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.ss.usermodel.Cell; 

public class readexcel{ 

@SuppressWarnings({ 「未選中」, 「選中」}) 公共靜態無效的主要(字串[] args)拋出異常{

// 
// An excel file name. You can create a file name with a full 
// path information. 
// 
String filename = "C:\\Users\\xxx\\Documents\\test.xls"; 

// 
// Create an ArrayList to store the data read from excel sheet. 
// 
List sheetData = new ArrayList(); 
FileInputStream fis = null; 
try { 
// 
// Create a FileInputStream that will be use to read the 
// excel file. 
// 
fis = new FileInputStream(filename); 

// 
// Create an excel workbook from the file system. 
// 
HSSFWorkbook workbook = new HSSFWorkbook(fis); 
// 
// Get the first sheet on the workbook. 
// 
HSSFSheet sheet = workbook.getSheetAt(0); 

// 
    // When we have a sheet object in hand we can iterator on 
// each sheet's rows and on each row's cells. We store the 
// data read on an ArrayList so that we can printed the 
// content of the excel to the console. 
// 
Iterator rows = sheet.rowIterator(); 
while (rows.hasNext()) { 
HSSFRow row = (HSSFRow) rows.next(); 
Iterator cells = row.cellIterator(); 

List data = new ArrayList(); 
while (cells.hasNext()) { 
HSSFCell cell = (HSSFCell) cells.next(); 
data.add(cell); 
} 

sheetData.add(data); 
} 
} catch (IOException e) { 
e.printStackTrace(); 
} finally { 
if (fis != null) { 
fis.close(); 
} 
} 

showExcelData(sheetData); 
    } 

private static void showExcelData(List sheetData) { 
    // 
    // Iterates the data and print it out to the console. 
    // 
for (int i = 0; i < sheetData.size(); i++) { 
List list = (List) sheetData.get(i); 
for (int j = 0; j < list.size(); j++) { 
Cell cell = (Cell) list.get(j); 
if (cell.getCellType() == Cell.CELL_TYPE_NUMERIC) { 
System.out.print(cell.getNumericCellValue()); 
} else if (cell.getCellType() == Cell.CELL_TYPE_STRING) { 
System.out.print(cell.getRichStringCellValue()); 
} else if (cell.getCellType() == Cell.CELL_TYPE_BOOLEAN) { 
System.out.print(cell.getBooleanCellValue()); 
} 
if (j < list.size() - 1) { 
System.out.print(", "); 
} 
} 
System.out.println(""); 
} 
} 
} 

我需要添加什麼才能解釋你?

+1

這是什麼問題? – Vitaly 2013-04-09 12:44:31

+1

你能解釋你的問題嗎?據我所見,你已經有了你的數據在列表中,那麼你的問題是什麼步驟? – redc0w 2013-04-09 12:45:13

+0

閱讀excel文件後,我想將數據存儲在mysql中。將給出數據庫的名稱,但在這個數據庫中,每個excel文件將是一個表。我的目的是當我創建表給出了合適的命令來讀取它讀取excel文件之前讀取的值! – user2235454 2013-04-09 13:07:42

回答

1

在開始迭代工作表之前初始化數組列表的方式, 數組列表必須有一個作用域以保留在Excel工作表的行和列迭代中的任何位置。

ArrayList myList = new ArrayList() 

的把這些線的單元迭代循環內正在被執行了N行的基礎

if (cell.getCellType() == Cell.CELL_TYPE_NUMERIC) 
{ 
System.out.print(cell.getNumericCellValue()); 
myList.add(cell.getNumericCellValue()); 
} 
else if (cell.getCellType() == Cell.CELL_TYPE_STRING) 
{ 
System.out.print(cell.getRichStringCellValue()); 
myList.add(cell.getRichStringCellValue()); 
} 
else if (cell.getCellType() == Cell.CELL_TYPE_BOOLEAN) 
{ 
System.out.print(cell.getBooleanCellValue()); 
myList.add(cell.getBooleanCellValue()); 
} 

現在你處理這個名單到您的數據庫中插入數據

+0

我會把這個放在哪裏? – user2235454 2013-04-09 13:01:56

+0

@ user2235454:請參閱編輯 – 2013-04-10 01:20:03

1

我發現這個功能可用

public static ArrayList<ArrayList<String>> GetExcelTableInto2DArrayListString(String excelFile, boolean debug){ 

    ArrayList<ArrayList<String>> OUT = new ArrayList<ArrayList<String>>(); 
     File myFile = new File(excelFile); 
     FileInputStream fis = null; 
     try { 
      fis = new FileInputStream(myFile); 
     } catch (FileNotFoundException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } 

     // Finds the workbook instance for XLSX file 
     XSSFWorkbook myWorkBook = null; 
     try { 
      myWorkBook = new XSSFWorkbook (fis); 
     } catch (IOException e) { 
      e.printStackTrace(); 
     } 

     // Return first sheet from the XLSX workbook 
     XSSFSheet mySheet = myWorkBook.getSheetAt(0); 

     // Get iterator to all the rows in current sheet 
     Iterator<Row> rowIterator = mySheet.iterator(); 

     // Traversing over each row of XLSX file 
     int count=1; 
     while (rowIterator.hasNext()) { 
      Row row = rowIterator.next(); 
      ArrayList<String> InnerArray = new ArrayList<String>() ; 
      if(debug)System.out.print(count + ". \t"); 
     // For each row, iterate through each columns 
      Iterator<Cell> cellIterator = row.cellIterator(); 

      while (cellIterator.hasNext()) { 

       Cell cell = cellIterator.next(); 

       switch (cell.getCellType()) { 
       case Cell.CELL_TYPE_STRING: 
        String c = cell.getStringCellValue(); 
        if(debug)System.out.print(c + "\t"); 
        InnerArray.add(c); 
        break; 
       case Cell.CELL_TYPE_NUMERIC: 
        int n = (int) cell.getNumericCellValue(); 
        if(debug)System.out.print(n + "\t"); 
        InnerArray.add(String.valueOf(n)); 
        break; 
       case Cell.CELL_TYPE_BOOLEAN: 
        boolean b = cell.getBooleanCellValue(); 
        if(debug)System.out.print(b + "\t"); 
        InnerArray.add(String.valueOf(b)); 
       break; 
       default : 
        } 
       } 
      if(debug)System.out.println(""); 
      OUT.add(InnerArray); 
      count++; 
      } 

    return OUT; 
} 

+0

請看你的代碼是否擴展,你可以解釋一下主要部分? – acostela 2017-02-09 10:52:48

+0

我只需要抓住excel(xlsx)單元格的行,並將結果放入2D String ArrayList中。對我很好。 – xyshio 2017-02-10 11:45:14

0

請看下面的代碼

public List<ArrayList<String>> readExcelData2(String excelFile) throws IOException { 

    List<ArrayList<String>> depts = new ArrayList<ArrayList<String>>(); 

    FileInputStream excelFileToRead = new FileInputStream(new File(excelFile)); 

    XSSFWorkbook wb = new XSSFWorkbook(excelFileToRead); 

    XSSFSheet sheet = wb.getSheetAt(0); 

    XSSFRow row; 
    XSSFCell cell; 
    int maxDataCount = 0; 

    Iterator<Row> rows = sheet.rowIterator(); 

    while (rows.hasNext()) { 
     row = (XSSFRow) rows.next(); 
     // skip the first row because it will be header 
     if (row.getRowNum() == 0) { 
      maxDataCount = row.getLastCellNum(); 
      continue; 
     } 

     // if the row is empty stop the loop, do not go further 
     if (this.isRowEmpty(row, maxDataCount)) { 
      // exit processing 
      break; 
     } 

     // define arraylist object to store list of departments of each row 
     ArrayList<String> innerArrayList = new ArrayList<String>(); 

     for (int cn = 0; cn < maxDataCount; cn++) { 
      cell = row.getCell(cn, Row.CREATE_NULL_AS_BLANK); 

      switch (cell.getCellType()) { 
      case Cell.CELL_TYPE_STRING: 
       innerArrayList.add(cell.getStringCellValue()); 
       break; 
      case Cell.CELL_TYPE_NUMERIC: 
       innerArrayList.add(String.valueOf(cell.getNumericCellValue())); 
       break; 

      default: 
       innerArrayList.add(cell.getStringCellValue()); 
       break; 
      } 

     } 
     depts.add(innerArrayList); 

    } 
    return depts; 
} 

public boolean isRowEmpty(Row row, int lastCellNo) { 
    for (int c = row.getFirstCellNum(); c < lastCellNo; c++) { 
     Cell cell = row.getCell(c, Row.CREATE_NULL_AS_BLANK); 
     if (cell != null && cell.getCellType() != Cell.CELL_TYPE_BLANK) { 
      return false; 
     } 
    } 
    return true; 
} 
相關問題