Apache POI Excel - làm thế nào để cấu hình các cột được mở rộng?


98

Tôi đang sử dụng Apache POI APIđể tạo excel spreadsheetra một số dữ liệu.

Vấn đề tôi đang phải đối mặt là khi bảng tính được tạo và mở, các cột không được mở rộng để một số văn bản dài như văn bản có định dạng Ngày không hiển thị ngay từ đầu.

Tôi chỉ có thể nhấp đúp vào đường viền cột trong excel để mở rộng hoặc kéo đường viền để điều chỉnh chiều rộng cột nhưng có thể có hơn 20 cột và không có cách nào tôi muốn làm điều đó theo cách thủ công mỗi khi tôi mở bảng tính :(

Tôi đã phát hiện ra (mặc dù có thể là phương pháp sai) groupRow()setColumnGroupCollapsed()có thể làm được thủ thuật nhưng không may mắn. Có lẽ tôi đang sử dụng nó sai cách.

Đoạn mã mẫu

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

Khi bảng tính này được tạo, chuỗi "Looooooong văn bản không hiển thị đầu tiên" nằm trong ô nhưng vì cột không được mở rộng nên chỉ có "Loooooooo" mới hiển thị.

Làm cách nào để định cấu hình nó để khi tôi mở bảng tính của mình, cột đã được mở rộng ???



Có vẻ như bạn đang tìm cách sử dụng POI để thực hiện điều này. Nhưng để làm điều đó đơn giản trong Excel, hãy chọn toàn bộ trang tính và nhấp đúp vào ranh giới tiêu đề cột AB. Nếu bạn cần làm điều này với một số trang tính, một giải pháp mã hóa có thể phục vụ bạn tốt hơn.
trung bình

Câu trả lời:


173

Sau khi bạn đã thêm tất cả dữ liệu của mình vào trang tính, bạn có thể gọi autoSizeColumn(int column)trên trang tính của mình để tự động điều chỉnh các cột về kích thước phù hợp

Đây là một liên kết đến API .

Xem bài đăng này để tham khảo thêm Vấn đề trong việc điều chỉnh kích thước ô excel với kích thước của nội dung khi sử dụng apache poi


7
Chỉ muốn chỉ ra rằng autoSizeColumnkhông quy mô tốt và sẽ là siêu chậm nếu bạn có rất nhiều hàng. Tôi đã phải có một chút hacky và làm điều gì đó tương tự như những gì được đề xuất trong câu hỏi này .
lbstr

8
Cảnh báo về autoSizeColumn , điều này yêu cầu có sẵn Phông chữ java. Đây không phải là một phần của java jre không đầu được sử dụng trên máy chủ và sẽ ném ra một NullPointerException.
Stephen Dillon

@StephenDillon Bất kỳ ý tưởng nào về cách sửa chữa con trỏ null cho cấu hình phông chữ?
Veeshal

Cách tốt nhất mà chúng tôi tìm thấy là lặp lại từng hàng trong cột, tìm độ dài ký tự dài nhất và nhân với x + thêm một bộ đệm. X sử dụng thử và sai để xem những gì phù hợp nhưng nó phải là chiều rộng trung bình của một ký tự. Nếu không có phông chữ, tôi không tin rằng bạn thực sự có thể làm đúng nhưng chúng ta đã đến khá gần. Nếu không, bạn có thể thêm một macro để excel để sửa chữa nó tất cả lần đầu tiên người dùng mở nó, đó là phương pháp tốt nhất nhưng đòi hỏi các macro được kích hoạt
Stephen Dillon

45

Mẹo: Để kích thước Tự động hoạt động, lệnh gọi sheet.autoSizeColumn(columnNumber)phải được thực hiện sau khi điền dữ liệu vào excel.

Việc gọi phương thức trước khi điền dữ liệu sẽ không có tác dụng.


stackoverflow.com/questions/37069820/... đôi khi điều đó không làm việc
user7856586

Câu trả lời được cung cấp ở đây liên quan đến Java, trong khi liên kết được cung cấp trong nhận xét có liên quan đến Android. Câu trả lời vẫn hoạt động trong tất cả các trường hợp Java (ngoại trừ các JRE java không đầu không có sẵn Phông chữ java).
Unni Kris

cảm ơn, tôi tính func, và đã qua sử dụng setColumnWidth theo cách sau: (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 bạn có thể giải thích phương pháp này chi tiết hơn một chút cho tôi không
Mehroz Mustafa

39

Nếu bạn muốn tự động định kích thước tất cả các cột trong sổ làm việc, đây là một phương pháp có thể hữu ích:

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

Tôi đang nhận được NullPointerExceptiontại row.cellIterator(). Có phải vì tôi không có giá trị trong một ô?
rakeeee

10

Bạn có thể thử một cái gì đó như sau:

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

Dưới đây là các thông số: số cột trong trang tính và chiều rộng của nó Nhưng đơn vị chiều rộng khá nhỏ, bạn có thể thử 4000 chẳng hạn.


Tốt để biết cảm ơn! Tôi nghĩ rằng vì mục đích của tôi, trong đó chuỗi cột có thể được tạo động, phương pháp định cỡ tự động sẽ phù hợp trong trường hợp này.
Meow


5

mã mẫu bên dưới

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

// cái này rất quan trọng

sheet.autoSizeColumn(0);

// đối số phải là số ô

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

Kiểm tra đầu ra và đi


2
sheet.setColumnWidth (columnIndex, chiều rộng) cũng là một phương pháp mà bạn muốn có một cái nhìn tại
Mateen

3

Nếu bạn biết số lượng các cột của mình (ví dụ nó bằng một danh sách tập hợp). Bạn chỉ cần sử dụng một lớp lót này để điều chỉnh tất cả các cột của một trang tính (nếu bạn sử dụng ít nhất java 8):

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

1

Tôi sử dụng giải pháp đơn giản dưới đây:

Đây là sổ làm việc và trang tính của bạn:

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

sau đó thêm dữ liệu vào trang tính của bạn với các cột và hàng. Sau khi thực hiện xong với việc thêm dữ liệu vào trang tính, hãy viết mã sau theo autoSizeColumnchiều rộng.

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

Ở đây, thay vì 15, bạn thêm số cột trong trang tính của mình.

Hy vọng ai đó giúp điều này.


0

Rất đơn giản, hãy sử dụng một dòng mã dataSheet.autoSizeColumn (0)

hoặc cung cấp số cột trong ngoặc dataSheet.autoSizeColumn (số ô)


0

Bạn cũng có thể bọc văn bản. Mã mẫu PFB:

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

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.