Apache POI Excel - як налаштувати стовпці для розширення?


98

Я використовую Apache POI APIдля створення excel spreadsheetдля виведення деяких даних.

Проблема, з якою я стикаюся, полягає в тому, що електронну таблицю створюють та відкривають, стовпці не розширюються, щоб якийсь довгий текст, наприклад текст у форматі дати, не відображався на перший погляд.

Я міг просто двічі клацнути межу стовпця в Excel, щоб розширити або перетягнути межу, щоб відрегулювати ширину стовпця, але може бути більше 20 стовпців, і я ніяк не хочу робити це вручну кожного разу, коли відкриваю електронну таблицю :(

Я дізнався (хоча це може бути неправильним методом) groupRow()і, setColumnGroupCollapsed()можливо, зміг би зробити трюк, але не пощастило. Можливо, я використовую це неправильно.

Зразок фрагмента коду

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

Коли ця електронна таблиця створена, рядок "Looooooong текст не з’являється спочатку" знаходиться в комірці, але оскільки стовпець не розширюється, відображається лише "Loooooooo".

Як я можу налаштувати його так, що коли я відкриваю свою електронну таблицю, стовпець уже розширений ???



Ви, здається, шукаєте спосіб використовувати POI для досягнення цього. Але для цього просто в Excel виберіть весь аркуш і двічі клацніть межу заголовка стовпця AB. Якщо вам потрібно зробити це на декількох аркушах, закодований розчин може вам допомогти.
серп

Відповіді:


174

Після того, як ви додали всі свої дані до аркуша, ви можете зателефонувати autoSizeColumn(int column)на свій аркуш, щоб автоматично встановити стовпці до потрібного розміру

Ось посилання на API .

Дивіться цю публікацію для отримання додаткової довідки Проблема підбору розміру комірки Excel до розміру вмісту при використанні apache poi


8
Просто хотілося б відзначити, що autoSizeColumnНЕ дуже добре масштабується і буде супер повільним , якщо у вас є багато рядків. Мені довелося трохи здивуватись і зробити щось подібне до того, що пропонувалось у цьому питанні .
lbstr

8
Попередження про autoSizeColumn , для цього потрібен доступний шрифт Java. Це не частина безголового jare jre, який використовується на серверах, і призведе до NullPointerException.
Стівен Діллон,

@StephenDillon Будь-яка ідея, як виправити нульовий покажчик для конфігурації шрифту?
Veeshal

Найкращий спосіб, який ми знайшли, - прокрутити кожен рядок у колі, знайти найдовшу довжину символу та помножити на x +, додати буфер. X використовуйте пробну помилку та помилку, щоб побачити, що підходить, але це має бути середня ширина знака. Без шрифту я не вірю, що ти насправді можеш правильно зрозуміти, але ми зблизимось. В іншому випадку ви можете додати макрос до excel, щоб виправити це все в перший раз, коли користувач відкриває його, це був найкращий метод, але вимагає включення макросів
Stephen Dillon

45

Порада: Щоб автоматичний розмір працював, дзвінок sheet.autoSizeColumn(columnNumber)потрібно робити після заселення даних у програму excel.

Виклик методу перед заповненням даних не матиме ефекту.


stackoverflow.com/questions/37069820/… інколи це не працює
user7856586

Надана тут відповідь стосується Java, тоді як посилання, надане в коментарі, стосується Android. Відповідь все ще працює у всіх випадках Java (за винятком JRE безголових JRE, у яких немає шрифту Java).
Унні Кріс

дякую, я порахував функцію і використав setColumnWidth наступним чином: (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 може розробити цей метод трохи детальніше для мене
Мехроз Мустафа

39

Якщо ви хочете автоматично встановити розмір усіх стовпців у книзі, ось такий метод може бути корисним:

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

Я отримую NullPointerExceptionв row.cellIterator(). Це тому, що я не маю значення в одній з комірок?
rakeeee

10

Ви можете спробувати щось подібне:

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

Ось параметри: номер стовпця в аркуші та його ширина. Але одиниці ширини досить малі, ви можете спробувати 4000, наприклад.


Приємно знати спасибі! Я думаю, що для моєї мети, коли рядок стовпців може генеруватися динамічно, метод автоматичного розміру поміститься у випадку.
Мяу


5

зразок коду нижче

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

// це має вирішальне значення

sheet.autoSizeColumn(0);

// аргумент повинен бути номером комірки

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

Перевірте висновок і перейдіть :)


2
sheet.setColumnWidth (columnIndex, width) - це також метод, на який ви хочете ознайомитися
Mateen

3

Якщо ви знаєте кількість ваших стовпців (fe це дорівнює списку колекцій). Ви можете просто скористатися цим вкладишем для налаштування всіх стовпців одного аркуша (якщо ви використовуєте принаймні java 8):

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

1

Я використовую нижче просте рішення:

Це ваша робоча книга та аркуш:

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

потім додайте дані до свого аркуша зі стовпцями та рядками. Після додавання даних на аркуш напишіть наступний код на autoSizeColumnширину.

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

Тут замість 15 ви додаєте кількість стовпців на своєму аркуші.

Сподіваюся, хтось допомагає цьому.


0

Це дуже просто, використовуйте цей однорядковий код dataSheet.autoSizeColumn (0)

або вкажіть номер стовпця в дужці dataSheet.autoSizeColumn (номер комірки)


0

Ви також можете обернути текст. Зразок коду PFB:

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

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.