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 ???



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


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.



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);
            }
        }
    }
}

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.


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


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 :)


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));

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.


0

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

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


0

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

CellStyle wrapCellStyle = new_workbook.createCellStyle();
                    wrapCellStyle.setWrapText(true);

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.