Форматирование ячеек JXL

Как автоподтвердить содержимое в ячейке с помощью jxl api?

Ответ 1

Я знаю, что это старый вопрос на данный момент, но я искал решение этого вопроса и думал, что отправлю его на тот случай, если кому-то это понадобится.

CellView Auto-Size

Я не уверен, почему в FAQ не упоминается об этом, потому что он очень четко существует в документах.

Мой код выглядел следующим образом:

for(int x=0;x<c;x++)
{
    cell=sheet.getColumnView(x);
    cell.setAutosize(true);
    sheet.setColumnView(x, cell);
}

c хранит количество созданных столбцов
ячейка является лишь временным владельцем места для возвращаемого объекта CellView
лист - это мой объект WriteableSheet

Api предупреждает, что это процессорная функция, поэтому она, вероятно, не идеальна для больших файлов. Но для небольшого файла, такого как my (< 100 строк), не потребовалось заметного времени.

Надеюсь, это поможет кому-то.

Ответ 2

Метод объясняет сам и комментирует:

private void sheetAutoFitColumns(WritableSheet sheet) {
    for (int i = 0; i < sheet.getColumns(); i++) {
        Cell[] cells = sheet.getColumn(i);
        int longestStrLen = -1;

        if (cells.length == 0)
            continue;

        /* Find the widest cell in the column. */
        for (int j = 0; j < cells.length; j++) {
            if ( cells[j].getContents().length() > longestStrLen ) {
                String str = cells[j].getContents();
                if (str == null || str.isEmpty())
                    continue;
                longestStrLen = str.trim().length();
            }
        }

        /* If not found, skip the column. */
        if (longestStrLen == -1) 
            continue;

        /* If wider than the max width, crop width */
        if (longestStrLen > 255)
            longestStrLen = 255;

        CellView cv = sheet.getColumnView(i);
        cv.setSize(longestStrLen * 256 + 100); /* Every character is 256 units wide, so scale it. */
        sheet.setColumnView(i, cv);
    }
}

Ответ 3

for(int x=0;x<c;x++)
{
    cell=sheet.getColumnView(x);
    cell.setAutosize(true);
    sheet.setColumnView(x, cell);
}

Хорошо, вместо сканирования всех столбцов. Передайте столбец в качестве параметра.

void display(column) 
{ 
    Cell = sheet.getColumnView(column);
    cell.setAutosize(true);
    sheet.setColumnView(column, cell);
}

Поэтому, когда вы будете показывать свой текст, вы можете установить конкретную длину. Может быть полезно для огромных файлов excel.

Ответ 4

Из JExcelApi FAQ

Как сделать эквивалент Excel "Формат/Колонка/Выбор автоматической установки"?

Для этого нет функции API. Вам нужно будет написать код, который сканирует ячейки в каждом столбце, вычисляет максимальную длину, а затем вызывает setColumnView() соответственно. Это приблизит вас к тому, что делает Excel, но не совсем. Поскольку большинство шрифтов имеют символы переменной ширины, чтобы получить то же самое значение, вам нужно будет использовать FontMetrics для вычисления максимальной ширины каждой строки в столбце. Никто еще не опубликовал код о том, как это сделать. Не стесняйтесь публиковать код на Yahoo! группе или отправить его непосредственно автору ответов, указанному в нижней части этой страницы.

FontMetrics предположительно относится к java.awt.FontMetrics. Вы должны иметь возможность работать с методом getLineMetrics (String, Graphics), который у меня был бы.

Ответ 5

Метод autosize CellView не работает для меня все время. Мой способ сделать это - программно установить размер (ширину) столбца на основе самой большой длины данных в столбце. Затем выполните некоторые математические операции.

CellView cv = excelSheet.getColumnView(0);
cv.setSize((highest + ((highest/2) + (highest/4))) * 256);

где highest - это int, который содержит самую длинную длину данных в столбце.

Ответ 6

setAutosize() не будет работать, если ваша ячейка имеет более 255 символов. Это связано с спецификацией ширины столбца Excel 2003 max: http://office.microsoft.com/en-us/excel-help/excel-specifications-and-limits-HP005199291.aspx

Вам понадобится написать собственный метод autosize для обработки этого случая.

Ответ 7

Попробуйте этот пример:

 expandColumns(sheet, 3);

    workbook.write();
    workbook.close();

private void expandColumn(WritableSheet sheet, int amountOfColumns){
    int c = amountOfColumns;
    for(int x=0;x<c;x++)
    {
        CellView cell = sheet.getColumnView(x);
        cell.setAutosize(true);
        sheet.setColumnView(x, cell);
    }
}

Ответ 8

Реализация Kotlin

private fun sheetAutoFitColumns(sheet: WritableSheet, columnsIndexesForFit: Array<Int>? = null, startFromRowWithIndex: Int = 0, excludeLastRows : Int = 0) {
    for (columnIndex in columnsIndexesForFit?.iterator() ?: IntProgression.fromClosedRange(0, sheet.columns, 1).iterator()) {
        val cells = sheet.getColumn(columnIndex)
        var longestStrLen = -1
        if (cells.isEmpty()) continue
        for (j in startFromRowWithIndex until cells.size - excludeLastRows) {
            if (cells[j].contents.length > longestStrLen) {
                val str = cells[j].contents
                if (str == null || str.isEmpty()) continue
                longestStrLen = str.trim().length
            }
        }
        if (longestStrLen == -1) continue
        val newWidth = if (longestStrLen > 255) 255 else longestStrLen
        sheet.setColumnView(columnIndex, newWidth)
    }
}

пример для использования

sheetAutoFitColumns(sheet) // fit all columns by all rows
sheetAutoFitColumns(sheet, arrayOf(0, 3))// fit A and D columns by all rows 
sheetAutoFitColumns(sheet, arrayOf(0, 3), 5)// fit A and D columns by rows after 5 
sheetAutoFitColumns(sheet, arrayOf(0, 3), 5, 2)// fit A and D columns by rows after 5 and ignore two last rows