使用Apache POI在循环中将数据打印到Excel单元格
问题描述:
我有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的人都可以帮助我解决这个问题?谢谢!
答
这里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
答
你建立你的数据集,这样的:
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"});
}
如果有,为什么你使用字符串,因为没有具体的原因关键当然。