2016-03-03 43 views
1

我有Java程序,并且希望将数据输出到Excel电子表格中。我发现我可以使用Apache POI来实现这一点。我尝试使用发现的例子here,似乎一切正常。但是,我在示例程序中每次迭代(循环)时都无法在Excel中打印新行。使用Apache POI在循环中将数据打印到Excel单元格

这是我的计划:

import java.io.File; 
import java.io.FileNotFoundException; 
import java.io.FileOutputStream; 
import java.io.IOException; 
import java.sql.Date; 
import java.util.HashMap; 
import java.util.Map; 
import java.util.Set; 

import org.apache.poi.hssf.usermodel.HSSFSheet; 
import org.apache.poi.hssf.usermodel.HSSFWorkbook; 
import org.apache.poi.ss.usermodel.*; 

public class Excel { 

    public static void main(String[] args) throws Exception { 
     HSSFWorkbook workbook = new HSSFWorkbook(); 
     HSSFSheet sheet = workbook.createSheet("Sample sheet"); 

     Map<String, Object[]> data = new HashMap<String, Object[]>(); 
     data.put("1", new Object[] {"Emp No.", "Name", "Salary"}); 

     for (int i=0;i<5;i++){ 

      data.put("2", new Object[] {"5", "Jane", "300"}); 

     } 

     Set<String> keyset = data.keySet(); 
     int rownum = 0; 
     for (String key : keyset) { 
      Row row = sheet.createRow(rownum++); 
      Object [] objArr = data.get(key); 
      int cellnum = 0; 
      for (Object obj : objArr) { 
       Cell cell = row.createCell(cellnum++); 
       if(obj instanceof Date) 
        cell.setCellValue((Date)obj); 
       else if(obj instanceof Boolean) 
        cell.setCellValue((Boolean)obj); 
       else if(obj instanceof String) 
        cell.setCellValue((String)obj); 
       else if(obj instanceof Double) 
        cell.setCellValue((Double)obj); 
      } 
     } 

    try { 
     FileOutputStream out = 
       new FileOutputStream(new File("new.xls")); 
     workbook.write(out); 
     out.close(); 
     System.out.println("Excel written successfully.."); 

    } catch (FileNotFoundException e) { 
     e.printStackTrace(); 
    } catch (IOException e) { 
     e.printStackTrace(); 
    } 

    } 

} 

Supposely,我想要的输出是这样的:

EmpNo Name Salary 
5  Jane 300 
5  Jane 300 
5  Jane 300 
5  Jane 300 
5  Jane 300 

,但它始终只打印第一行中的Excel工作表。任何熟悉使用Apache POI的人都可以帮助我解决这个问题?谢谢!

回答

1

这里data.put("2", new Object[] {"5", "Jane", "300"}); “2” - >表示行数。所以总是更换排NUMBER2 所以不是试图

for (int i=2;i<7;i++){ 
     data.put(i + "", new Object[] {"5", "Jane", "300"}); 
    } 

,这意味着我将是动态的价值。你将有5行:d

1

你建立你的数据集,这样的:

data.put("1", new Object[] {"Emp No.", "Name", "Salary"}); 
    for (int i=0;i<5;i++){ 
     data.put("2", new Object[] {"5", "Jane", "300"}); 
    } 

我想你应该:

data.put(0, new Object[] {"Emp No.", "Name", "Salary"}); 
    for (int i=1;i<6;i++){ 
     data.put(i, new Object[] {"5", "Jane", "300"}); 
    } 

如果有,为什么你使用字符串,因为没有具体的原因关键当然。

相关问题