簡體   English   中英

如何使工作簿(輸出流)將所有行寫入 xlsx 文件而不是僅一行?

[英]How to make workbook(outputstream) write all rows to an xlsx file instead of only one row?

我仍在研究我的文件讀取程序,但我的代碼有一些問題。 class 'file rating' 將讀取目錄中的所有文件並對其進行評級。 所有的值都給了我的“sheetWriter 類”,你可以在這里看到。 如果我打印“obj”(對象)但將它們寫入 excel 無法正常工作,則 class 會獲得正確的值 -> 它只會寫入兩行:第 1 行(“用戶可訪問”、“評級”、 “文件路徑”等)和第 2 行:(可達,45,C://blabla 等)。 所以它基本上只將一個文件寫入 xlsx。 我怎樣才能使它工作,以便將所有文件寫入 xlsx?

謝謝! (我是Java菜鳥)

public class SheetWriter {

private XSSFWorkbook workbook;
private XSSFSheet sheet;

//!! Maybe important to know: the values come from a for-loop
//from another class 'file rating': For (x : sourcefiles){ points=5  setPoints(points)  }    

public void SheetWriter(String file,String reachable, int points,String filePath,String fileName,String keywordMatch,String grootte, 
        String resolutie, String crea_date,String crea_mod,String last_acc, String authorString,String datetakenString,
        String manufactString,String modelString,String gps ) {

workbook = new XSSFWorkbook(); 
sheet = workbook.createSheet("Rating Files");

Map<String, Object[]> data = new TreeMap<String, Object[]>(); 
    data.put("1", new Object[]{"Reachable for user", "Rating", "File path","File name","Keyword","Size","Dimensions","Date_crea","Date_mod","Date_last_access",
    "Author","Date taken","Camera maker","Camera model","GPS-data"});

data.put(file, new Object[]{reachable, points,filePath,fileName,keywordMatch,grootte, resolutie, crea_date,crea_mod,last_acc,
             authorString,datetakenString,manufactString,modelString,gps});

Set<String> keyset = data.keySet(); 
    int rownum = 0; 
    for (String key : keyset) { 
        // this creates a new row in the sheet 
        Row row = sheet.createRow(rownum++);
        Object[] objArr = data.get(key); 
        int cellnum = 0;
        for (Object obj : objArr) { 
            // this line creates a cell in the next column of that row
            Cell cell = row.createCell(cellnum++);
            //System.out.println(obj);
            if (obj instanceof String) 
                cell.setCellValue((String)obj);
            else if (obj instanceof Integer) 
                cell.setCellValue((Integer)obj); 
        }

    }  //!! so here it's still OK. I can print all the obj (objects)

try { 
        sheet.autoSizeColumn(0);sheet.autoSizeColumn(1);sheet.autoSizeColumn(2);sheet.autoSizeColumn(3);
        sheet.autoSizeColumn(4);sheet.autoSizeColumn(5);sheet.autoSizeColumn(6);sheet.autoSizeColumn(7);
        sheet.autoSizeColumn(8);sheet.autoSizeColumn(9);sheet.autoSizeColumn(10);sheet.autoSizeColumn(11);
        sheet.autoSizeColumn(12);sheet.autoSizeColumn(13);sheet.autoSizeColumn(14);
         FileOutputStream out = new FileOutputStream(new File("C:/Users/user/Pictures/test.xlsx")); 
         workbook.write(out);  //!! Only writes one file to xlsx 
         out.close(); 
         workbook.close();
         System.out.println("test.xlsx is finished."); 

    } 
    catch (Exception e) { 
        e.printStackTrace(); 
    }

如果您想將多行寫入工作表並且結果只有一行,那么您可能會遇到計數器變量未正確遞增或每次迭代都完全相同的問題。

這一次,它略有不同,因為您在增強for循環中編寫(創建和設置值)行,該循環依賴於僅具有兩個條目的MapkeySet

這意味着您總是只寫這兩個條目

並非所有文件都寫入的問題可能是由外循環中的問題引起的。 我建議傳遞一個參數List<String> fileNames而不是String fileName並為此方法中的所有文件進行寫入。 否則檢查外循環。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM