java - Apache POI 和 HashMap 以错误的顺序打印

标签 java excel hashmap apache-poi

我正在构建一个程序,使用 Apache POI 将信息打印到 .xlsx 文件中,它似乎工作得很好,但是当我在打印输出过程中添加了更多行时,出现了问题。我使用带有整数键和字符串对象数组的 HashMap 来存储信息,然后将其写入 Excel 文件。一切都运行良好,直到出现带有键 17 的行。程序开始混合行并按顺序打印它们。这是代码,下面是它的打印结果。请注意第 17 行和第 18 行如何混合以及如何省略 2 个空行。我错过了什么可能导致这种疯狂?谢谢大家!

            XSSFWorkbook workbook = new XSSFWorkbook();
            XSSFSheet sheet = workbook.createSheet("Estimate");

            //Create a new row in current sheet
            Row row = sheet.createRow(0);

            //Create a new cell in current row
            Cell cell = row.createCell(0);

            //Set value to new value
            cell.setCellValue("");



            Map<Integer, Object[]> 
            data = new HashMap<Integer, Object[]>();
            data.put(0, new Object[] {"", "SIZE 1 (in inches)", "SIZE 2 (in inches)", "PRICE"});
            data.put(1, new Object[] {"P-BOARD:" });
            data.put(2, new Object[] {""});
            data.put(3, new Object[] {"","AMOUNT PER SQFT", "COUNT", "PRICE"});
            data.put(4, new Object[] {"SCREWS:"});
            data.put(5, new Object[] {""});
            data.put(6, new Object[] {"", "PRICE 50 lb BAG", "PRICE 25 lb BAG"});
            data.put(7, new Object[] {"MORTAR:"});
            data.put(8, new Object[] {""});
            data.put(9, new Object[] {"", "PRICE"});
            data.put(10, new Object[] {"TROWEL"});
            data.put(11, new Object[] {""});
            data.put(12, new Object[] {"", "PRICE"});
            data.put(13, new Object[] {"GROUT FLOAT"});
            data.put(14, new Object[] {""});
            data.put(15, new Object[] {"", "PRICE"});
            data.put(16, new Object[] {"LARGE BUCKET"});
            data.put(17, new Object[] {""});
            data.put(18, new Object[] {""});
            data.put(19, new Object[] {"TILE DIMENSION 1", "TILE DIMENSION 2", "BRAND", "PRICE"});

            Set<Integer> keyset = data.keySet();

            int rownum = 0;

            for (Integer key : keyset) 
            {

                Row row1 = sheet.createRow(rownum++);

                Object [] objArr = data.get(key);

                int cellnum = 0;

                for (Object obj : objArr) 
                {
                    Cell cell1 = row1.createCell(cellnum++);

                    if(obj instanceof Date) 
                        cell1.setCellValue((Date)obj);
                    else 
                        if(obj instanceof Boolean)
                        cell1.setCellValue((Boolean)obj);
                    else 
                        if(obj instanceof String)
                        cell1.setCellValue((String)obj);
                    else 
                        if(obj instanceof Double)
                        cell1.setCellValue((Double)obj);
                }
            }

enter image description here

最佳答案

Java HashMap 没有固有的顺序。请参阅here以获得更长的答案。 为什么首先使用 map 而不只是列表?

如果你想继续使用HashMap。在迭代之前订购您的 keySet。

以下是如何获取整数键的排序列表:

List<Integer> keys = new ArrayList<>( data.keySet() );
Collections.sort( keys );

关于java - Apache POI 和 HashMap 以错误的顺序打印,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18774743/

相关文章:

java - 将 HashMap<String, String> 转换为 HashMap<String, List<String>>()

java - HashMap 对于 containsValue() 总是返回 false,

Java,字符串链表。按字母顺序插入

java - 如何将 JXLS 从版本 1 迁移到版本 2

Excel 多条件排名

Excel VBA函数采用2种不同的数据类型并循环通过类模块的集合

java - 使 map 不按任意顺序打印水果,而是按从最低到最贵的顺序打印

java - 使用 java.awt.Toolkit 捕获全局按键

java - 单向@OneToMany 关联未通过 JPA 中的相等性测试

excel - 如何使用 WSH 阅读电子表格?