Apache POI Excel - jak skonfigurować kolumny do rozwinięcia?

102

Używam Apache POI APIdo generowania excel spreadsheetdanych.

Problem, z którym się spotykam, polega na tym, że po utworzeniu i otwarciu arkusza kalkulacyjnego kolumny nie są rozwinięte, więc na pierwszy rzut oka nie pojawia się jakiś długi tekst, taki jak tekst sformatowany w formacie daty.

Mógłbym po prostu dwukrotnie kliknąć obramowanie kolumny w programie Excel, aby rozwinąć lub przeciągnąć obramowanie, aby dostosować szerokość kolumny, ale może być ponad 20 kolumn i nie ma możliwości, aby robić to ręcznie za każdym razem, gdy otwieram arkusz kalkulacyjny :(

Dowiedziałem się (chociaż może to być zła metoda) groupRow()i setColumnGroupCollapsed()może uda mi się załatwić sprawę, ale bez powodzenia. Może używam go w niewłaściwy sposób.

Przykładowy fragment kodu

        Workbook wb = new HSSFWorkbook();
        CreationHelper createHelper = wb.getCreationHelper();
        //create sheet
        Sheet sheet = wb.createSheet("masatoSheet");

        //not really working yet.... :(
        //set group for expand/collapse
        //sheet.groupRow(0, 10); //just random fromRow toRow argument values...
        //sheet.setColumnGroupCollapsed(0, true);

        //create row
        Row row = sheet.createRow((short)0);
        //put a cell in the row and store long text data
        row.createCell(0).setCellValue("Loooooooong text not to show up first");

Po utworzeniu tego arkusza kalkulacyjnego w komórce znajduje się ciąg „Looooooong tekst, który nie jest wyświetlany jako pierwszy”, ale ponieważ kolumna nie jest rozwinięta, pojawia się tylko „Loooooooo”.

Jak mogę to skonfigurować, aby po otwarciu arkusza kalkulacyjnego kolumna była już rozwinięta ???

Miauczeć
źródło
Wygląda na to, że szukasz sposobu wykorzystania POI, aby to osiągnąć. Ale aby to zrobić po prostu w programie Excel, zaznacz cały arkusz i kliknij dwukrotnie granicę nagłówka kolumny AB. Jeśli musisz to zrobić dla kilku arkuszy, zakodowane rozwiązanie może ci lepiej służyć.
śr.

Odpowiedzi:

176

Po dodaniu wszystkich danych do arkusza możesz wywołać autoSizeColumn(int column)w arkuszu automatyczne dopasowanie kolumn do odpowiedniego rozmiaru

Oto link do interfejsu API .

Zobacz ten post, aby uzyskać więcej informacji. Problem z dopasowaniem rozmiaru komórki programu Excel do rozmiaru zawartości podczas korzystania z apache poi

Sean
źródło
8
Chciałem tylko zaznaczyć, że autoSizeColumnnie skaluje się dobrze i będzie bardzo powolny, jeśli masz wiele rzędów. Musiałem trochę się zepsuć i zrobić coś podobnego do tego, co zostało zasugerowane w tym pytaniu .
lbstr
8
Ostrzeżenie o autoSizeColumn , wymaga to dostępności czcionki java. Nie jest to część bezgłowego środowiska Java Jre używanego na serwerach i spowoduje zgłoszenie wyjątku NullPointerException.
Stephen Dillon
@StephenDillon Masz pomysł, jak naprawić zerowy wskaźnik do konfiguracji czcionek?
Veeshal
Najlepszym sposobem, jaki znaleźliśmy, było wykonanie pętli po każdym wierszu kolumny, znalezienie najdłuższej długości znaku i pomnożenie przez x + dodanie bufora. X używa prób i błędów, aby zobaczyć, co pasuje, ale powinna to być średnia szerokość znaku. Nie wierzę, że bez czcionki można to zrobić dobrze, ale jesteśmy bardzo blisko. W przeciwnym razie możesz dodać makro do programu Excel, aby naprawić to za pierwszym razem, gdy użytkownik go otworzy, to była najlepsza metoda, ale wymaga włączenia makr
Stephen Dillon
46

Wskazówka: aby rozmiar automatyczny działał, wywołanie sheet.autoSizeColumn(columnNumber)należy wykonać po wypełnieniu danych w programie Excel.

Wywołanie metody przed wypełnieniem danych nie przyniesie żadnego efektu.

Unni Kris
źródło
stackoverflow.com/questions/37069820/ ... czasami to nie działa
user7856586
Podana tutaj odpowiedź dotyczy Javy, natomiast link podany w komentarzu dotyczy Androida. Odpowiedź nadal działa we wszystkich przypadkach Java (z wyjątkiem bezgłowych środowisk JRE Java, które nie mają dostępnej czcionki java).
Unni Kris
dzięki, obliczyłem func i użyłem setColumnWidth w następujący sposób: (5 until row.lastCellNum).forEach { colNum -> val columnWidth = (row.getCell(colNum).toString().length * 0.44 + 2.24) * 768 reportSheet.setColumnWidth(colNum, columnWidth.toInt()) }
user7856586
@ user7856586 czy możesz uściślić dla mnie tę metodę bardziej szczegółowo
Mehroz Mustafa
39

Jeśli chcesz automatycznie zmienić rozmiar wszystkich kolumn w skoroszycie, oto metoda, która może być przydatna:

public void autoSizeColumns(Workbook workbook) {
    int numberOfSheets = workbook.getNumberOfSheets();
    for (int i = 0; i < numberOfSheets; i++) {
        Sheet sheet = workbook.getSheetAt(i);
        if (sheet.getPhysicalNumberOfRows() > 0) {
            Row row = sheet.getRow(sheet.getFirstRowNum());
            Iterator<Cell> cellIterator = row.cellIterator();
            while (cellIterator.hasNext()) {
                Cell cell = cellIterator.next();
                int columnIndex = cell.getColumnIndex();
                sheet.autoSizeColumn(columnIndex);
            }
        }
    }
}
Ondrej Kvasnovsky
źródło
Dostaję NullPointerExceptionco row.cellIterator(). Czy to dlatego, że nie mam wartości w jednej z komórek?
rakeeee
10

Możesz spróbować czegoś takiego:

HSSFSheet summarySheet = wb.createSheet();
summarySheet.setColumnWidth(short column, short width);

Tutaj parametry to: numer kolumny w arkuszu i jej szerokość Ale jednostki szerokości są dość małe, możesz na przykład spróbować 4000.

UVM
źródło
Dobrze wiedzieć, dziękuję! Myślę, że dla mojego celu, w którym ciąg kolumn może być generowany dynamicznie, metoda automatycznego określania rozmiaru pasowałaby do przypadku.
Miau
8

Dla Excel POI:

sheetName.autoSizeColumn(cellnum); 
Adnan Ghaffar
źródło
5

przykładowy kod poniżej

HSSFWorkbook wb = new HSSFWorkbook();
HSSFSheet sheet = wb.createSheet("your sheet name");
HSSFRow row = sheet.createRow(0);

cell = row.createCell(0);
cell.setCellValue("A BIG NAME WITH AUTO SIZE FEATURE ENABLED");

// to jest kluczowe

sheet.autoSizeColumn(0);

// argument musi być numerem komórki

cell = row.createCell(1);
cell.setCellValue("a big name without auto size feature enabled");

Sprawdź wyjście i zwariuj :)

