Apache POI Excel - как настроить раскрытие столбцов?


102

Я использую 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. Если вам нужно сделать это для нескольких листов, вам может лучше подойти закодированное решение.
среднем

Ответы:


176

После того, как вы добавили все свои данные на лист, вы можете вызвать autoSizeColumn(int column)свой лист, чтобы автоматически подогнать столбцы до нужного размера.

Вот ссылка на API .

См. Этот пост для получения дополнительной информации. Проблема с подгонкой размера ячейки Excel к размеру содержимого при использовании apache poi.


8
Просто хотел отметить, что autoSizeColumnон плохо масштабируется и будет очень медленным, если у вас много строк. Мне пришлось немного взломать и сделать что-то похожее на то, что было предложено в этом вопросе .
lbstr

8
Предупреждение об autoSizeColumn , для этого требуется наличие шрифта java. Это не часть безголового java jre, используемого на серверах, и вызовет исключение NullPointerException.
Стивен Диллон

@StephenDillon Есть идеи, как исправить нулевой указатель для конфигурации шрифта?
Вишал

Лучший способ, который мы нашли, - это перебрать каждую строку в столбце, найти самую длинную длину символа и умножить на x + добавить буфер. X используйте метод проб и ошибок, чтобы увидеть, что подходит, но это должна быть средняя ширина символа. Я не верю, что без шрифта у вас все получится правильно, но мы подошли довольно близко. В противном случае вы можете добавить макрос в Excel, чтобы исправить все, когда пользователь открывает его в первый раз, это был лучший метод, но для этого требуется, чтобы макросы были включены
Стивен Диллон

46

Совет: чтобы автоматический размер работал, вызов sheet.autoSizeColumn(columnNumber)должен быть сделан после заполнения данных в Excel.

Вызов метода перед заполнением данных не даст никакого эффекта.


stackoverflow.com/questions/37069820/… иногда это не работает
user7856586

Приведенный здесь ответ относится к Java, тогда как ссылка в комментарии относится к Android. Ответ по-прежнему работает во всех случаях Java (за исключением безголовых java JRE, у которых нет доступного java Font).
Unni Kris

спасибо, я вычислил func и использовал 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.


Приятно знать, спасибо! Я думаю, что для моей цели, где строка столбца может генерироваться динамически, в этом случае подойдет метод автоматического изменения размера.
Meow


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) - это тоже метод, на который вы хотите взглянуть,
Матин

3

Если вы знаете количество ваших столбцов (например, оно равно списку коллекций). Вы можете просто использовать этот лайнер для настройки всех столбцов на одном листе (если вы используете хотя бы 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.