【问题标题】:Java: Apache POI Excel Rows out of order past 10/20/30 etcJava:Apache POI Excel 行在 30 年 10 月 20 日之后乱序等
【发布时间】:2016-06-15 20:46:42
【问题描述】:

我目前正在从事一个项目,该项目需要我将我的一些庞大的输出写入 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});
}

请原谅,我对编程艺术一窍不通。如果有人可以提供帮助,我将不胜感激!

【问题讨论】:

    标签: java excel apache apache-poi rows


    【解决方案1】:

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

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

    【讨论】:

    • 谢谢!纯粹出于好奇,导致这种情况发生的字符串是什么?或者你能指导我去哪里学习吗?
    • @user3552844 - 我在答案中添加了更多内容。这有帮助吗?
    猜你喜欢
    • 2020-03-20
    • 2015-07-11
    • 2022-08-04
    • 2017-07-04
    • 1970-01-01
    • 2019-06-15
    • 2017-03-13
    • 1970-01-01
    • 2022-08-05
    相关资源
    最近更新 更多