Java 使用ApachePOI将数据写入Excel电子表格

Java 使用ApachePOI将数据写入Excel电子表格,java,excel,apache,Java,Excel,Apache,我有一个Java程序,可以使用ApachePOI将数据添加到Excel电子表格的新行中。我可以将前10行打印到电子表格中,但当我尝试打印第11行时,它会以某种方式在第一行上创建一个新行(不从上一个索引继续),如下所示: 11 Jane 300 //?? 12 Jane 300 //?? Emp No. Name Salary 1 Jane 300 2 Jane 300 3 Jane 300 4 Jane 300 5 Jan

我有一个Java程序,可以使用ApachePOI将数据添加到Excel电子表格的新行中。我可以将前10行打印到电子表格中,但当我尝试打印第11行时,它会以某种方式在第一行上创建一个新行(不从上一个索引继续),如下所示:

11  Jane    300   //??
12  Jane    300   //??
Emp No. Name    Salary
1   Jane    300
2   Jane    300
3   Jane    300
4   Jane    300
5   Jane    300
6   Jane    300
7   Jane    300
8   Jane    300
9   Jane    300
10  Jane    300
注意上面的11号和12号?我怎样修理它们?这是我的完整Java代码:

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("0", new Object[] {"Emp No.", "Name", "Salary"});

        for (int i=1;i<13;i++){

            data.put(i + "", new Object[] {i, "Jane", "300"}); //print in different rows
       }

        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 Integer) 
                    cell.setCellValue((Integer)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();
    }

    }

}
导入java.io.File;
导入java.io.FileNotFoundException;
导入java.io.FileOutputStream;
导入java.io.IOException;
导入java.sql.Date;
导入java.util.HashMap;
导入java.util.Map;
导入java.util.Set;
导入org.apache.poi.hssf.usermodel.HSSFSheet;
导入org.apache.poi.hssf.usermodel.HSSFWorkbook;
导入org.apache.poi.ss.usermodel.*;
公共类Excel{
公共静态void main(字符串[]args)引发异常{
HSSFWorkbook=新的HSSFWorkbook();
HSSFSheet sheet=workbook.createSheet(“样本表”);
映射数据=新的HashMap();
data.put(“0”,新对象[]{“Emp编号”,“名称”,“薪资”});

对于(inti=1;i),发生这种情况是因为您将行号放在HashMap中,而HashMap不会以有用的顺序返回它们

Map<String, Object[]> data = new HashMap<String, Object[]>();
data.put("0", new Object[] {"Emp No.", "Name", "Salary"});
Map data=newhashmap();
data.put(“0”,新对象[]{“Emp编号”,“名称”,“薪资”});
为什么这是一张地图? 最好使用

List<Object[]> rows = new ArrayList<>();
rows.add(new Object[] {"Emp No.", "Name", "Salary"});
List rows=new ArrayList();
添加(新对象[]{“Emp编号”、“名称”、“薪资”});
列表将按照您添加内容的顺序保存这些内容。

您的键集包含按顺序排列的数据

              [11, 12, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
尝试根据您的要求对这些数据进行排序