2013-04-01 12 views
5

Tworzę program, który zapisuje informacje do pliku Excela za pomocą apache poi. Po wprowadzeniu wszystkich moich danych do pliku, wywołuję metodę autoSizeColumn w każdej kolumnie pliku. Ale zmienia rozmiar kolumn na szerokość ostatnio wprowadzonej komórki, która nie jest czasami tak duża, jak inne komórki w kolumnie. Wiem, że używam go poprawnie i niestety nie mam teraz Internetu, aby opublikować dowolny kod, ale zaktualizuję go, kiedy będę mógł.Apache POI autoSizeColumn() nie działa poprawnie

Ok mam nadzieję Używam tagi kodu rację, ale tutaj jest:

public void writeFile() { 
    Workbook wb = new HSSFWorkbook(); 
    Sheet s = wb.createSheet(); 
    try { 

     FileOutputStream out = new FileOutputStream(
       this.getSelectedFile()); 
     // create a new workbook 

     // create a new sheet 

     // declare a row object reference 
     Row r = null; 
     // declare a cell object reference 
     Cell c = null; 
     // in case of plain ascii 
     wb.setSheetName(0, "Street Light Report"); 
     // create a sheet with 30 rows (0-29) 
     // int rownum; 
     // short rownum; 
     // PrintWriter printOut = new PrintWriter(
     // this.getSelectedFile()); 
     String[] colName = { "Light Id", "Flagged", 
       "Malfunction", "Comments", "Location", "Date" }; 
     // printOut.println("Light Id,Flagged,Malfunction,Comments,Location,Date"); 
     Connections.connect(); 
     String[][] data = Connections.searchForFlagged(); 
     for (int i = 0; i < data.length; i++) { 
      r = s.createRow(i); 
     } 
     r.setRowNum(0); 
     for (int j = 0; j < 6; j++) { 
      c = r.createCell(j); 
      switch (j) { 
      case 0: 
       c.setCellValue(colName[j]); 
       break; 
      case 1: 
       c.setCellValue(colName[j]); 
       break; 
      case 2: 
       c.setCellValue(colName[j]); 
       break; 
      case 3: 
       c.setCellValue(colName[j]); 
       break; 
      case 4: 
       c.setCellValue(colName[j]); 
       break; 
      case 5: 
       c.setCellValue(colName[j]); 
       break; 

      } 
     } 

     for (int i = 0; i < data.length; i++) { 

      r.setRowNum(i + 1); 
      for (int j = 0; j < data[i].length; j++) { 

       c = r.createCell(j); 

       // System.out.println(data[i][j]); 

       switch (j) { 
       case 0: 
        c.setCellType(Cell.CELL_TYPE_NUMERIC); 
        c.setCellValue(Integer.parseInt(data[i][j])); 
        break; 
       case 1: 
        if (data[i][j].equals("true")) 
         c.setCellValue("Yes"); 
        else 
         c.setCellValue("No"); 
        break; 
       case 2: 
        if (data[i][j].equals("I")) 
         c.setCellValue("Intermittent"); 
        else 
         c.setCellValue("Not Functional"); 
        break; 
       case 3: 
        c.setCellValue(data[i][j]); 
        break; 
       case 4: 
        c.setCellValue(data[i][j]); 
        break; 
       case 5: 
        c.setCellValue(data[i][j]); 
        break; 
       } 

      } 
     } 
           wb.getSheetAt(0).setPrintGridlines(true); 
     for (int j = 0; j < 6; j++) { 
      s.autoSizeColumn(j); 
     } 
     wb.write(out); 
     out.close(); 
    } catch (Exception ex) { 

    } 
}; 

Chciałbym zamieścić zdjęcie tutaj, ale muszę rep. punkt i właśnie zacząłem tutaj.

** Należy pamiętać, że klasa jest klasą Połączenia JDBC tak, że Java może wyciągnąć informacje od th bazy mysql zwraca 2D tablicę ciągów **

+1

Będziemy czekać na Twój kod. – javadev

+0

Kod ok został przesłany –

+0

Zobacz odpowiedź na [to pytanie] (http://stackoverflow.com/questions/16943493/apache-poi-autosizecolumn-resizes- incorrectorly). – scaevity

Odpowiedz

8

Wystarczy przesunąć wywołanie

sheet.autoSizeColumn(columnNumber); 

do punktu w kodzie po dodaniu danych.

Tu jest link do API

To jedyny sposób, aby to zrobić. Miałem ten sam problem, nazwałem metodę autoSizeColumn() zanim wprowadziłem dane. Hop to pomogło

+0

Metoda autoSizeColumn() jest następująca po wprowadzeniu wszystkich danych i działa po prostu autosizes do szerokości ostatniej komórce –

+0

próbuję umieścić ją po zdefiniowanych kolumnach i przed komórkami – knowbody

+0

Przepraszam za doświadczenie z POI, ale nie definiujesz kolumn tylko wiersze arkuszy i komórki w prawo? –

1

przesunąć do pętli:

for (int j = 0; j < 6; j++) { 
        s.autoSizeColumn(j); 
       } 

być właśnie zanim napiszesz w skoroszycie i zamknąć na zewnątrz obiektu.

wb.write(out); 
+0

Ok Przeniosłem go, ale nadal wyniki są takie same. Nie wiem, jak opublikować kod w polu komentarza, ale źle umieścić go na górze. –

+0

Więc nic więcej dodać? –

3

Należy pamiętać, że wygenerowanie dużego raportu s.autoSizeColumn(j); spowolni działanie.

+1

Jest to ważna informacja, znacznie obniża wydajność! – NinaNa