Mateen
źródło
2
sheet.setColumnWidth (columnIndex, width) to także metoda, której chcesz się przyjrzeć
Mateen
3

Jeśli znasz liczbę swoich kolumn (np. Jest to lista kolekcji). Możesz po prostu użyć tej jednej wkładki, aby dostosować wszystkie kolumny jednego arkusza (jeśli używasz przynajmniej Java 8):

IntStream.range(0, columnCount).forEach((columnIndex) -> sheet.autoSizeColumn(columnIndex));
kłapnięcie
źródło
1

Używam poniżej prostego rozwiązania:

Oto Twój skoroszyt i arkusz:

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

następnie dodaj dane do arkusza z kolumnami i wierszami. Po dodaniu danych do arkusza wpisz następujący kod do autoSizeColumnszerokości.

for (int columnIndex = 0; columnIndex < 15; columnIndex++) {
                    sheet.autoSizeColumn(columnIndex);
                }

Tutaj zamiast 15 dodajesz liczbę kolumn w arkuszu.

Mam nadzieję, że ktoś w tym pomoże.

Rahul Mahadik
źródło
0

Jest to bardzo proste, użyj tego jednowierszowego kodu dataSheet.autoSizeColumn (0)

lub podaj liczbę kolumn w nawiasie dataSheet.autoSizeColumn (numer komórki)

Muhammad Faisal Shahzad
źródło
0

Możesz również zawinąć tekst. Przykładowy kod PFB:

CellStyle wrapCellStyle = new_workbook.createCellStyle();
                    wrapCellStyle.setWrapText(true);
Akash
źródło
-1

Możesz użyć, setColumnWidth()jeśli chcesz bardziej rozszerzyć swoją komórkę.

Francis Gabriel Rodriguez
źródło