在java中将数据写入excel的问题

时间:2013-11-28 21:57:21

标签: java excel apache-poi

我正在尝试从SQL表中提取数据并将其写入Excel工作表。

我目前正在创建一个HashMap - HashMap<Integer, ArrayList<String>> tblDataMap = new HashMap<Integer, ArrayList<String>>()并将所有数据从表写入hashmap。

当我尝试将相同的东西写入Excel时,只写入最后一列,其余列为空白。

下面是我要迭代的代码。

public String writeDataToExcel(String fileLoc, String tblName)
    {
        try{
            LisaDBUtil lisaDb = new LisaDBUtil();
            HashMap<Integer, ArrayList<String>> tblDataMap = lisaDb.getTableDetails(tblName);
            System.out.println("Map : " +tblDataMap.toString());
            XSSFWorkbook workbook = new XSSFWorkbook(); 
            XSSFSheet sheet = workbook.createSheet(tblName);

            Integer rowCount = 0;
            Integer key = 1;

            short col = 0;
            ArrayList<String> tmpArr = null;

            while(tblDataMap.containsKey(key))
            {

                tmpArr = tblDataMap.get(key);
                System.out.println("tmpArr : " +tmpArr.toString());
                for (String val : tmpArr)
                {
                    XSSFRow row = sheet.createRow(rowCount);
                    System.out.println("Cell value : " +val +"Col : " +col);
                    XSSFCell cell = row.createCell(col);
                    cell.setCellValue(val);
                    System.out.println("Cel Value set : " +cell.getColumnIndex() +cell.getRowIndex());
                    col++;
                    sheet.autoSizeColumn(col);
                }

                col = 0;
                rowCount++;
                key++;

                System.out.println("row value : " +rowCount);
            }
            DateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd");
            //get current date time with Date()
            Date date = new Date();
            System.out.println(dateFormat.format(date));
            //Write the workbook in file system
            FileOutputStream out = new FileOutputStream(new File(fileLoc+"/"+tblName+"_"+dateFormat.format(date)+".xlsx"));
            workbook.write(out);
            out.close();
            FILE_CREATION_STATUS = "success";
            System.out.println("Excel written successfully on disk.");
        } 
        catch (Exception e) 
        {
            e.printStackTrace();
        }
        return FILE_CREATION_STATUS;
    }

我能够正确设置单元格值。请在控制台日志下方找到。

Map : {1=[tdm_id, Account_No, Customer_Name, IACode, Supp_Account], 2=[1001, 9384938493, Sindhu, YW, 34545655667], 3=[1002, 9486958958, Ussanar, LLB, 656565576], 4=[1003, 8568632432, XYZ, YB, 45654654654]}
tmpArr : [tdm_id, Account_No, Customer_Name, IACode, Supp_Account]
Cell value : tdm_idCol : 0
Cel Value set : 00
Cell value : Account_NoCol : 1
Cel Value set : 10
Cell value : Customer_NameCol : 2
Cel Value set : 20
Cell value : IACodeCol : 3
Cel Value set : 30
Cell value : Supp_AccountCol : 4
Cel Value set : 40
row value : 1
tmpArr : [1001, 9384938493, Sindhu, YW, 34545655667]
Cell value : 1001Col : 0
Cel Value set : 01
Cell value : 9384938493Col : 1
Cel Value set : 11
Cell value : SindhuCol : 2
Cel Value set : 21
Cell value : YWCol : 3
Cel Value set : 31
Cell value : 34545655667Col : 4
Cel Value set : 41
row value : 2
tmpArr : [1002, 9486958958, Ussanar, LLB, 656565576]
Cell value : 1002Col : 0
Cel Value set : 02
Cell value : 9486958958Col : 1
Cel Value set : 12
Cell value : UssanarCol : 2
Cel Value set : 22
Cell value : LLBCol : 3
Cel Value set : 32
Cell value : 656565576Col : 4
Cel Value set : 42
row value : 3
tmpArr : [1003, 8568632432, XYZ, YB, 45654654654]
Cell value : 1003Col : 0
Cel Value set : 03
Cell value : 8568632432Col : 1
Cel Value set : 13
Cell value : XYZCol : 2
Cel Value set : 23
Cell value : YBCol : 3
Cel Value set : 33
Cell value : 45654654654Col : 4
Cel Value set : 43
row value : 4
2013-11-28
Excel written successfully on disk.
Status : success

正确迭代单元格并正确设置值。但是一旦生成了excel,就只有一列中有值。有人请帮忙。

1 个答案:

答案 0 :(得分:1)

似乎只是一个愚蠢的错误。 XSSFRow row = sheet.createRow(rowCount);应该在for循环之前。创建行后,您无需一次又一次地为同一行的单元格创建。每次创建单元格时,只需用新创建的空行替换同一行的先前数据。这就是为什么只出现最后一栏。

    while(tblDataMap.containsKey(key))
        {

            tmpArr = tblDataMap.get(key);
            System.out.println("tmpArr : " +tmpArr.toString());
            // for all the column of same row, you just need to create row only once
            XSSFRow row = sheet.createRow(rowCount);
            for (String val : tmpArr)
            {
                System.out.println("Cell value : " +val +"Col : " +col);
                XSSFCell cell = row.createCell(col);
                cell.setCellValue(val);
                System.out.println("Cel Value set : " +cell.getColumnIndex() +cell.getRowIndex());
                col++;
                sheet.autoSizeColumn(col);
            }

            col = 0;
            rowCount++;
            key++;

            System.out.println("row value : " +rowCount);
        }