Apache POI Excel - bagaimana cara mengkonfigurasi kolom yang akan diperluas?


98

Saya menggunakan Apache POI APIuntuk menghasilkan excel spreadsheetkeluaran beberapa data.

Masalah yang saya hadapi adalah ketika spreadsheet dibuat dan dibuka, kolom tidak diperluas sehingga beberapa teks panjang seperti teks berformat tanggal tidak muncul pada pandangan pertama.

Saya cukup mengklik dua kali batas kolom di excel untuk memperluas atau menyeret batas untuk menyesuaikan lebar kolom tetapi mungkin ada 20+ kolom dan tidak mungkin saya melakukannya secara manual setiap kali saya membuka spreadsheet :(

Saya menemukan (meskipun bisa menjadi metode yang salah) groupRow()dan setColumnGroupCollapsed()mungkin bisa melakukan trik tetapi tidak berhasil. Mungkin saya menggunakannya dengan cara yang salah.

Cuplikan Kode Sampel

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

Saat spreadsheet ini dibuat, string "Looooooong teks tidak muncul pertama kali" ada di dalam sel tetapi karena kolom tidak diperluas hanya "Loooooooo" yang muncul.

Bagaimana saya mengkonfigurasinya sehingga ketika saya membuka spreadsheet saya, kolomnya sudah diperluas ???



Anda tampaknya mencari cara untuk menggunakan POI untuk melakukannya. Tetapi untuk melakukannya cukup di Excel pilih seluruh lembar dan klik dua kali batas judul kolom AB. Jika Anda perlu melakukan ini pada beberapa lembar, solusi berkode dapat membantu Anda lebih baik.
rata

Jawaban:


173

Setelah Anda menambahkan semua data Anda ke lembar, Anda dapat meminta autoSizeColumn(int column)lembar Anda untuk mengisi kolom secara otomatis ke ukuran yang tepat

Berikut ini tautan ke API .

Lihat posting ini untuk referensi lebih lanjut Masalah dalam menyesuaikan ukuran sel excel dengan ukuran konten saat menggunakan apache poi


7
Hanya ingin menunjukkan bahwa autoSizeColumntidak berskala dengan baik dan akan sangat lambat jika Anda memiliki banyak baris. Saya harus sedikit meretas dan melakukan sesuatu yang mirip dengan apa yang disarankan dalam pertanyaan ini .
lbstr

8
Peringatan tentang autoSizeColumn , ini membutuhkan java Font tersedia. Ini bukan bagian dari java jre tanpa kepala yang digunakan di server dan akan menampilkan NullPointerException.
Stephen Dillon

@ StephenDillon Ada ide bagaimana memperbaiki pointer nol untuk konfigurasi font?
Veeshal

Cara terbaik yang kami temukan adalah dengan mengulang setiap baris di kolom, temukan panjang karakter terpanjang dan kalikan dengan x + tambahkan buffer. X menggunakan trial and error untuk melihat apa yang cocok tetapi harus memiliki lebar rata-rata dari karakter. Tanpa font saya tidak percaya Anda benar-benar bisa melakukannya dengan benar tetapi kami sudah cukup dekat. Jika tidak, Anda dapat menambahkan makro ke excel untuk memperbaikinya saat pertama kali pengguna membukanya, itu adalah metode terbaik tetapi mengharuskan makro diaktifkan
Stephen Dillon

45

Tips: Untuk membuat ukuran Otomatis berfungsi, panggilan ke sheet.autoSizeColumn(columnNumber)harus dilakukan setelah mengisi data ke dalam excel.

Memanggil metode sebelum mengisi data, tidak akan berpengaruh.



Jawaban yang diberikan di sini terkait dengan Java, sedangkan tautan yang disediakan di komentar terkait dengan Android. Jawabannya masih berfungsi di semua kasus Java (kecuali untuk java JRE tanpa kepala yang tidak memiliki Font java tersedia).
Unni Kris

terima kasih, saya menghitung func, dan menggunakan setColumnWidth dengan cara berikut: (5 until row.lastCellNum).forEach { colNum -> val columnWidth = (row.getCell(colNum).toString().length * 0.44 + 2.24) * 768 reportSheet.setColumnWidth(colNum, columnWidth.toInt()) }
user7856586

@ pengguna7856586 dapatkah kamu menguraikan metode ini secara lebih rinci untuk saya
Mehroz Mustafa

39

Jika Anda ingin mengubah ukuran semua kolom secara otomatis di buku kerja, berikut adalah metode yang mungkin berguna:

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

Saya mendapatkan NullPointerExceptiondi row.cellIterator(). Apakah karena saya tidak memiliki nilai di salah satu sel?
rakeeee

10

Anda dapat mencoba sesuatu seperti ini:

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

Berikut paramsnya: nomor kolom dalam sheet dan lebarnya Tetapi, satuan lebarnya cukup kecil, Anda dapat mencoba 4000 misalnya.


Senang mengetahui terima kasih! Saya pikir untuk tujuan saya di mana string kolom dapat dihasilkan secara dinamis, metode pengukuran otomatis akan cocok dalam kasus ini.
Meong


5

contoh kode di bawah ini

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

// ini penting

sheet.autoSizeColumn(0);

// argumen harus berupa nomor sel

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

Periksa outputnya dan jadi gila :)


2
sheet.setColumnWidth (columnIndex, width) juga merupakan metode yang ingin Anda lihat
Mateen

3

Jika Anda mengetahui jumlah kolom Anda (fe itu sama dengan daftar koleksi). Anda cukup menggunakan satu liner ini untuk menyesuaikan semua kolom dari satu lembar (jika Anda menggunakan setidaknya java 8):

IntStream.range(0, columnCount).forEach((columnIndex) -> sheet.autoSizeColumn(columnIndex));

1

Saya menggunakan solusi sederhana di bawah ini:

Ini adalah workbook dan sheet Anda:

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

lalu tambahkan data ke lembar Anda dengan kolom dan baris. Setelah selesai menambahkan data ke lembar tulis kode berikut ke autoSizeColumnlebar.

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

Di sini, alih-alih 15, Anda menambahkan jumlah kolom di lembar Anda.

Semoga seseorang membantu ini.


0

Sangat sederhana, gunakan kode satu baris ini dataSheet.autoSizeColumn (0)

atau berikan jumlah kolom di braket dataSheet.autoSizeColumn (nomor sel)


0

Anda juga bisa membungkus teks. Kode sampel PFB:

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

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.