Как автоподтвердить содержимое в ячейке с помощью jxl api?
Форматирование ячеек JXL
Ответ 1
Я знаю, что это старый вопрос на данный момент, но я искал решение этого вопроса и думал, что отправлю его на тот случай, если кому-то это понадобится.
Я не уверен, почему в 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