如何使用 jxl api 自动调整单元格中的内容?
8 回答
我知道此时这是一个老问题,但我一直在寻找解决方案,并认为我会发布它以防其他人需要它。
我不确定为什么常见问题解答没有提到这一点,因为它非常清楚地存在于文档中。
我的代码如下所示:
for(int x=0;x<c;x++)
{
cell=sheet.getColumnView(x);
cell.setAutosize(true);
sheet.setColumnView(x, cell);
}
c
存储创建的列数单元格只是返回对象
的临时占位符
表是我的对象 CellView
WriteableSheet
Api 警告说这是一个处理器密集型功能,因此它可能不适合大文件。但是对于像我这样的小文件(<100 行),它并没有花费太多时间。
希望这可以帮助某人。
该方法是不言自明的并评论:
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);
}
}
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 文件很有帮助。
来自 JExcelApi常见问题解答
如何做 Excel 的“格式/列/自动适合选择”的等效项?
没有 API 函数可以为您执行此操作。您需要编写代码来扫描每列中的单元格,计算最大长度,然后相应地调用 setColumnView()。这将使您接近 Excel 所做的,但并不完全如此。由于大多数字体具有可变宽度字符,要获得完全相同的值,您需要使用 FontMetrics 来计算列中每个字符串的最大宽度。还没有人发布有关如何执行此操作的代码。随意将代码发布到 Yahoo! 组或直接发送到本页底部列出的常见问题解答作者。
FontMetrics 大概是指java.awt.FontMetrics。您应该能够使用我本来可以使用的 getLineMetrics(String, Graphics) 方法来解决问题。
CellView 的 autosize 方法并不总是对我有用。我这样做的方法是根据列中数据的最高长度以编程方式设置列的大小(宽度)。然后执行一些数学运算。
CellView cv = excelSheet.getColumnView(0);
cv.setSize((highest + ((highest/2) + (highest/4))) * 256);
wherehighest
是一个 int,它保存列中最长的数据长度。
如果您的单元格超过 255 个字符,setAutosize() 方法将不起作用。这与 Excel 2003 最大列宽规范有关:http: //office.microsoft.com/en-us/excel-help/excel-specifications-and-limits-HP005199291.aspx
您将需要编写自己的 autosize 方法来处理这种情况。
试试这个例子:
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);
}
}
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