Java:Apache POI Excel在10/20/30之后无序排序等

时间:2016-06-15 20:46:42

标签: java excel apache apache-poi rows

我目前正在开发一个项目,要求我将一些大量的输出写入excel电子表格,所以我决定使用Apache POI加快这个过程。但是,我发现过去10行的任何内容都会导致新行被放置在开头。即在第9行之后,第10行将转到电子表格的顶部并将其他所有内容向下推。即使使用TutorialsPoint中的示例文件也会出现这种情况,我将在下面进行介绍。

import java.io.File;
import java.io.FileOutputStream;
import java.util.Map;
import java.util.Set;
import java.util.TreeMap;
import org.apache.poi.ss.usermodel.Cell;
import org.apache.poi.xssf.usermodel.XSSFRow;
import org.apache.poi.xssf.usermodel.XSSFSheet;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;
public class Writesheet 
{
   public static void main(String[] args) throws Exception 
   {
      //Create blank workbook
      XSSFWorkbook workbook = new XSSFWorkbook(); 
      //Create a blank sheet
      XSSFSheet spreadsheet = workbook.createSheet( 
      " Employee Info ");
      //Create row object
      XSSFRow row;
      //This data needs to be written (Object[])
      Map < String, Object[] > empinfo = 
      new TreeMap < String, Object[] >();
      empinfo.put( "1", new Object[] { 
      "EMP ID", "EMP NAME", "DESIGNATION" });
      empinfo.put( "2", new Object[] { 
      "tp01", "Gopal", "Technical Manager" });
      empinfo.put( "3", new Object[] { 
      "tp02", "Manisha", "Proof Reader" });
      empinfo.put( "4", new Object[] { 
      "tp03", "Masthan", "Technical Writer" });
      empinfo.put( "5", new Object[] { 
      "tp04", "Satish", "Technical Writer" });
      empinfo.put( "6", new Object[] { 
      "tp05", "Krishna", "Technical Writer" });
       //Iterate over data and write to sheet
      Set < String > keyid = empinfo.keySet();
      int rowid = 0;
       for (String key : keyid)
       {
         row = spreadsheet.createRow(rowid++);
         Object [] objectArr = empinfo.get(key);
         int cellid = 0;
         for (Object obj : objectArr)
         {
            Cell cell = row.createCell(cellid++);
            cell.setCellValue((String)obj);
         }
      }
      //Write the workbook in file system
      FileOutputStream out = new FileOutputStream( 
      new File("Writesheet.xlsx"));
      workbook.write(out);
      out.close();
      System.out.println( 
      "Writesheet.xlsx written successfully" );
   }
}

以上是我提到的示例代码。如果您添加更多行(总数超过10的位置),电子表格将会出现故障。或者你可以使用for循环。

for(int i = 6; i < 20; i++){
  String num = Integer.toString(i);
  empinfo.put(num, new Object[] {"test", num});
}

原谅我,我绝不擅长编程艺术。如果有人可以提供帮助,我将非常感激!

1 个答案:

答案 0 :(得分:2)

问题是你使用带有字符串的TreeMap作为键。因此,一旦将键“10”添加到树形图中,顺序就会不同(可能是1,10,2,3,4 ......)。如果您更改树图以使用整数作为键,它将保持您期望的顺序。

有关字符串排序的更多信息:因为您的TreeMap是在没有比较器的情况下初始化的,所以它按照“自然”排序来命令它的键(请参阅https://docs.oracle.com/javase/tutorial/collections/interfaces/order.html)。字符串的“自然”排序并不是普通人所期望的(见Java String Number Comparator)。