2013-12-16 79 views
1

我已經通過StackOverflow搜索,但沒有找到明確的答案給我的問題。我有一個簡單的2列和24行xlsx(excel)文件(稍後在這個文件將有更多的列和行,也最終會有不同的工作表)。從excel文件讀取數據

第一行是標題行:year = x和population = y,並且對於每個標題我想讀取下面的行。後來我想能夠使用這些信息來創建一個動態圖(x,y),所以我認爲我需要將x和y信息保存在變量中。以下是我的僞代碼。在主功能

public class Point { 
     int x; 
     int y; 

} 

創建

List<Point> allPoints = new List<Point>(); 

然後從Excel讀取點添加到這個列表

中做到這一點:

//Sheet Pop 

final String POP = "Pop"; 
int startRowHeader = 1,  
    startRowNumeric = 2,  
    startColNumeric = 1, 
    nrOfCols = 0, 
    nrOfRows = 0; 

int nrOfSheets = excelFile.getWorkbook().getNumberOfSheets(); 
org.apache.poi.ss.usermodel.Sheet sheet1 = excelFile.getWorkbook().getSheetAt(0); 
String[] sheets = {POP}; 
boolean sheetExists; 
String activeSheet = ""; 

nrOfCols = sheet1.getRow(0).getLastCellNum(); 
nrOfRows = excelFile.getLastRowNum(POP); 

try { 

    for (String sheet : sheets) { 
     sheetExists = false; 
     for (int sheetIndex = 0; sheetIndex < nrOfSheets; sheetIndex++) { 
     if (sheet.equalsIgnoreCase(excelFile.getWorkbook().getSheetName(sheetIndex))) { 
       SheetExists = true; 
      } 
     } 
     if (!sheetExists) { 
      throw new Exception("Sheet " + sheet + " is missing!"); 
     } 
    } 


    //Take off! 

    // Sheet Pop 
    activeSheet = sheets[0]; 

    for(int j=0; j < nrOfCols; j++) { 
     for(int i=0; i<nrofRows; i++) { 
      column[i] = (int)excelFile.getCellNumericValue(POP, startRowNumeric, startColNumeric); 
     } 
    } 

} catch (Exception e) { 
    traceln(" ..... "); 
    traceln("Error in sheet: " + activeSheet); 
    traceln("Message: " + e.getMessage()); //Write out in console 
} 
+0

究竟是什麼問題了嗎?你是否得到例外? – gaurav5430

+0

@ gaurav5430。我不知道應該在哪裏保存excel文件中的數據,以便在我想繪製動態圖時使用它作爲變量。另外,如何獲得每列的單元格值?標題年的所有年份以及標題人口中每年的人口數是多少? – user2481390

+0

如何使用2d數組或Point類的數組(一個用int x annd int y作爲成員的自定義類)? – gaurav5430

回答

1

創建一個新類一個循環

Point p = new Point(); 
p.x = xCoordinateFromExcel; 
p.y = yCoordinateFromExcel; 

allPoints.add(p); 

也考慮添加構造函數和getter/setters到你的Point類。

您也可以直接使用java.awt中可用的Point類。 http://docs.oracle.com/javase/7/docs/api/java/awt/Point.html

編輯:關於取值從Excel 這是我從你的問題理解 你有24行2列 第一列具有X,第二列具有Y值

,所以你可以這樣做這樣的事情在一個循環

for(int i=0;i<24;i++){ 
    Row row = sheet.getRow(i);  
    Cell cellX = row.getCell(1); 
    Cell cellY = row.getCell(2); 

//assign to point class 
... 
} 

不要忘記它解析爲int,或使用getNumericCellValue() http://poi.apache.org/apidocs/org/apache/poi/ss/usermodel/Cell.html#getNumericCellValue()

+0

'java.util.List'是一個接口,你不能實例化它...行應閱讀'List allPoints = new ArrayList ();' – Samy

+0

@Samy我怎麼會讀入這個數組列表中的數據?也就是說,如何獲得每列的每個單元格值(標題下方)? – user2481390

+0

那麼你的問題是雙重的:解析Excel文件並將值存儲在你的程序中。這回答了存儲部分。關於Excel解析,你可以試試'Apache POI HSSF'(代表可怕的擴展表格格式!我喜歡它) – Samy

0

您可以使用java.awt.geom.Point2D.Double

一個java.util.ArrayList聲明列表:

ArrayList<Point2D.Double> points = new ArrayList<>(); 

然後爲每一行:

// Read x 
// Read y 
Point2D.Double p = new Point2D.Double(x, y); 
/// And add to the list: 
points.add(p); 
+0

Point2D.double給了我雙打的數組列表。我可以將列表中的數字改爲整數嗎? – user2481390

+0

要麼將​​這些值轉換爲整數,要麼編寫一個自定義整數類(最好是對子類java.awt.Point進行分類以繼承所有功能) – Samy