JXL单元格格式

时间:2009-11-03 05:23:24

标签: jxl

如何使用jxl api在单元格中自动调整内容?

8 个答案:

答案 0 :(得分:42)

我知道这是一个古老的问题,但我一直在寻找解决方案,并认为我会发布它以防其他人需要它。

CellView Auto-Size

我不确定为什么FAQ没有提到这一点,因为它在文档中非常清楚。

我的代码如下所示:

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

c存储创建的列数
单元格只是返回的CellView对象的临时占位符 sheet是我的WriteableSheet对象

Api警告说这是一个处理器密集型功能,所以它可能不适合大文件。但对于像我这样的小文件(<100行),它没有花费明显的时间。

希望这有助于某人。

答案 1 :(得分:13)

该方法是自我解释并评论:

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

答案 2 :(得分:6)

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文件提供帮助。

答案 3 :(得分:2)

来自JExcelApi FAQ

  

如何进行Excel的“格式/列/自动调整选择”等效?

     

没有API函数可以为您执行此操作。您需要编写扫描每列中单元格的代码,计算最大长度,然后相应地调用setColumnView()。这将使您接近Excel的功能但不完全正确。由于大多数字体具有可变宽度字符,因此要获得完全相同的值,您需要使用FontMetrics计算列中每个字符串的最大宽度。没有人发布过如何做到这一点的代码。随意将代码发布到Yahoo!分组或直接发送到本页底部列出的FAQ作者。

FontMetrics可能是指java.awt.FontMetrics。您应该可以使用我将拥有的getLineMetrics(String,Graphics)方法来解决问题。

答案 4 :(得分:2)

CellView的自动调整方法对我一直不起作用。我这样做的方法是根据列中最大的数据长度以编程方式设置列的大小(宽度)。然后执行一些数学运算。

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

其中highest是一个int,它保存列中最长的数据长度。

答案 5 :(得分:1)

如果您的单元格超过255个字符,

setAutosize()方法将无效。这与Excel 2003最大列宽规范相关:http://office.microsoft.com/en-us/excel-help/excel-specifications-and-limits-HP005199291.aspx

您需要编写自己的自动调整大小方法来处理这种情况。

答案 6 :(得分:0)

试试这个例子:

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

答案 7 :(得分:0)

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